JAVA设计模式温故篇-装饰者模式

来源:互联网 发布:淘宝几块钱的东西包邮 编辑:程序博客网 时间:2024/06/08 06:27

如果大家知道cosplay的话,会发现cosplay扮演者总是利用服装、饰品、道具以及化妆来把自己扮演动漫作品、游戏中的角色。

可能我们第一眼看到下面这张图片就会说是路飞,而实际上他是一个普通人,只是把自己装饰成了路飞。而JAVA中的装饰者模式也是有异曲同工之妙。接下来举个列子


我们生活中有原味茶,奶茶,珍珠奶茶,而奶茶只是在原味茶的基础上添加了牛奶作为装饰,而实际上还是茶,珍珠奶茶也只是在奶茶的基础上加了珍珠作为装饰,实际上还是茶。

虽然都是茶,但是他们的价格和叫法都不一样。

牛奶和珍珠则作为装饰者,但他们离不开茶作为基础。

我们定义原味茶:3元

加牛奶:多加2元

加珍珠:多加2元


首先定义一个茶的基类Beverage

代码:

package com.hpg.demo;/** * 定义饮料类 包括饮料描述和价格 * @author huarizhong * */public abstract class Beverage {String description = "Unknow Beverage";public String getDescription(){return description;}public abstract double cost();}

定义一个装饰者的基类CondimentDecorate

代码:

package com.hpg.demo;/** * 装饰者类,在饮料的基础上加了一些佐料,实际上也是饮料 * @author huarizhong * */public abstract class CondimentDecorate extends Beverage {public abstract String getDescription();}

定义原味茶,继承自Bevage

package com.hpg.demo;/** * 原味饮料(茶) 3元 * @author huarizhong * */public class Tea extends Beverage{public Tea(){description = "Tea";}@Overridepublic double cost() {return 3;}}

定义装饰者牛奶,继承自CondimentDecorate

代码:

package com.hpg.demo;/** * 装饰者(牛奶佐料)加牛奶需要额外2元 * @author huarizhong * */public class Milk extends CondimentDecorate{private Beverage mBeverage;public Milk(Beverage beverage){this.mBeverage= beverage;}@Overridepublic String getDescription() {return "Milk-"+mBeverage.getDescription();}@Overridepublic double cost() {return 2+mBeverage.cost();}}

定义装饰者珍珠,继承自CondimentDecorate

代码:

package com.hpg.demo;/** * 装饰者(珍珠) 加珍珠需要额外2元 *  * @author huarizhong *  */public class Pearl extends CondimentDecorate {private Beverage mBeverage;public Pearl(Beverage beverage) {this.mBeverage = beverage;}@Overridepublic String getDescription() {return "Pearl-" + mBeverage.getDescription();}@Overridepublic double cost() {return 2 + mBeverage.cost();}}

测试类

package com.hpg.demo;public class TestMain {public static void main(String args[]){//原味茶Beverage tea =new Tea();System.out.println(tea.getDescription()+" ¥"+tea.cost());//奶茶,用牛奶装饰茶Beverage milkTea = new Milk(tea);System.out.println(milkTea.getDescription()+" ¥"+milkTea.cost());//珍珠奶茶,用珍珠装饰奶茶Beverage pearlMilkTea = new Pearl(milkTea);System.out.println(pearlMilkTea.getDescription()+" ¥"+pearlMilkTea.cost());}}


运行结果


Tea ¥3.0
Milk-Tea ¥5.0
Pearl-Milk-Tea ¥7.0













0 0
原创粉丝点击