大话设计模式笔记(四)——装饰模式

  • 2019 年 10 月 30 日
  • 筆記

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/luo4105/article/details/76546343

第六章装饰模式

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

装饰模式UML

装饰模式的核心是对对象不断添加装饰的功能所使用的设计模式。

现有需求人和多种衣服,人需要自主搭配多种衣服,UML结构图如下

在上面的UML中,Decoiator存在Component对象属性,在构造器初始化。它的子类的wear方法会调用component.wear();这样实现Decoiator的子类去装饰Person类。

代码

Componet

public abstractclass Componet {        public abstract void wear();  }

Person

public class Person extends Componet{      private Stringname = "小菜";        @Override      public void wear() {          System.out.println(name+ "穿衣");      }  }

Decorator

public class Decorator extends Componet {        public Componet componet;        public Decorator(Componet componet) {          this.componet = componet;      }        @Override      public void wear() {          componet.wear();      }  }

JeansDecorator

public class JeansDecorator extends Decorator {        public JeansDecorator(Componet componet) {          super(componet);      }        @Override      public void wear() {          super.wear();          System.out.println("穿牛仔裤");      }  }

TieDecorator

public class TieDecorator extends Decorator {        public TieDecorator(Componet componet) {          super(componet);      }        @Override      public void wear() {          super.wear();          System.out.println("打领带");      }  }

TShirtDecorator

public class TShirtDecorator extends Decorator {        public TShirtDecorator(Componet componet) {          super(componet);      }        @Override      public void wear() {          super.wear();          System.out.print("穿T恤");      }  }

Test

public class Test {      public static void main(String[] args) {          Decorator tie = new TieDecorator(new Person());          Decorator jeans = new JeansDecorator(tie);          Decorator tshirt = new TShirtDecorator(jeans);            tshirt.wear();      }  }

打印

小菜穿衣

打领带

穿牛仔裤

穿T恤

总结

装饰模式是给核心功能添加新的功能,并能按照顺序执行。装饰模式将特定方法封装到类中,并让这个类包装它所需要的装饰类对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象了。

装饰者模式是应用最普遍的设计模式之一。javaAPI中对装饰者模式的举例:Java I/O 库中 BufferedInputStream、DataInputStream、LineNumberInputStream、PushbackInputStream 等装饰者类对于 InputStream 的封装;JavaEE API 中的 ServletRequestWrapper、HttpServletRequestWrapper 对于 ServletRequest 的封装