1、装饰器模式定义:动态地给一个对象添加一些额外的功能职责,就增加功能来说,装饰器模式要比生成子类更加灵活。
2、装饰器模式实现:在装饰器模式的实现中,为了能够实现和原来使用被装饰对象的代码无缝隙结合,是通过定义一个抽象类,让这个类实现与被装饰对象相同的接口,然后在具体实现中,转调被装饰的对象。在转调的前后添加新的功能,这就实现了给被装饰的对象添加新功能。这个思路与“对象组合”非常相似。
3、装饰器的结构和说明:有以下几个部分
Component:组件对象的接口。可以给这些对象动态的添加职责。
ConcreteComponent:具体的组件对象,实现组件对象的接口。通常就是被装饰对象的原始对象。也就是可以给这些对象添加新职责。
Decorate:所有装饰器的抽象父类,需要定义一个与组件接口一致的接口,并持有一个Component对象,其实就是持有一个被装饰对象。
ConcreteDecorate:实际的装饰器对象,实现具体的要向被装饰的对象的添加的功能。
4,装饰器模式示例代码:
(1),组件对象的接口定义,示例代码如下:
package com.nacey.decorate;
/**
* 组件对象接口
* @author Administrator
*
*/
public abstract class Component {
/**
* 示例方法
*/
public abstract String say(String s);
}
(2)定义组件接口后实现组件对象接口,示例代码如下:
package com.nacey.decorate;
/**
* 具体的实现组件对象接口的对象
* @author Administrator
*
*/
public class ConcreteComponent extends Component {
@Override
public String say(String s) {
// TODO Auto-generated method stub
System.out.println("===>"+s);
return s;
}
}
(3)抽象的装饰器,示例代码如下:
package com.nacey.decorate;
/**
* 装饰器接口,维持一个指向组件对象的接口对象。并定义与组件对象一致的接口
* @author Administrator
*
*/
public abstract class Decorate extends Component{
/**
* 持有组件对象
*/
private Component component;
/**
* 构造方法持有组件对象
* @param component
*/
public Decorate(Component component){
this.component = component;
}
public String say(String s){
//转发请求给组件对象,可以在转发之前执行一些其他的动作。
return component.say(s);
}
}
(4)具体的装饰器对象的实现对象,示例代码如下:
package com.nacey.decorate;
/**
* 装饰器的具体实现对象,向组件对象添加职责
* @author Administrator
*
*/
public class ConcreteDecoration extends Decorate {
public ConcreteDecoration(Component component) {
super(component);
// TODO Auto-generated constructor stub
}
/**
* 添加状态
*/
private String addedState;
public String getAddedState() {
return addedState;
}
public void setAddedState(String addedState) {
this.addedState = addedState;
}
public String say(String s){
//调用父类的方法,可以在调用前后添加其他的动作
return super.say(s);
}
}
以上就是简单的描述了装饰器模式中涉及到的各组件对象接口及实现类。