设计模式-装饰器模式
定义
是指在不改变原来对象的基础上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能)。
属于结构型。
适用场景
- 用于扩展一个类的功能或给一个类添加附加职责
- 动态的给一个对象添加功能,这些功能可以再动态撤销
UML 类图
装饰器和被装饰对象都继承统一父类 Component
。
代码实现
package com.black.design.pattern.decorator;
/**
* 父类组件
* @author black
*
*/
public abstract class Component {
//操作
public abstract void operation();
}
package com.black.design.pattern.decorator;
/**
* 被装饰者
* @author black
*
*/
public class ConcreteComponent extends Component {
@Override
public void operation() {
System.out.println("做工作...");
}
}
package com.black.design.pattern.decorator;
/**
* 装饰器
* @author black
*
*/
public abstract class Decorator extends Component {
private Component component;
public Decorator(Component c) {
this.component = c;
}
@Override
public void operation() {
component.operation();
}
}
package com.black.design.pattern.decorator;
/**
* 工作渴了,喝口可乐
* @author black
*
*/
public class ConreteDecoratorDrink extends Decorator {
public ConreteDecoratorDrink(Component c) {
super(c);
}
@Override
public void operation() {
super.operation();
System.out.println("这会儿有点渴了,喝了一口可乐;");
}
public void operationFirst() {
System.out.println("第一步,首先...");
}
public void operationLast() {
System.out.println("最后,...");
}
}
package com.black.design.pattern.decorator;
/**
* 好记性不如烂笔头,记一下笔记;
* @author black
*
*/
public class ConreteDecoratorNote extends Decorator {
public ConreteDecoratorNote(Component c) {
super(c);
}
@Override
public void operation() {
super.operation();
System.out.println("好记性不如烂笔头,记一下笔记;");
}
}
测试:
package com.black.design.pattern.decorator;
public class Client {
public static void main(String[] args) {
Component p;
p= new ConcreteComponent();//先工作
p = new ConreteDecoratorNote(p);//实时记笔记
p = new ConreteDecoratorDrink(p);//喝口可乐
p.operation();
}
}
结果:
做工作...
好记性不如烂笔头,记一下笔记;
这会儿有点渴了,喝了一口可乐;
优缺点
优点:
装饰器是继承的有力补充,比继承更灵活。
通过使用不同的装饰类以及这些装饰类的排列组合,可实现不同的效果。
装饰器完全符合开闭原则。
缺点:
会产生更多的类,增加程序复杂性;
动态装饰,多层装饰时会很复杂。