目录

  • 简介
  • 案例描述及实现
    • 案例描述
    • 实现
  • JAVA中的装饰者模式实现

简介

装饰者模式又称包装模式,是指不改变原有对象的基础上,将功能附加到对象上,提供了比继承更有弹性的替代方案.属于结构型设计模式

案例描述及实现

案例描述

咖啡厅售卖咖啡并且可以添加材料,咖啡包括Decaf和ShortBlack两种,材料包括salt和sugar两种。每种咖啡和材料都有各自的描述和价格。顾客在购买咖啡时可以选择一种咖啡并选择添加一个或多种材料。如果按照排列组合的方式去计算每种可能的情况,那么会使得代码非常复杂。因此需要一种全新的模式去解决以上问题。

实现

通过材料对咖啡进行装饰,以实现代码的简便实现。首先构造咖啡的基类饮品类。

public abstract class Drink {private String des;   //饮品描述private float price=0.0f;  //饮品价格public String getDes() { return des; }public void setDes(String des) { this.des = des; }public float getPrice() { return price; }public void setPrice(float price) { this.price = price; }//计算当前这杯drink多少钱public abstract float cost();
}

在基类的基础上构造咖啡类

public class Coffee extends Drink {@Overridepublic float cost() { return getPrice(); }
}

在咖啡类的基础上构造Decaf和ShortBlack两类咖啡

public class Decaf extends Coffee {public Decaf(){setDes("Decaf");setPrice(10f);}
}
public class ShortBlack extends Coffee {public ShortBlack(){setDes("ShortBlack");setPrice(5f);}
}

要实现材料对咖啡的装饰,需要装饰类的基类也继承咖啡的基类饮品类(因为材料也有价格和描述,此处是为了方便所以直接将饮品的材料和价格继承)。其中必须将饮品组合在里边,方便计算总价格。

public class Decorator extends Drink {private Drink drink;@Overridepublic float cost() {return drink.cost()+this.getPrice();}public Decorator(Drink drink){ this.drink=drink; }@Overridepublic String getDes() { return super.getDes()+" "+super.getPrice()+" && "+drink.getDes(); }
}

在装饰类基类的基础上分别实现salt类和sugar类

public class Salt extends Decorator {public Salt(Drink drink) {super(drink);setDes("salt");setPrice(1);}
}
public class Sugar extends Decorator {public Sugar(Drink drink) {super(drink);setDes("糖");setPrice(2);}
}

模拟咖啡厅售卖咖啡的流程,比如顾客要一杯加了salt和sugar的ShortBlack。那么通过代码实现如下,可以很方便的实现装饰的功能,减少了代码的冗余度。

public static void main(String[] args) {Drink order = new ShortBlack();System.out.println(order.getDes());System.out.println(order.cost());System.out.println("===============");//加sugarorder = new Sugar(order);System.out.println(order.getDes());System.out.println(order.cost());System.out.println("===============");//加saltorder = new Salt(order);System.out.println(order.getDes());System.out.println(order.cost());}

JAVA中的装饰者模式实现

Java中的IO使用到了装饰者模式。其中InputStream是抽象类,类似上述案例的Drink。FileInputStream是InputStream的子类,类似于上述案例的Decaf和ShortBlack。FilterInputStream是InputStream的子类,类似于上述案例的Decorator,其中组合了InputStream,即被装饰者。而DataInputSream是FilterInputStream的子类,具体的修饰者,相当于上述的salt和sugar。

装饰者模式——NWU_LK相关推荐

  1. java设计模式----装饰器模式

    Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样.因此,装饰器模式具有如下的特征: 它必须具有一个装饰的对象. 它必须拥有与被装饰对象相同的接口. ...

  2. Android 设计模式:(三)装饰者模式 —— 装饰对象

    *利用组合(composition)和委托(delegation)可以在运行时实现继承行为的效果,动态地给对象加上新的行为. *利用继承扩展子类的行为,是在编译时静态决定的:利用组合的做法,可以在运行 ...

  3. java I/O之装饰者模式

    装饰者: Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案. 装饰者模式意图: 动态的给一个对象添加额外的职责.Decorato ...

  4. 如何利用装饰者模式在不改变原有对象的基础上扩展功能

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:双子孤狼 blog.csdn.net/zwx9001 ...

  5. 这是我见过最通俗易懂的 装饰者模式 讲解了!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:lewis0077 cnblogs.com/lewis007 ...

  6. Python设计模式-装饰器模式

    Python设计模式-装饰器模式 代码基于3.5.2,代码如下; #coding:utf-8 #装饰器模式class Beverage():name = ""price = 0.0 ...

  7. 《JavaScript设计模式与开发实践》模式篇(12)—— 装饰者模式

    在传统的面向对象语言中,给对象添加功能常常使用继承的方式,但是继承的方式并不灵活, 还会带来许多问题:一方面会导致超类和子类之间存在强耦合性,当超类改变时,子类也会随之 改变;另一方面,继承这种功能复 ...

  8. 3年工作必备 装饰器模式

    故事 古话说的好:人靠衣裳马靠鞍.下面先带大家来熟悉这句话的背景: 人靠衣装马靠鞍,狗配铃铛跑的欢出自沈自晋<望湖亭记>第十出:"虽然如此,佛靠金装,人靠衣装,打扮也是很要紧的. ...

  9. 装饰者模式 php,PHP设计模式之装饰器模式

    装饰器设计模式 什么是装饰器模式 装饰器模式就是对一个已有的结构增加装饰.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象 ...

最新文章

  1. 7月个人:Windows和Linux绑定和解绑ARP 了解ARP命令的用途。 掌握ARP命令的使用。...
  2. 采购Invoice校验_事后借记和事后贷记
  3. php时间下滑出现选择,JQuery设置时间段下拉选择实例_jquery
  4. Java NIO vs IO
  5. C++ getline() 和 get()
  6. php什么情况下name,PHP dirname功能及原理实例解析
  7. MapReduce编程实践
  8. 个元素前面 个元素放在第i 链表将第j_彻底理解链表中为何使用二级指针或者一级指针的引用...
  9. Golang中interface类型转string类型
  10. c语言饭卡管理系统_C语言饭卡管理系统毕业设计(含毕业论文、程序源码)论文字数:15422字 C0004-C语言毕业设计下载-华软网...
  11. python模拟ios,python模拟点击在ios中实现的实例讲解
  12. IDEA Springboot docker 构建项目
  13. 量子计算 17 量子算法2 (量子Simon算法)
  14. 微信上线支付分对标芝麻信用分,教你如何开通!
  15. Python实现西瓜视频下载 保证可用2019-08-28最新版
  16. 字节跳动疯狂招人,为何会有如此操作?
  17. 高权重淘宝标题关键词优化原理解析
  18. sass + compass
  19. 物联网安全威胁与解决方案调研
  20. jsp文字上下居中显示_怎么把jsp的文字居中

热门文章

  1. Windows10重置网络设置
  2. WEB攻防-PHP特性-学以致用
  3. 基于iOS的网络音视频实时传输系统(一)- 前言
  4. 普通静态NAT(sisco)
  5. 【译文】深度神经网络入门手册
  6. 判别式模型python_常见生成式模型与判别式模型
  7. 报错:Error: Could not create FontSet for font ‘-adobe-helvetica-medium-r-normal-*
  8. 知乎提交IPO申请,正式启动赴美上市
  9. 成都计算机中心取名,成都市计算机职业学校2021排行榜
  10. 微信订餐平台还有着独特的资源优势