一.装饰者模式
定义:装饰模式是在不改变原类文件和不使用继承的情况下,动态的扩展一个对象的功能。(一个类包裹被增强类)
目的:在不改变原文件条件下对类进行增强。
优点: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以后新增的方法
}
}
结果: