一般有两种方式可以实现给一个类或对象增加行为:
装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。这就是装饰模式的模式动机。
**装饰模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责(Responsibility)**,就增加对象功能来说,装饰模式比生成子类实现更为灵活。其别名也可以称为包装器(Wrapper),与适配器模式的别名相同,但它们适用于不同的场合。根据翻译的不同,装饰模式也有人称之为“油漆工模式”。
策略模式是一种对象结构型模式。
装饰模式包含如下角色:
Component
: 抽象构件ConcreteComponent
: 具体构件Decorator
: 抽象装饰类ConcreteDecorator
: 具体装饰类首先定义一个抽象构件接口:
/**
* 抽象构件
* Created by blinkfox on 16-6-26.
*/
public interface Component {
// 接口方法
void operate();
}
然后是具体构件实现类:
/**
* 具体构件
* Created by blinkfox on 16-6-26.
*/
public class ConcreteComponent implements Component {
/**
* 具体实现方法
*/
@Override
public void operate() {
System.out.println("do Something...");
}
}
接着是装饰角色:
/**
* 装饰角色
* 维持一个指向Component对象的引用,并定义一个与 Component接口一致的接口。
* Created by blinkfox on 16-6-26.
*/
public class Decorator implements Component {
private Component component;
/**
* 通过构造函数传递被修饰者
* @param component
*/
public Decorator(Component component) {
this.component = component;
}
/**
* 委托给被修饰者执行
*/
@Override
public void operate() {
this.component.operate();
}
}
下面是具体的装饰类:
/**
* 具体的装饰类1
* Created by blinkfox on 16-6-26.
*/
public class ConcreteDecorator1 extends Decorator {
/**
* 通过构造函数传递被修饰者
* @param component
*/
public ConcreteDecorator1(Component component) {
super(component);
}
/**
* 定义自己的修饰方法1
*/
private void method1() {
System.out.println("method1修饰...");
}
/**
* 重写父类的operate方法
*/
public void operate() {
this.method1();
super.operate();
}
}
/**
* 具体的装饰类2
* Created by blinkfox on 16-6-26.
*/
public class ConcreteDecorator2 extends Decorator {
/**
* 通过构造函数传递被修饰者
* @param component
*/
public ConcreteDecorator2(Component component) {
super(component);
}
/**
* 定义自己的修饰方法2
*/
private void method2() {
System.out.println("method2修饰...");
}
/**
* 重写父类的operate方法
*/
public void operate() {
this.method2();
super.operate();
}
}
最后是客户端的场景类:
/**
* 装饰模式的客户端场景类
* Created by blinkfox on 16-6-26.
*/
public class Client {
public static void main(String[] args) {
Component component = new ConcreteComponent();
// 第一修饰
component = new ConcreteDecorator1(component);
// 第二修饰
component = new ConcreteDecorator2(component);
// 修饰后运行
component.operate();
}
}
装饰模式的优点:
装饰模式的缺点:
在以下情况下可以使用装饰模式:
装饰模式的简化-需要注意的问题: