装饰模式
Decorator Design Pattern
定义:
Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.
动态地将额外职责附加到对象上,装饰器为子类提供类灵活的代替方法来扩展功能。
目的就是需要对类添加功能的时候,不要创建多个子类,而是采用装饰模式来扩展功能
定义角色:
-
Component
抽象组件 :Component是一个接口或者抽象类,是定义我们的核心对象的 -
ConcreteComponent
具体组件:就是未来你需要装饰的具体对象 -
Decorator
装饰者角色:一般是个抽象类,对Component进行装饰,所以它的属性里一定有个private变量指向Component -
ConcreteDecorator..
具体的装饰者角色 : 可以有很多个。就是对把核心、原始的东西进行具体的装饰。
通用代码:
//Component
public abstract class Component {
public abstract void operate();
}
//ConcreteComponent
public class ConcreteComponent extends Component {
@Overrid
public void operate() {
//具体做些事情
...
}
}
//Decorator
public abstract class Decorator extends Component {
private Component component = null;
public Decorator(Component component) {
this.component = component;
}
//将功能委托给装饰者执行
@Override
public void operate() {
this.component.operate();
}
}
具体的装饰类
// ConcreteDecorator1
public class ConcreteDecorator1 extends Decorator {
//定义被修饰者
public ConcreteDecorator1(Component component) {
super(component);
}
private void amplify1() {
System.out.println("amplify1 修饰");
}
//重写父类的Operation方法
@Override
public void operate(){
this.amplify1();
super.operate();
}
}
// ConcreteDecorator2
public class ConcreteDecorator2 extends Decorator {
//定义被修饰者
public ConcreteDecorator2(Component component) {
super(component);
}
private void amplify2() {
System.out.println("amplify2 修饰");
}
//重写父类的Operation方法
@Override
public void operate(){
super.operate();
this.amplify2();
}
}
//场景使用
public class Client {
public static void main() {
Component component = new ConcreteComponent();
component = new ConcreteDecorator1(component);
component = new ConcreteDecorator2(component);
component.operate();
}
}
优点:
- 装饰类
Decorator
和被装饰类Component
可以独立发展,不会相互耦合.因为Decorator是从外部来扩展Component的功能. - 装饰模式是继承关系的一种替代方案,无论Decorator装饰了多少层,最后返回的对象还是Component.(他们包装的一层一层的,和递归一样)
- 装饰模式可以动态扩展一个实现类的功能.
缺点:
- 多层的装饰非常复杂.如同剥洋葱一样
应用:
- 当需要扩展一个类的功能,或者给一个类增加附加功能
- 需要动态给对象增加功能,还可以动态撤销
- 需要给一批兄弟类进行改装或者扩展功能