一.装饰者模式
定义:装饰模式是在不改变原类文件和不使用继承的情况下,动态的扩展一个对象的功能。(一个类包裹被增强类)
目的:在不改变原文件条件下对类进行增强。
优点:1.动态增强
2.不改变原文件,不使用继承
3.可以叠加装饰
缺点:使类增多,结构变复杂。
类图:
代码:
被增强类接口
1. public interface Component { 2. 3. void method(); 4. 5. }
被增强类实现
1. public class ConcreteComponent implements Component{ 2. 3. public void method() { 4. System.out.println("原来的方法"); 5. } 6. 7. }
增强类抽象类
1. public abstract class Decorator implements Component{ 2. 3. protected Component component; 4. 5. public Decorator(Component component) { 6. super(); 7. this.component = component; 8. } 9. 10. public void method() { 11. component.method(); 12. } 13. 14. }
增强类实现A
1. public class ConcreteDecoratorA extends Decorator{ 2. 3. public ConcreteDecoratorA(Component component) { 4. super(component); 5. } 6. 7. public void methodA(){ 8. System.out.println("被装饰器A扩展的功能"); 9. } 10. 11. public void method(){ 12. System.out.println("针对该方法加一层A包装"); 13. super.method(); 14. System.out.println("A包装结束"); 15. } 16. }
增强类实现B
1. public class ConcreteDecoratorB extends Decorator{ 2. 3. public ConcreteDecoratorB(Component component) { 4. super(component); 5. } 6. 7. public void methodB(){ 8. System.out.println("被装饰器B扩展的功能"); 9. } 10. 11. public void method(){ 12. System.out.println("针对该方法加一层B包装"); 13. super.method(); 14. System.out.println("B包装结束"); 15. } 16. }
调用
1. public class Main { 2. 3. public static void main(String[] args) { 4. Component component =new ConcreteComponent();//原来的对象 5. System.out.println("------------------------------"); 6. component.method();//原来的方法 7. ConcreteDecoratorA concreteDecoratorA = new ConcreteDecoratorA(component);//装饰成A 8. System.out.println("------------------------------"); 9. concreteDecoratorA.method();//原来的方法 10. concreteDecoratorA.methodA();//装饰成A以后新增的方法 11. ConcreteDecoratorB concreteDecoratorB = new ConcreteDecoratorB(component);//装饰成B 12. System.out.println("------------------------------"); 13. concreteDecoratorB.method();//原来的方法 14. concreteDecoratorB.methodB();//装饰成B以后新增的方法 15. concreteDecoratorB = new ConcreteDecoratorB(concreteDecoratorA);//装饰成A以后再装饰成B 16. System.out.println("------------------------------"); 17. concreteDecoratorB.method();//原来的方法 18. //调用父类的构造方法时,传入的是concreteDecoratorA的类,所以super.method调用到了concreteDecoratorA中类的method,实现了两次装饰 19. concreteDecoratorB.methodB();//装饰成B以后新增的方法 20. } 21. }
结果: