大话设计模式笔记(四)——装饰模式
- 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 的封装