代码语言:javascript复制装饰模式:简单的来说就是动态的给一个对象增加额外的功能,就单纯的新增功能来说会比单一的给一个子类新增功能来的灵活,是跟代理模式中的静态代理模式和动态代理模式十分相近,但是静态代理会使得代码非常臃肿,维护性比较差,但是动态代理使用代理类,让代理类只是存在于内存当中运行,不需要产生具体的java文件,这样的模式会更加的优秀.接下来是本章的装饰模式
【本文使用lombok依赖,如果不想使用的可以直接使用setter方法】
1.统一的接口:
代码语言:javascript复制 public abstract class Component {
/**
* 基本的操作类
*/
public abstract void opeartion();
}
2.其中的一个拓展实现类,作为一个拓展的功能类
代码语言:javascript复制 public class ConcreteComponent extends Component {
@Override
public void opeartion() {
System.out.println("具体对象的操作");
}
}
3.另一个拓展的功能类
代码语言:javascript复制 @Setter
public class Decorator extends Component{
private Componentcomponent;
@Override
public void opeartion() {
if (component !=null){
component.opeartion();
}
}
}
4.操作类A
代码语言:javascript复制 public class ConcreteDecoratorA extends Decorator {
private StringaddedState;
@Override
public void opeartion() {
super.opeartion();
addedState ="New State";
System.out.println("具体的装饰对象A的操作");
}
}
5.操作类B
代码语言:javascript复制 public class ConcreteDecoratorB extends Decorator {
@Override
public void opeartion() {
super.opeartion();
AddedBehavior();
System.out.println("具体装饰对象B的操作");
}
private void AddedBehavior(){
System.out.println("装饰B独有的方法");
}
}
6.测试用例
代码语言:javascript复制 public class Test {
public static void main(String[] args) {
ConcreteComponent component =new ConcreteComponent();
ConcreteDecoratorA decoratorA =new ConcreteDecoratorA();
ConcreteDecoratorB decoratorB =new ConcreteDecoratorB();
decoratorA.setComponent(component);
decoratorB.setComponent(decoratorA);
decoratorB.opeartion();
}
}