一.装饰者模式

定义:装饰模式是在不改变原类文件不使用继承的情况下,动态的扩展一个对象的功能。(一个类包裹被增强类)

目的:在不改变原文件条件下对类进行增强。

优点:1.动态增强

2.不改变原文件,不使用继承

3.可以叠加装饰

缺点:使类增多,结构变复杂。

类图:

装饰者模式_父类

代码:

被增强类接口

public interface Component {

void method();

}

被增强类实现

public class ConcreteComponent implements Component{

public void method() {
System.out.println("原来的方法");
}

}

增强类抽象类

public abstract class Decorator implements Component{

protected Component component;

public Decorator(Component component) {
super();
this.component = component;
}

public void method() {
component.method();
}

}

增强类实现A

public class ConcreteDecoratorA extends Decorator{

public ConcreteDecoratorA(Component component) {
super(component);
}

public void methodA(){
System.out.println("被装饰器A扩展的功能");
}

public void method(){
System.out.println("针对该方法加一层A包装");
super.method();
System.out.println("A包装结束");
}
}

增强类实现B

public class ConcreteDecoratorB extends Decorator{

public ConcreteDecoratorB(Component component) {
super(component);
}

public void methodB(){
System.out.println("被装饰器B扩展的功能");
}

public void method(){
System.out.println("针对该方法加一层B包装");
super.method();
System.out.println("B包装结束");
}
}

调用

public class Main {

public static void main(String[] args) {
Component component =new ConcreteComponent();//原来的对象
System.out.println("------------------------------");
component.method();//原来的方法
ConcreteDecoratorA concreteDecoratorA = new ConcreteDecoratorA(component);//装饰成A
System.out.println("------------------------------");
concreteDecoratorA.method();//原来的方法
concreteDecoratorA.methodA();//装饰成A以后新增的方法
ConcreteDecoratorB concreteDecoratorB = new ConcreteDecoratorB(component);//装饰成B
System.out.println("------------------------------");
concreteDecoratorB.method();//原来的方法
concreteDecoratorB.methodB();//装饰成B以后新增的方法
concreteDecoratorB = new ConcreteDecoratorB(concreteDecoratorA);//装饰成A以后再装饰成B
System.out.println("------------------------------");
concreteDecoratorB.method();//原来的方法
//调用父类的构造方法时,传入的是concreteDecoratorA的类,所以super.method调用到了concreteDecoratorA中类的method,实现了两次装饰
concreteDecoratorB.methodB();//装饰成B以后新增的方法
}
}

结果:

装饰者模式_装饰模式_02