经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
结构型模式之装饰模式
来源:cnblogs  作者:yewen1234  时间:2018/12/11 9:25:30  对本文有异议

装饰模式(Decorator Pattern)是一种比较常见的模式。

定义:

  • 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

装饰模式类图如下所示。

 

装饰模式有以下4个角色。

  • 抽象构件(Component)角色:用于规范需要装饰的对象(原始对象)。
  • 具体构件(ConcreteComponent)角色:实现抽象构件接口,定义一个需要装饰的原始类。
  • 装饰(Decorator)角色:持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口,
  • 具体装饰角色:负责对构件对象进行装饰。

Component.java

  1. public interface Component {
  2. public void operation();
  3. }

ConcreteComponent.java

  1. public class ConcreteComponent implements Component {
  2. @Override
  3. public void operation() {
  4. System.out.println("业务代码");
  5. }
  6. }

Decorator.java

  1. public abstract class Decorator implements Component {
  2. private Component component = null;
  3. public Decorator(Component component) {
  4. this.component = component;
  5. }
  6. @Override
  7. public void operation() {
  8. this.component.operation();
  9. }
  10. }

ConcreteDecorator.java

  1. public class ConcreteDecorator extends Decorator {
  2. public ConcreteDecorator(Component component) {
  3. super(component);
  4. }
  5. // 定义自己的方法
  6. public void selfMethod() {
  7. System.out.println("修饰");
  8. }
  9. // 重写operation
  10. @Override
  11. public void operation() {
  12. this.selfMethod();
  13. super.operation();
  14. }
  15. }

Client.java

  1. public class Client {
  2. public static void main(String[] args) {
  3. Component component = new ConcreteComponent();
  4. // 进行装饰
  5. component = new ConcreteDecorator(component);
  6. component.operation();
  7. }
  8. }

优点:

  • 装饰类和被装饰类可以独立发展,而不会相互耦合。即Component类无须知道Decorator类,Decorator类是从外部来扩展Component类的功能,而Decorator也不用知道具体的构件。
  • 装饰模式是继承关系的一个替代方案。装饰类Decorator,不管装饰多少层,返回的对象还是Component.
  • 装饰模式可以动态地扩展一个实现类的功能。

缺点:

  • 多层的装饰是比较复杂的。

应用场景:

  • 需要扩展一个类的功能,或给一个类增加附加功能。
  • 需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
  • 需要为一批类进行改装或加装功能。

装饰模式是对继承的有力补充。单纯使用继承时,在一些情况下就会增加很多子类,而且灵活性较差,维护也不容易。装饰模式可以替代继承,解决类膨胀的问题,如Java基础类库中的输入输出流相关的类大量使用了装饰模式。

摘自:

青岛东合信息技术有限公司 . 设计模式(Java版) .  电子工业出版社,2012,78-80.

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号