结构型模式02-装饰者模式(动态为一个对象添加职责,就增加功能而言,装饰模式比生成子类更加灵活)
来源:互联网 发布:怎么在淘宝上买av种子 编辑:程序博客网 时间:2024/06/05 17:15
装饰者模式,名字很贴切,装饰一词,本来就是在原有的基础上增添点东西。而在软件领域,增加功能是一件多么常见的事情。策划最常说的就是,“你看下,这里能不能加个.....”,QA的绩效考核上,还要包含建议数目,如果都要完成这些建议,那么开发的工作量可能就翻了一倍哈哈哈。
对比继承方式带来的强依赖而言,以及父类变更对子类的影响之大,装饰者取了巧,虽然从抽象意义上,装饰者不是事实意义上的“孩子”类(或者说抽象对应的具体),但是为了使得可以在组件对象的基础上一层层的增加新的内容,也就是装饰者还可以被其他的装饰者再次装饰,那么将这些类都抽象出相同的父类来说是一种比较好的方式。来看下装饰模式的图(来源:设计模式之禅):
执行结果:
可以看到原来只打印一句,然后装饰完以后,多了一句Decorator1的内容,再装饰一层,又多了一句Decorator2的内容。
我们可以推想出装饰模式的优点是:
1)在组件类的基础上动态、透明(组件类并不知道这个类)的扩展功能,提供了一种继承之外的替代方案;
2)在不能使用继承的场景,比如类被final修饰的情形,可以选择使用装饰类来扩展功能;
缺点是但当装饰层次过多时,这时候系统的复杂性就会提高,所以在实际时尽量避免装饰超过3层吧,否则应该考虑其他方案来处理。
对比继承方式带来的强依赖而言,以及父类变更对子类的影响之大,装饰者取了巧,虽然从抽象意义上,装饰者不是事实意义上的“孩子”类(或者说抽象对应的具体),但是为了使得可以在组件对象的基础上一层层的增加新的内容,也就是装饰者还可以被其他的装饰者再次装饰,那么将这些类都抽象出相同的父类来说是一种比较好的方式。来看下装饰模式的图(来源:设计模式之禅):
来看下代码示例:
/** * Create by zxb on 2017/4/25 */public abstract class Component { public abstract void doSomething();}/** * Create by zxb on 2017/4/25 */public class ConcreteComponent extends Component { public void doSomething() { System.out.println("Here's in ConcreteComponent doSomething ! "); }}/** * Create by zxb on 2017/4/25 */public class Decorator1 extends Component { private Component component; public Decorator1(Component component){ this.component = component; } public void doSomething() { this.component.doSomething(); System.out.println("Here's in Decorator1 ! "); }}/** * Create by zxb on 2017/4/25 */public class Decorator2 extends Component { private Component component; public Decorator2(Component component){ this.component = component; } public void doSomething() { this.component.doSomething(); System.out.println("Here's in Decorator2 ! "); }}/** * Create by zxb on 2017/4/25 */public class DecoratorTest { public static void main(String[] args){ ConcreteComponent component = new ConcreteComponent(); component.doSomething(); System.out.println(); Decorator1 decorator1 = new Decorator1(component); decorator1.doSomething(); System.out.println(); Decorator2 decorator2 = new Decorator2(decorator1); decorator2.doSomething(); }}
执行结果:
可以看到原来只打印一句,然后装饰完以后,多了一句Decorator1的内容,再装饰一层,又多了一句Decorator2的内容。
我们可以推想出装饰模式的优点是:
1)在组件类的基础上动态、透明(组件类并不知道这个类)的扩展功能,提供了一种继承之外的替代方案;
2)在不能使用继承的场景,比如类被final修饰的情形,可以选择使用装饰类来扩展功能;
缺点是但当装饰层次过多时,这时候系统的复杂性就会提高,所以在实际时尽量避免装饰超过3层吧,否则应该考虑其他方案来处理。
0 0
- 结构型模式02-装饰者模式(动态为一个对象添加职责,就增加功能而言,装饰模式比生成子类更加灵活)
- 设计模式:装饰器模式(为对象动态的添加功能)
- 装饰模式--动态添加装饰物(结构型模式03)
- 装饰模式(Decorator)-对象结构型模式
- 装饰模式(单一职责)
- 结构型--装饰者模式
- 装饰者模式(结构型)
- 装饰模式(Decorator)---对象结构型模式
- 装饰模式(结构型)
- 结构型模式-装饰
- 结构型模式-装饰模式
- 结构型模式-装饰模式
- Decorator 装饰对象结构模式
- 装饰者模式 - 结构型模式
- 结构型模式-----装饰模式(decorator)
- 装饰模式(结构型模式)
- (结构型模式二)装饰模式
- Decorator模式(装饰模式 结构型)
- Linux PATH
- 构建安全kafka集群
- Linux下JDK、Tomcat的安装及配置
- kafka处理超大消息
- 导入第三方Jar包到Nexus私服
- 结构型模式02-装饰者模式(动态为一个对象添加职责,就增加功能而言,装饰模式比生成子类更加灵活)
- The system is running in low-graphics mode [ubuntu 14.04]
- Mac下使用python实现简单的目录树展示
- 【qscoj】喵哈哈村的秘境探险(二)
- ESL-ICA
- CoordinateLayout 自定义Behavior 仿百度外卖效果 实践
- 郑州培训 <山路崎岖>(最小生成树)
- Win Server 2008 R2
- 第三章 ListView的用法