设计模式——装饰者模式
2016-03-05 00:41
169 查看
1、定义:动态的给一个对象添加一些额外的职责。
2、要点:装饰者与被装饰者拥有共同的父类,继承的目的是继承类型,而不是行为。
3、结构图示:
4、代码示例
现在需要一个汉堡,主体是鸡腿堡,可以选择添加生菜、酱、辣椒等等许多其他的配料,这种情况下就可以使用装饰者模式。
Humburger类(Compnent)
ChikenHumburger(ComponentContext)
被装饰者的初始状态,有些自己的简单装饰。
Comdiment类(Decorator)重点——装饰者
Lettuce生菜类(ConcreteDecoratorA)
Chilli辣椒类(ConcreteDecoratorB)
Test测试
测试结果:
鸡腿堡 加生菜 加辣椒
11.5
5、总结:
一部分摘自大神的心得,颇有感触
1、Decorator抽象类中,持有Human接口,方法全部委托给该接口调用,目的是交给该接口的实现类即子类进行调用。
2、Decorator抽象类的子类(具体装饰者),里面都有一个构造方法调用super(human),这一句就体现了抽象类依赖于子类实现即抽象依赖于实现的原则。因为构造里面参数都是Human接口,只要是该Human的实现类都可以传递进去,即表现出Decorator dt = new Decorator_second(new Decorator_first(new Decorator_zero(human)));这种结构的样子。所以当调用dt.wearClothes();dt.walkToWhere()的时候,又因为每个具体装饰者类中,都先调用super.wearClothes和super.walkToWhere()方法,而该super已经由构造传递并指向了具体的某一个装饰者类(这个可以根据需要调换顺序),那么调用的即为装饰类的方法,然后才调用自身的装饰方法,即表现出一种装饰、链式的类似于过滤的行为。
3、具体被装饰者类,可以定义初始的状态或者初始的自己的装饰,后面的装饰行为都在此基础上一步一步进行点缀、装饰。
4、装饰者模式的设计原则为:对扩展开放、对修改关闭,这句话体现在我如果想扩展被装饰者类的行为,无须修改装饰者抽象类,只需继承装饰者抽象类,实现额外的一些装饰或者叫行为即可对被装饰者进行包装。所以:扩展体现在继承、修改体现在子类中,而不是具体的抽象类,这充分体现了依赖倒置原则,这是自己理解的装饰者模式。
5、在写具体的装饰类(ConcreteDecorator)时,应该注意构造方法的重载,构造方法的参数为抽象类Component,在普通的方法中,应该使用父类的方法,这样才能一层层传递下去,所以应该像示例中那样调用Humburger类的方法。
2、要点:装饰者与被装饰者拥有共同的父类,继承的目的是继承类型,而不是行为。
3、结构图示:
4、代码示例
现在需要一个汉堡,主体是鸡腿堡,可以选择添加生菜、酱、辣椒等等许多其他的配料,这种情况下就可以使用装饰者模式。
Humburger类(Compnent)
public abstract class Humburger { protected String name; public String getName(){ return name; } public abstract double getPrice(); }
ChikenHumburger(ComponentContext)
被装饰者的初始状态,有些自己的简单装饰。
public class ChickenBurger extends Humburger{ public ChickenBurger(){ name = "鸡腿堡"; } public double getPrice(){ return 10; } }
Comdiment类(Decorator)重点——装饰者
public abstract class Condiment extends Humburger{ public abstract String getName(); }
Lettuce生菜类(ConcreteDecoratorA)
public class Lettuce extends Condiment{ public Humburger humburger; public Lettuce(Humburger humburger){ this.humburger = humburger; } public String getName(){ return humburger.getName()+" 加生菜"; } public double getPrice(){ return humburger.getPrice()+1; } }
Chilli辣椒类(ConcreteDecoratorB)
public class Chilli extends Condiment{ Humburger humburger; public Chilli(Humburger humburger){ this.humburger = humburger; } public String getName(){ return humburger.getName()+" 加辣椒"; } public double getPrice(){ return humburger.getPrice()+0.5; } }
Test测试
public class Test { public static void main(String args[]){ Humburger humburger = new ChickenBurger(); Condiment C = new Chilli(new Lettuce(humburger)); System.out.println(C.getName()); System.out.println(C.getPrice()); } }
测试结果:
鸡腿堡 加生菜 加辣椒
11.5
5、总结:
一部分摘自大神的心得,颇有感触
1、Decorator抽象类中,持有Human接口,方法全部委托给该接口调用,目的是交给该接口的实现类即子类进行调用。
2、Decorator抽象类的子类(具体装饰者),里面都有一个构造方法调用super(human),这一句就体现了抽象类依赖于子类实现即抽象依赖于实现的原则。因为构造里面参数都是Human接口,只要是该Human的实现类都可以传递进去,即表现出Decorator dt = new Decorator_second(new Decorator_first(new Decorator_zero(human)));这种结构的样子。所以当调用dt.wearClothes();dt.walkToWhere()的时候,又因为每个具体装饰者类中,都先调用super.wearClothes和super.walkToWhere()方法,而该super已经由构造传递并指向了具体的某一个装饰者类(这个可以根据需要调换顺序),那么调用的即为装饰类的方法,然后才调用自身的装饰方法,即表现出一种装饰、链式的类似于过滤的行为。
3、具体被装饰者类,可以定义初始的状态或者初始的自己的装饰,后面的装饰行为都在此基础上一步一步进行点缀、装饰。
4、装饰者模式的设计原则为:对扩展开放、对修改关闭,这句话体现在我如果想扩展被装饰者类的行为,无须修改装饰者抽象类,只需继承装饰者抽象类,实现额外的一些装饰或者叫行为即可对被装饰者进行包装。所以:扩展体现在继承、修改体现在子类中,而不是具体的抽象类,这充分体现了依赖倒置原则,这是自己理解的装饰者模式。
5、在写具体的装饰类(ConcreteDecorator)时,应该注意构造方法的重载,构造方法的参数为抽象类Component,在普通的方法中,应该使用父类的方法,这样才能一层层传递下去,所以应该像示例中那样调用Humburger类的方法。
相关文章推荐
- IOS UIPrintInteractionController 打印
- 解决iOS内存泄露
- git使用笔记
- CODEVS天梯青铜组题目自己的解法
- C++获取随机数的办法
- RTMP 协议学习总结
- 第一周内容
- POJ 2449 - A*初步+ K短路
- Java回调函数
- MAC系统中可执行文件格式(Mach-O)的学习 (一)
- rpc简介、原理、实例-缘于difx
- Java回调函数的理解
- WIN下Vmware虚拟机创建共享
- iOS 的 TCP/IP 协议族剖析 && Socket
- JDBC连接数据库,完成注册和登录
- SIP协议与视频监控
- hash算法 (hashmap 实现原理)
- 5种TCP连接中出现RST的情况。连接复位Reset a connection.
- 做项目负责人的总结
- 3个著名加密算法(MD5、RSA、DES)的解析