在面向对象中,装饰模式的核心其实就是对类的封装。比较正规的说法就是:可以动态地扩展类的功能。
该模式中使用其他类(构建角色)对基本类(被装饰角色)进行封装的目的就是避免在不修改基本类的代码和不对基本类进行继承的情况下对基本类的功能的扩展。
(注:给定一个基本类,要对该类增加方法,无外乎就几种方法,一个是直接修改类的代码,第二个写一个子类对这个基本类继承,再在子类中增加想要的方法,第三个就是写一个新的类对这个基本类进行封装。)
为了不让这两个类(构建角色和被装饰角色)解耦,利用面向接口编程,使用统一的接口。
代码
接口Component
public interface Component {
public abstract void Operation();
}
将要被扩展的类ConcreteComponent
public class ConcreteComponent implements Component{
@Override
public void Operation() {
// TODO Auto-generated method stub
System.out.println("执行具体对象");
}
}
装饰的基本类
public class Decorator implements Component{
private Component m;
public void SetComponent(Component m){
this.m=m;
}
@Override
public void Operation() {
// TODO Auto-generated method stub
if(m!=null){
m.Operation();
}
}
}
用于装饰的类A
public class ConcreteDecoratorA extends Decorator{
private String addedStateString;
public void Operation(){
super.Operation();
addedStateString="进行了状态属性的装饰";
System.out.println(addedStateString);
}
}
用于装饰的类B
public class ConcreteDecoratorB extends Decorator {
public void Operation(){
super.Operation();
b();
}
private void b(){
System.out.println("进行了操作行为装饰");
}
}
最后控制台使用
public class main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Component c_cComponent=(Component) new ConcreteComponent();
ConcreteDecoratorA c_cdA=new ConcreteDecoratorA();
ConcreteDecoratorB c_cdB=new ConcreteDecoratorB();
c_cdA.SetComponent(c_cComponent);
c_cdB.SetComponent(c_cdA);
c_cdB.Operation();
}
}