装饰模式,动态的给一个对象添加职责,就添加功能而言,装饰模式比生成子类更加灵活。
- 定义一个接口Component,可以给这些对象动态的添加职责。
- 定义一个具体的对象ConcreteComponent,可以给这个对象添加一些职责。
- Decorator装饰抽象类,继承了Component从外类来扩展Component的功能。
- ConcreteDecorator具体的装饰类,起到给Component增加职责的功能。
Component是定义一个接口,可以给这些对象动态的添加职责,ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责。Decorator是装饰的抽象类,继承了Component类,从外类给Component类扩展功能,但对于Component而言是无需知道他的存在的。至于ConcreteDecorator是具体的装饰类,起到给Component添加功能的作用。
- Component类
package com.sun.chapter03;
/**
* 定义一个借口,使用这个接口可以给对象动态的增加一些职责
* @author sun
*/
public abstract class Component {
public abstract void Operation();
}
- ConcreteComponent类
package com.sun.chapter03;
/**
* 定义了一些具体的对象,可以给这些对象添加一些职责
* @author sun
*/
public class ConcreteComponent extends Component {
@Override
public void Operation() {
System.out.println("具体对象的操作!");
}
}
- Decorator 类
package com.sun.chapter03;
/**
* 装饰抽象类,继承了Component从外类来扩展Component类的功能职责,
* 但对Component来说无需知道Decorator的存在
* @author sun
*/
public class Decorator extends Component {
protected Component component;
public void setComponent(Component component){
this.component = component;
}
//重写Operation方法,实际执行的是Component的Operation方法
@Override
public void Operation() {
if(component != null){
component.Operation();
}
}
}
- ConcreteDecoratorA类
package com.sun.chapter03;
/**
* 具体的装饰对象,起到给Component添加职责的功能
* @author sun
*/
public class ConcreteDecoratorA extends Decorator{
private String addDecoratorA;
@Override
public void Operation() {
//首先运行原来的Operation
super.Operation();
addDecoratorA = "+DecoratorA";
System.out.println("DecoratorA的操作!");
}
}
- ConcreteDecoratorB类
package com.sun.chapter03;
/**
* 具体的装饰对象,起到给Component添加职责的功能
* @author sun
*/
public class ConcreteDecoratorB extends Decorator {
@Override
public void Operation() {
// 首先执行原Operation方法
super.Operation();
DecoratorB();
System.out.println("DecoratorB的具体操作!");
}
public String DecoratorB(){
return "DecoratorB的方法!";
}
}
小结,装饰模式是利用SetComponent来对对象进行包装,为已有功能增加更多功能的一种方法。装饰模式可以有效的把类中的核心功能和装饰功能分离开,而且可以去除相关类中重复的逻辑。