装饰者模式
来源:互联网 发布:python 执行adb 编辑:程序博客网 时间:2024/06/06 00:12
类图:
/** * 饮料的抽象类 */public abstract class Beverage {protected String description = "Unknown Beverage";public String getDescription() {return description;}/**计算总价格的方法*/public abstract double cost();}
/** * 饮料的子类 -》深培咖啡 */public class DarkRoast extends Beverage {public DarkRoast() {description = "DarkRoast";}@Overridepublic double cost() {// TODO Auto-generated method stubreturn 0.99;}}
/** *饮料的子类-》浓缩咖啡 */public class Espresso extends Beverage {public Espresso() {description = "Espresso";}/** * @see com.tj.decorator.Beverage#cost() */@Overridepublic double cost() {// TODO Auto-generated method stubreturn 1.99;}}
/** * 饮料的子类-》混合咖啡 */public class HouseBlend extends Beverage {private Beverage be;public HouseBlend( ) {this.be=be;description = "House Blend Coffee";}/** * @see com.tj.decorator.Beverage#cost() */@Overridepublic double cost() {// TODO Auto-generated method stubreturn 0.89;}}
/**装饰者类*/public abstract class CondimentDecorator extends Beverage {}
/** *摩卡-》装饰类 */public class Mocha extends CondimentDecorator {Beverage beverage;public Mocha(Beverage beverage) {this.beverage = beverage;}/** * @see com.tj.decorator.CondimentDecorator#getDescription() */@Overridepublic String getDescription() {// TODO Auto-generated method stubreturn beverage.getDescription() + ", Mocha";}/** * @see com.tj.decorator.Beverage#cost() */@Overridepublic double cost() {// TODO Auto-generated method stubreturn 0.20 + beverage.cost();}}
/** *豆浆 -》装饰类 */public class Soy extends CondimentDecorator {Beverage beverage;public Soy(Beverage beverage) {this.beverage = beverage;}/** * @see com.tj.decorator.CondimentDecorator#getDescription() */@Overridepublic String getDescription() {// TODO Auto-generated method stubreturn beverage.getDescription() + ", Soy";}/** * @see com.tj.decorator.Beverage#cost() */@Overridepublic double cost() {return 0.15 + beverage.cost();}}
/** *奶泡 -》装饰类 */public class Whip extends CondimentDecorator {Beverage beverage;public Whip(Beverage beverage) {this.beverage = beverage;}/** * @see com.tj.decorator.CondimentDecorator#getDescription() */@Overridepublic String getDescription() {// TODO Auto-generated method stubreturn beverage.getDescription() + ", Whip";}/** * @see com.tj.decorator.Beverage#cost() */@Overridepublic double cost() {// TODO Auto-generated method stubreturn 0.10 + beverage.cost();}}
测试类:
public class Test {public static void main(String[] args) {System.out.println("-------单个物品-------");Beverage beverage = new Espresso();// 饮料 1.99System.out.println(beverage.getDescription() + " $" + beverage.cost());System.out.println("-----装饰3个物品的方式之一---------");Beverage beverage2 = new DarkRoast();// 饮料 0.99beverage2 = new Mocha(beverage2);// 装饰者子类 0.2beverage2 = new Mocha(beverage2);// 装饰者子类 0.2beverage2 = new Whip(beverage2);// 装饰者子类 0.1beverage2.cost();System.out.println(beverage2.getDescription() + " $" + beverage2.cost());System.out.println("-----装饰3个物品的方式之一---------");Mocha mocha = new Mocha(new Mocha(new Whip(new DarkRoast())));System.out.println(mocha.getDescription() + " $" + mocha.cost());System.out.println("-----装饰3个物品的方式之一---------");Beverage beverage3 = new HouseBlend();beverage3 = new Soy(beverage3);beverage3 = new Mocha(beverage3);beverage3 = new Whip(beverage3);System.out.println(beverage3.getDescription() + " $" + beverage3.cost());}}
输出日志:-------单个物品-------Espresso $1.99-----装饰3个物品的方式之一---------DarkRoast, Mocha, Mocha, Whip $1.49-----装饰3个物品的方式之一---------DarkRoast, Whip, Mocha, Mocha $1.49-----装饰3个物品的方式之一---------House Blend Coffee, Soy, Mocha, Whip $1.34
再上一个例子:
/**抽象的人 被装饰的抽象类*/public abstract class Human {public abstract double calcMoney();public void run() {System.out.println("在走路...");}}
/**装饰者抽象类*/public abstract class Decorator extends Human{public abstract double calcMoney();}
/** * 具体的人,被装饰者。 * @author hp * */public class ConcreateHuman extends Human{private String name;public ConcreateHuman(String name) {this.name=name;}public String getName() {return name;}@Overridepublic double calcMoney() {//被装饰者自身携带了0大洋return 0;}@Overridepublic void run() {System.out.println(name+"在商场散步...");}}
/** * 具体的装饰者。 赚取30RMB */public class ConcreateDecoratorA extends Decorator{private Human human;public ConcreateDecoratorA(Human human) {this.human=human;}@Overridepublic void run() {super.run();System.out.println("ConcreateDecoratorA.run()");}@Overridepublic double calcMoney() {return human.calcMoney()+30;}public void saleCoffer(){System.out.println("卖出一份咖啡");}}
/*** * 具体的装饰者。 赚取20RMB */public class ConcreateDecoratorB extends Decorator {private Human human;public ConcreateDecoratorB(Human human) {this.human=human;}public void saleMilk() {System.out.println("卖出了 牛奶");}@Overridepublic double calcMoney() {return human.calcMoney()+20;}}
public class Test {public static void main(String[] args) {/**方式1:*/System.out.println("/**方式1:*/");ConcreateHuman human = new ConcreateHuman("张无忌");human.run();System.out.println(human.getName()+"身上有:"+human.calcMoney()+"RMB");ConcreateDecoratorB concreateB = new ConcreateDecoratorB(human);concreateB.saleMilk();System.out.println(human.getName()+"身上有:"+concreateB.calcMoney()+"RMB");ConcreateDecoratorA concreateA = new ConcreateDecoratorA(concreateB);concreateA.saleCoffer();System.out.println(human.getName()+"身上有:"+concreateA.calcMoney()+"RMB");System.out.println("/**********************/");System.out.println("/**********************/");/**方式2:*/System.out.println("/**方式2:一般用于计算总价*/");Human huamnZhang = new ConcreateDecoratorA(new ConcreateDecoratorB(new ConcreateHuman("张无忌")));System.out.println("身上有:"+huamnZhang.calcMoney()+"RMB");}}
/**方式1:*/张无忌在商场散步...张无忌身上有:0.0RMB卖出了 牛奶张无忌身上有:20.0RMB卖出一份咖啡张无忌身上有:50.0RMB/**********************//**********************//**方式2:一般用于计算总价*/身上有:50.0RMB
0 0
- 装饰者模式(Derector)
- 装饰者模式
- Decorator 装饰者模式
- 装饰者设计模式
- 装饰者模式
- 装饰者模式
- 装饰者模式
- 装饰者模式(Decorator)
- 装饰者模式
- 装饰者模式
- 装饰者模式
- 装饰者模式 DecoratorPattern
- 设计模式 - 装饰者
- 装饰者模式
- 装饰者模式
- 装饰者模式 - 2
- 装饰者模式
- 装饰者模式
- sdutoj 3361 数据结构实验之图论四:迷宫探索(dfs)
- 修改git全部已提交的用户名和邮箱
- 如何在string.xml的内容中添加空格
- cocoapod创建自己的私有库
- 追追追
- 装饰者模式
- linux基础(20)--linux磁盘阵列RAID--RHEL6.5
- Linux read()实现
- 选择排序法1-10000
- 37-001-1 web商城项目的Spring框架环境的初步搭配
- 实现自动翻页,并显示页数
- Python的lambda匿名函数
- stm32实际运用中遇到的问题
- ant出现语法命令不正确