装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象添加功能。通常给对象添加功能,要么直接修改对象添加相应的功能,要么派生对应的子类来扩展,抑或是使用对象组合的方式。显然,直接修改对应的类这种方式并不可取。在面向对象的设计中,而我们也应该尽量使用对象组合,而不是对象继承来扩展和复用功能。装饰器模式就是基于对象组合的方式,可以很灵活的给对象添加所需要的功能。装饰器模式的本质就是动态组合。动态是手段,组合才是目的。总之,装饰模式是通过把复杂的功能简单化,分散化,然后再运行期间,根据需要来动态组合的这样一个模式。
来段代码看看吧
1. 组件接口
package designpattern.decorator;
/**
* 组件接口
*
* @author king
*/
public abstract class Component {
//接口中的方法
abstract void operation();
}
2.组件的实现类
/**
* 组件的实现类
*
* 被装饰的类
*
* @author king
*
*/
public class ComponentImpl extends Component{
//组件中运行的方法
@Override
public void operation() {
System.out.println("组件正在运转");
}
}
3.抽象装饰器类
/**
*
* 抽象装饰器类
*
* @author king
*
*/
public abstract class AbstractDecorator extends Component {
protected Component component;
public AbstractDecorator(Component component){
this.component = component;
}
@Override
void operation(){
component.operation();//调用组件的一些方法
}
}
4. 装饰器的具体实现类
/**
* 装饰器的具体实现类
*
* @author king
*
*/
public class ConcreteDecorator extends AbstractDecorator {
public ConcreteDecorator(Component component) {
super(component);
}
@Override
//被增强的方法
void operation() {
System.out.println("执行组件之前.....");
super.operation();
System.out.println("执行组件之后.....");
}
}
5. 运行类
public class Main {
public static void main(String[] args) {
//实例 化一个组件
Component component = new ComponentImpl();
//对组件中用到的方法进行曾强
AbstractDecorator componentAdvise = new ConcreteDecorator(component);
//调用增强后的方法
componentAdvise.operation();
}
}
运行结果
执行组件之前.....
组件正在运转
执行组件之后.....
想到什么? Aop 对不对,是不是。
待续<aop的JVM 和 cglib 实现>
参考文档 <http://blog.csdn.net/hust_is_lcd/article/details/7884320>