设计模式之装饰者模式
来源:互联网 发布:convertio for mac 编辑:程序博客网 时间:2024/06/05 19:23
设计模式之装饰者模式
装饰器模式(Decorator): 动态的给一个对象添加一些额外的职责。就扩展功能而言,Decorator模式比生成子类方式更为灵活。
需求:生活中,每天我们(Person)会选择不同的的衣服(Clothes)进行搭配穿着,去勾搭小姐姐们。人作为被装饰者,可以由不同的衣服装饰。同一个人选择不同的衣服,效果是不一样的。
那么,先定义一个人接口,展示每天穿什么。–被装饰者
/** * Created by ProdigalWang on 2017/7/21. * Component 是定义一个对象接口,可以给这些对象动态地添加职责。 */public interface IPerson { String show();}
接着,装饰器接口,继承被装饰者,不做具体实现,由具体的子装饰器实现。–装饰器
/** * Decorator,装饰接口,继承了Component,从外类来扩展Component类的功能, * 但对于Component来说,是无需知道Decorator的存在的。 */public interface IClothesDecorator extends IPerson{}
假如我们想穿大裤衩的时候,我们就去定义一个大裤衩BigTrouser –具体的装饰器
/** * 具体的装饰者实现类,定义具体的新的职责 */public class BigTrouser implements IClothes,IClothesDecorator {//装饰者持有被装饰者的对象。private IPerson iPerson;public BigTrouser(IPerson iPerson){this.iPerson=iPerson;}//定义新的职责@Overridepublic String clothesType() {return "大裤衩";}@Overridepublic String size() {return "25号";}//增添之后的职责@Overridepublic String show() {return iPerson.show()+ size()+clothesType();}}
IClothes接口,只是一个衣服规范,与这里的装饰者模式实现没有关系
public interface IClothes {//衣服类型String clothesType();//衣服大小String size();}
这个时候,我又想穿双鞋:
public class Shoes implements IClothes,IClothesDecorator {private IPerson iPerson;public Shoes(IPerson iPerson){ this.iPerson = iPerson;}@Overridepublic String clothesType() { return "鞋子";}@Overridepublic String size() { return "22码";}@Overridepublic String show() { return iPerson.show()+ size()+clothesType();}}
再来个T-恤衫:
public class Tshirts implements IClothes,IClothesDecorator {private IPerson iPerson;public Tshirts(IPerson iPerson){ this.iPerson=iPerson;}@Overridepublic String clothesType() { return "T-恤衫";}@Overridepublic String size() { return "175cm";}@Overridepublic String show() { return iPerson.show()+ size()+clothesType();}}
最后,装饰者被装饰:
public class test {public static void main(String []args){ //声明被装饰的对象 IPerson iPerson =new Person(); //装饰者拿到被装饰的对象并进行装饰 IClothesDecorator bigTrouser=new BigTrouser(iPerson); System.out.println(bigTrouser.show()); IClothesDecorator shoes=new Shoes(bigTrouser); System.out.println(shoes.show()); IClothesDecorator tShits=new Tshirts(shoes); System.out.println(tShits.show()); //小花穿的衣服是:25号大裤衩 //小花穿的衣服是:25号大裤衩22码鞋子 //小花穿的衣服是:25号大裤衩22码鞋子175cmT-恤衫 }}
总结
在我们需要为已有功能需要扩展新的新的功能,我们可以选择修改源代码,但这无疑是有巨大的风险的,这时候我们可以使用装饰者模式解决这个矛盾,我们可以有选择新的添加新的装饰功能。这么做也符合开放-封闭原则。
源码链接
本文地址:http://blog.csdn.net/ProdigalWang/article/details/75675195
阅读全文
0 0
- 设计模式之装饰者设计模式
- 设计模式 之 装饰者
- 设计模式之装饰者模式
- 设计模式之装饰者模式
- 设计模式之Decorator(装饰者模式)
- 设计模式之五---装饰者模式
- 设计模式之---装饰者模式
- c++设计模式之装饰者模式
- Php设计模式之装饰者模式
- java设计模式之装饰者模式
- 设计模式之装饰者模式
- 【设计模式】之装饰者模式
- HeadFirst设计模式之装饰者模式
- c++设计模式之装饰者模式
- 设计模式之装饰者模式
- 设计模式之--装饰者模式
- 设计模式之装饰者模式
- 设计模式之装饰者模式
- Handler机制整理
- android之制作拍照
- java.lang.Exception: java.lang.ClassCastException: org.apache.hadoop.mapreduce.lib.input.TaggedInput
- Spring学习笔记
- 并查集基础
- 设计模式之装饰者模式
- 【Java 学习笔记】基础知识
- c++执行cmd指令、cmd隐藏进程不出现控制台、结束进程、调用exe、CreateProcess以及WinExec的使用
- Input输入子系统分析
- DZY Loves Modification CodeForces 447D 贪心
- util包下的时间类型与sql包下的时间类型之间的转换
- Android的获取摄像头的data
- Hinton Neural Networks课程笔记1b:神经网络模拟的大脑机理
- BZOJ 3680 爬山算法 解题报告