标签:之一 程序 tor str 构造函数 情况 弹性 static ima
1、意图
动态给一个对象添加一些额外的职责。比如增加功能,装饰模式相比生成子类更为灵活。该模式以对客户端透明的方式扩展对象的功能。
2、适用场景
(1)在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责;
(2)当不能采用继承方式对系统进行扩展或者采用继承不利于系统的扩展和维护时,第一种情况,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈现爆炸式增长;另外一种情况可能是因为类的定义被隐藏,如@Hide注释的类,或者定义的类不能生成子类,如final修饰的类;
(3)需要动态地给某个对象添加功能,这些功能也可以动态地撤销。
3、类图分析
4、代码示例
1 /** 2 * @author it-小林 3 * @desc 被修饰的类的抽象接口 4 * @date 2021年07月28日 11:28 5 */ 6 public interface People { 7 public void run(); 8 }
/** * @author it-小林 * @desc 被修饰的类 * @date 2021年07月28日 11:28 */ public class Man implements People{ @Override public void run() { System.out.println("人会跑步"); } }
1 /** 2 * @author it-小林 3 * @desc 装饰的抽象类 4 * @date 2021年07月28日 11:29 5 */ 6 public class AbstractDecorator implements People{ 7 //持有被装饰类的引用 8 private People people; 9 10 //构造函数注入被修饰者 11 12 13 public AbstractDecorator(People people) { 14 this.people = people; 15 } 16 17 @Override 18 public void run() { 19 people.run(); 20 } 21 }
1 /** 2 * @author it-小林 3 * @desc 装饰类 4 * @date 2021年07月28日 11:33 5 */ 6 public class ManDecorator extends AbstractDecorator{ 7 8 public ManDecorator(People people) { 9 super(people); 10 } 11 12 //装饰类增加的功能 13 private void sing(){ 14 System.out.println("人在唱歌"); 15 } 16 17 @Override 18 public void run() { 19 super.run(); 20 sing(); 21 } 22 }
1 /** 2 * @author it-小林 3 * @desc 4 * @date 2021年07月28日 11:35 5 */ 6 public class Client { 7 public static void main(String[] args) { 8 //创建被修饰的类 9 People man = new Man(); 10 11 //创建修饰的类,并添加被修饰类的引用 12 People superMan = new ManDecorator(man); 13 14 //执行增强后的run方法 15 superMan.run(); 16 17 } 18 }
5、优缺点
优点:
缺点:
6、总结
7、模式对比
标签:之一 程序 tor str 构造函数 情况 弹性 static ima
原文地址:https://www.cnblogs.com/linruitao/p/15067811.html