设计模式之装饰者模式

来源:互联网 发布:向量化编程 编辑:程序博客网 时间:2024/06/06 04:37

《Head First设计模式》在装饰者模式的引导语里面说“给爱用继承的人一个全新的设计眼界”,一直是使用继承,在学习了装饰者模式后才发现组合的威力。

装饰者模式:动态的将责任附加到对象上,想要扩展功能,装饰者提供了有别于继承的另一种选择

使用装饰者模式需要注意装饰对象和装饰类必须是一个超类,装饰对象和装饰抽象类继承超类继承的是类型。

一起去咖啡厅买杯咖啡吧
超类:

public abstract class Beverage {    // 描述    String description = "不确定的类型";    public String getDescription() {        return description;    }    // 价格    public abstract double cost();}

装饰主体对象(以咖啡为主体,这是一杯浓咖啡):

public class Espresso extends Beverage {    // 咖啡的描述    public Espresso() {        description = "浓咖啡";    }    @Override    public double cost() {        // 价格是十元        return 10;    }}

装饰主体对象(这是一杯混合咖啡):

public class HouseBlend extends Beverage {    public HouseBlend() {        description = "黑咖啡";    }    @Override    public double cost() {        return 12;    }}

抽象装饰类:

public abstract class Condiment extends Beverage {    public abstract String getDescription();}

具体装饰类(给咖啡加点摩卡吧):

public class Mocha extends Condiment {    Beverage beverage;    public Mocha(Beverage beverage) {        this.beverage = beverage;    }    @Override    public String getDescription() {        // 使用组合得到描述        return beverage.getDescription() + ", 摩卡";    }    @Override    public double cost() {        // 使用组合得到价格        return 0.5 + beverage.cost();    }}

具体装饰类(给咖啡加点奶泡吧):

public class Whip extends Condiment {    Beverage beverage;    public Whip(Beverage beverage) {        this.beverage = beverage;    }    @Override    public String getDescription() {        return beverage.getDescription() + ", 奶泡";    }    @Override    public double cost() {        return 1 + beverage.cost();    }}

现在我们开始点咖啡吧:

public class Test {    public static void main(String[] args) {        Beverage beverage = new Espresso();        System.out.println("点一杯浓咖啡:");        System.out.println(beverage.getDescription() + "  :¥" + beverage.cost());        Beverage beverage2 = new HouseBlend();        beverage2 = new Mocha(beverage2);        beverage2 = new Whip(beverage2);        System.out.println("\n点一杯摩卡奶泡黑咖啡");        System.out.println(beverage2.getDescription() + "  :¥" + beverage2.cost());    }}

这里写图片描述

咖啡已经喝完了(~ ̄▽ ̄)~
这个例子是咖啡为主体,用各种调料装饰咖啡,因为组合时可能是纯咖啡与调料组合,也有可能是咖啡与一种或多种调料的组合再和调料进行组合,所以咖啡和调料必须是一个超类,就是类型必须一致。

以上就是我对装饰者模式的了解,有不到之处望各位大神多多指正(。◕ˇ∀ˇ◕)

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 和朋友聊天找不到话题怎么办 qq加好友忽略了怎么办 微信加好友收不到验证消息怎么办 陌陌距离乱了怎么办 qq不能点赞了怎么办 快递发货地址写错了怎么办 订的海鲜不发货怎么办 拉人进群频繁了怎么办 qq群邀请过于频繁怎么办 qq一直被拉进群怎么办 qq号被冻结解封不了怎么办 2018qq自动进群怎么办 手机视频传到电脑倒着怎么办 qq群图片过期了怎么办 q号加不了群怎么办 q号加不了好友怎么办 q号被冻结了怎么办 qq群200人满了怎么办 畅聊之火消失了怎么办 手机版WPS打开文档空白怎么办 空白表格怎么打印不出来怎么办 微信朋友太少怎么办 js和CSS加载失败怎么办 熹妃q传密码忘了怎么办 苹果手机淘宝占用空间大怎么办 苹果相册储存空间不足怎么办 企业网银里的收款名单丢失怎么办 发邮件发错了怎么办 qq群成员满500了怎么办 为什么qq群查不到信息怎么办 tiger杯子油漆划掉了怎么办 手被油漆弄到了怎么办 被油漆弄到衣服怎么办 QQ发表情成问号怎么办 qq登不了微信怎么办 qq不能登录微信怎么办 qq号一年没用了怎么办 微信里别人可以看到我手机号怎么办 用手机号注册的微信换号后怎么办 微信群推送名片很多人加怎么办 志高制冷显示ff怎么办