版权声明:本文为博主原创文章,遵循 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 的封装