装饰模式
1.装饰模式介绍
装饰模式是动态的给一个对象添加一些额外的职责
其实这个意思还是比较好理解的,就是给一个类的某个方法,在执行之前,或者执行之后,增加一些别的逻辑
2.装饰模式代码示例
下面以一个简单的示例来展示装饰模式的使用
2.1Component抽象类
public abstract class Component {
public abstract void operation();
}
2.2Decorator类
public class Decorator extends Component{
protected Component component;
public void setComponent(Component component) {
this.component = component;
}
@Override
public void operation() {
if (component != null) {
component.operation();
}
}
}
2.2 ConcreteComponent类
public class ConcreteComponent extends Component{
@Override
public void operation() {
System.out.println("具体对象的操作");
}
}
2.3ConcreteDecoratorA类
public class ConcreteDecoratorA extends Decorator{
private String addedState;
@Override
public void operation() {
super.operation();
addedState = "New State";
System.out.println("具体装饰对象A的操作");
}
}
2.4ConcreteDecoratorB类
public class ConcreteDecoratorB extends Decorator{
@Override
public void operation() {
super.operation();
addedBehavior();
System.out.println("具体装饰对象B的操作");
}
private void addedBehavior(){
System.out.println("concreteDecoratorB的额外操作");
}
}
2.5 ConcreteDecoratorC类
public class ConcreteDecoratorC extends Decorator{
@Override
public void operation() {
super.operation();
System.out.println("具体装饰对象C的这操作");
}
}
2.6测试方法类
public static void test1(){
ConcreteComponent component = new ConcreteComponent();
ConcreteDecoratorA decoratorA = new ConcreteDecoratorA();
ConcreteDecoratorB decoratorB = new ConcreteDecoratorB();
ConcreteDecoratorC decoratorC = new ConcreteDecoratorC();
decoratorA.setComponent(component);
decoratorA.operation();
decoratorB.setComponent(decoratorC);
decoratorB.operation();
decoratorC.operation();
}
2.7运行结果
具体对象的操作
具体装饰对象A的操作
具体装饰对象C的这操作
concreteDecoratorB的额外操作
具体装饰对象B的操作
具体装饰对象C的这操作
2.8装饰模式UML类图
3.总结
当系统需要新功能的时候,是向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责或主要行为,比如用西装装饰人。但是这种做法的问题在于,它们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要。
而装饰器模式提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择的、按顺序的使用装饰功能包装对象了。
装饰模式是为已有功能动态添加更多功能的一种方式。它将类中的装饰功能从类中移出去,这样可以简化原有的类,去除相关类中重复的装饰逻辑
其实这个装饰模式的最终效果很像spring的切面编程,但是两者的实现原理又不太一样。可以仅从实现效果来理解,更易懂一点。