目录

1 适用场景

2 代码实现

3 功能扩展


装饰者模式又叫装饰器模式

用途:在不改变现有对象的结构情况下,动态给一个对象增加额外的功能。

1 适用场景

比如换装游戏,就可以使用到装饰者模式。先有一个小人,在不改变小人的情况下,动态给小人增加各种衣服就是装饰者模式。

再比如煎饼果子有基础版,还可以放各种配料,也可以使用到装饰者模式。

煎饼果子就是一个对象,在不改变煎饼果子的情况下,动态给煎饼果子添加额外的配料(玉米沙拉、鸡柳、辣条、香肠……)

2 代码实现

下面使用装饰者模式实现一下计算煎饼果子加各种配料的价格的功能。

先有一个对象接口“小吃”,可以给这给对象接口添加职责(计算多少钱)

package com.qing.decorator;public interface IXiaochi {int howMuch();
}

然后我们写一个煎饼果子对象。煎饼果子基础版(没有加额外的配料)

package com.qing.decorator;public class Jianbingguozi implements IXiaochi {//煎饼果子基础版6块@Overridepublic int howMuch() {return 6;}
}

写一个装饰抽象类,实现了对象接口“小吃”,该装饰抽象类可以从外类来扩展“小吃”

package com.qing.decorator;//抽象装饰角色:配料
public abstract class Peiliao implements IXiaochi {}

下面是具体的装饰对象,给“小吃”添加加配料重新计算价格的职责。

该装饰对象继承装饰抽象类(配料),构造方法里添加参数“小吃”,加沙拉,额外收费两元,价格叠加。

package com.qing.decorator;public class Salad extends Peiliao {//加沙拉另外收费2块private static final int price=2;private IXiaochi xiaochi;public Salad(IXiaochi xiaochi) {this.xiaochi = xiaochi;}@Overridepublic int howMuch() {System.out.println("加一份沙拉,多"+price+"块");return xiaochi.howMuch()+this.price;}
}

加鸡柳

package com.qing.decorator;public class Jiliu extends Peiliao {//加鸡柳另外收费3块private static final int price=3;private IXiaochi xiaochi;public Jiliu(IXiaochi xiaochi) {this.xiaochi = xiaochi;}@Overridepublic int howMuch() {System.out.println("加一份鸡柳,多"+price+"块");return xiaochi.howMuch()+this.price;}
}

加辣条

package com.qing.decorator;public class Latiao extends Peiliao{//加辣条另外收费1块private static final int price=1;private IXiaochi xiaochi;public Latiao(IXiaochi xiaochi) {this.xiaochi = xiaochi;}@Overridepublic int howMuch() {System.out.println("加一份辣条,多"+price+"块");return xiaochi.howMuch()+this.price;}}

想加啥就加啥

测试类(像俄罗斯套娃一样,配料实例化的时候,参数使用的是上一个版本“小吃”的价格,重新计算价格的时候会使用上一个版本“小吃”的价格上一份配料单独的价格

 @Testvoid test1() {//基础版煎饼果子Jianbingguozi jianbingguozi = new Jianbingguozi();System.out.println("煎饼果子基础版:"+jianbingguozi.howMuch()+"块");//加一份鸡柳Jiliu plusJiliu = new Jiliu(jianbingguozi);//加一份玉米沙拉Salad plusSalad = new Salad(plusJiliu);//再加一份玉米沙拉Salad plusSalad2 = new Salad(plusSalad);//加一份辣条Latiao pluslatiao = new Latiao(plusSalad2);System.out.println("总共需要支付"+pluslatiao.howMuch()+"块");}

结果

3 功能扩展

现在这个摊位推出了烤冷面小吃,也要加配料计算价格。

再搞一个烤冷面基础版的对象。

package com.qing.decorator;public class Kaolengmian implements IXiaochi{//烤冷面基础版5块@Overridepublic int howMuch() {return 5;}}

烤冷面还可以额外加金针菇,再添加一个装饰对象(金针菇)

package com.qing.decorator;public class Jinzhengu extends Peiliao {//加金针菇另外收费2块private static final int price=2;private IXiaochi xiaochi;public Jinzhengu(IXiaochi xiaochi) {this.xiaochi = xiaochi;}@Overridepublic int howMuch() {System.out.println("加一份金针菇,多"+price+"块");return xiaochi.howMuch()+this.price;}}

测试

@Testvoid test1() {//基础版烤冷面Kaolengmian kaolengmian = new Kaolengmian();System.out.println("烤冷面基础版:" + kaolengmian.howMuch() + "块");//加一份玉米沙拉Salad plusSalad = new Salad(kaolengmian);//加一份金针菇Jinzhengu plusjinzhengu = new Jinzhengu(plusSalad);System.out.println("总共需要支付" + plusjinzhengu.howMuch() + "块");}

结果

可以看到装饰者模式,在不改变现有对象的结构情况下,很容易地动态给对象增加了额外的功能。完全遵守了开闭原则(对于扩展是开放的,对于更改是封闭的。)

装饰者模式主要优点:

1 是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用。

2 通过使用各装饰类的排列组合,可以实现不同效果

3 装饰者模式完全遵守开闭原则。

装饰者的本质是一个套娃。

设计模式 煎饼果子和装饰者模式相关推荐

  1. 设计模式学习笔记——装饰(Decorator)模式

    设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...

  2. 设计模式之【装饰器模式】

    和表妹去喝奶茶 表妹:哥啊,我想喝奶茶. 我:走啊,去哪里喝? 表妹:走,我带你去,我经常去的那家,不但好喝,还可以自由搭配很多小料.我每次都是不同的搭配,换着喝,嘻嘻. 我:你倒是挺会喝的嘛~ 你看 ...

  3. 设计模式 - 结构型 - 装饰者模式

    2019独角兽企业重金招聘Python工程师标准>>> 介绍 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比继承更为灵活. 主要解决:一般的,我们为了扩展一 ...

  4. 设计模式学习3——装饰者模式(Decorator)

    没想到鼻炎还要做手术,这应该是出生到现在的第一个手术吧,据说是个小手术,呵呵,应该没有什么问题吧,不过得有10天左右的手术及休养时间,不知道设计模式的学习会不会被打断,嘿嘿. 装饰者模式        ...

  5. 设计模式篇——初探装饰器模式

    文章目录 1.装饰器模式介绍 2.装饰器模式类图 3.装饰器模式Demo实现(一个小镇的拉面馆) 4.装饰器模式总结 装饰器模式介绍:装饰器模式可以在不修改任何底层代码的情况下,给对象赋予新的职责(程 ...

  6. Java设计模式12:装饰器模式

    装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...

  7. java中装饰器_Java设计模式12:装饰器模式

    装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...

  8. 《设计模式》之装饰器模式

    一.什么是装饰器模式 当需要对类的功能进行拓展时,一般可以使用继承,但如果需要拓展的功能种类很繁多,那势必会生成很多子类,增加系统的复杂性,并且使用继承实现功能拓展时,我们必须能够预见这些拓展功能,也 ...

  9. JAVA设计模式初探之装饰者模式

    这个模式花费了挺长时间,开始有点难理解,其实就是 定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活. 设计初衷:通常可以 ...

最新文章

  1. 操作系统导论第四章课后习题
  2. 使用MASM03 - Win32汇编语言011
  3. spring jdbc设计与实现
  4. linux mint开启热点,Linux Mint 17 + 小米WIFI创建手机热点
  5. ssh ip登录缓慢问题解决
  6. 解决在html中引入font-awesome的css文件后, 图标显示不出来
  7. 设备场景函数——72个
  8. 南京大学计算机考研分数线2021,南京大学2021年硕士研究生复试基本分数线
  9. nfs服务器工作原理
  10. everything便携版和安装版区别_什么是超极本?超极本和笔记本的区别科普知识...
  11. xx Chrome浏览器更新2020版本:黑暗模式一样使用
  12. 【云周刊】第173期:直击数博|阿里胡晓明:用100亿的投入撬动1000亿的脱贫效应...
  13. 智能卡检测控制系统检测m1这么操作_多联机制冷剂灌注操作方法
  14. iPhone软件KK唱响评测 在线视频比拼歌声
  15. 颜色的RGB数字表示方法
  16. 如何安全删除电脑上的个人信息和隐私资料
  17. MySQL 网站上的 GA 是什么意思?
  18. BUUCTF-RSA学习(一)
  19. 什么是软连接,以及软连接在linux系统中的用法
  20. 日常报错记录Could not find com.android.tools.build:gradle:3.2.1. variant: debug/0 from output dir Failure

热门文章

  1. 漫谈 SLAM 技术(下)
  2. 基于 phpcms企业建站流程
  3. moment常用操作(获取当前年/季度/月/日、上一年/季度/月/日、下一年/季度/月/日、某年/月/季度的开始和结束时间...持续更新)
  4. 【原创:EI 排版】
  5. Json-schema
  6. 解决笔记本Win7系统下玩单机游戏全屏时两边的黑框现象
  7. Tensorflow实现cnn模型的训练与使用
  8. 李飞飞计算机视觉笔记(5)--神经网络训练细节part2
  9. Python:实现gaussian高斯算法(附完整源码)
  10. 致同学聚会装逼的人 -----手哥