装饰者模式——NWU_LK
目录
- 简介
- 案例描述及实现
- 案例描述
- 实现
- 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相关推荐
- java设计模式----装饰器模式
Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样.因此,装饰器模式具有如下的特征: 它必须具有一个装饰的对象. 它必须拥有与被装饰对象相同的接口. ...
- Android 设计模式:(三)装饰者模式 —— 装饰对象
*利用组合(composition)和委托(delegation)可以在运行时实现继承行为的效果,动态地给对象加上新的行为. *利用继承扩展子类的行为,是在编译时静态决定的:利用组合的做法,可以在运行 ...
- java I/O之装饰者模式
装饰者: Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案. 装饰者模式意图: 动态的给一个对象添加额外的职责.Decorato ...
- 如何利用装饰者模式在不改变原有对象的基础上扩展功能
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:双子孤狼 blog.csdn.net/zwx9001 ...
- 这是我见过最通俗易懂的 装饰者模式 讲解了!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:lewis0077 cnblogs.com/lewis007 ...
- Python设计模式-装饰器模式
Python设计模式-装饰器模式 代码基于3.5.2,代码如下; #coding:utf-8 #装饰器模式class Beverage():name = ""price = 0.0 ...
- 《JavaScript设计模式与开发实践》模式篇(12)—— 装饰者模式
在传统的面向对象语言中,给对象添加功能常常使用继承的方式,但是继承的方式并不灵活, 还会带来许多问题:一方面会导致超类和子类之间存在强耦合性,当超类改变时,子类也会随之 改变;另一方面,继承这种功能复 ...
- 3年工作必备 装饰器模式
故事 古话说的好:人靠衣裳马靠鞍.下面先带大家来熟悉这句话的背景: 人靠衣装马靠鞍,狗配铃铛跑的欢出自沈自晋<望湖亭记>第十出:"虽然如此,佛靠金装,人靠衣装,打扮也是很要紧的. ...
- 装饰者模式 php,PHP设计模式之装饰器模式
装饰器设计模式 什么是装饰器模式 装饰器模式就是对一个已有的结构增加装饰.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象 ...
最新文章
- 7月个人:Windows和Linux绑定和解绑ARP 了解ARP命令的用途。 掌握ARP命令的使用。...
- 采购Invoice校验_事后借记和事后贷记
- php时间下滑出现选择,JQuery设置时间段下拉选择实例_jquery
- Java NIO vs IO
- C++ getline() 和 get()
- php什么情况下name,PHP dirname功能及原理实例解析
- MapReduce编程实践
- 个元素前面 个元素放在第i 链表将第j_彻底理解链表中为何使用二级指针或者一级指针的引用...
- Golang中interface类型转string类型
- c语言饭卡管理系统_C语言饭卡管理系统毕业设计(含毕业论文、程序源码)论文字数:15422字 C0004-C语言毕业设计下载-华软网...
- python模拟ios,python模拟点击在ios中实现的实例讲解
- IDEA Springboot docker 构建项目
- 量子计算 17 量子算法2 (量子Simon算法)
- 微信上线支付分对标芝麻信用分,教你如何开通!
- Python实现西瓜视频下载 保证可用2019-08-28最新版
- 字节跳动疯狂招人,为何会有如此操作?
- 高权重淘宝标题关键词优化原理解析
- sass + compass
- 物联网安全威胁与解决方案调研
- jsp文字上下居中显示_怎么把jsp的文字居中