装饰模式(Decorator) :动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。 适用于:需要把所需的功能按正确的顺序串联起来进行控制。
1. 装饰模式的C#实现:
Component类:
abstract class Component{
public abstract void Operation();
}
ConcreteComponent类:
class ConcreteComponent : Component{
public override void Operation(){
Console.WriteLine("实际对象操作!");
}
}
Decorator类:
abstract class Decorator : Component{
protected Component component;
public void SetComponent(Component component){
this.component = component;
}
public override void Operation(){
if(component != null){
component.Operation();
}
}
}
ConcreteDecoratorA类:
class ConcreteDecoratorA : Decorator{
private string addState; //本类添加功能
public override void Operation(){
base.Operation();
addState = "New State";
Console.WriteLine("实际装饰对象A的操作!");
}
}
ConcreteDecoratorB类:
class ConcreteDecoratorB : Decorator{
public override void Operation(){
base.Operation();
AddBehavior();
Console.WriteLine("实际装饰对象B的操作!");
}
private void AddBehavior(){
//本类添加功能
}
}
测试类:
static void Main(string[] args){
ConcreteComponent component = new ConcreteComponent();
ConcreteDecoratorA decoratorA = new ConcreteDecoratorA();
ConcreteDecoratorB decoratorB = new ConcreteDecoratorB();
decoratorA.setComponent(component);
decoratorB.setComponent(decoratorA);
decoratorB.Operation();
//首先实例化对象component,然后用包装类对象decoratorA来包装component,
//然后用decoratorB来包装decoratorA,最后执行decoratorB的Operation方法。
}
装饰模式的本质理解:利用setComponent来对对象进行包装,每个装饰对象的实现和如何使用这个对象分离开了,每个装饰对象只需关心自己的功能,无需关心如何被添加道对象链当中。
装饰模式可以没有抽象类Component类,直接使Decorator类继承自ConcreteComponent类。
2. 装饰模式的Java实现:
Component类:
public interface Component{
void operation();
}
ComponentImp类:
public class ComponentImp extends Component{
@Override
public void operation(){
//实际对象操作
}
}
Decorator类:
public class Decorator extends Component{
protected Component component;
public void setComponent(Component component){
this.component = component;
}
@Override
public void operation(){
if(component != null){
component.operation();
}
}
}
DecoratorImpA类:
public class DecoratorImpA extends Decorator{
private String addState; //本类添加功能
@Override
public void Operation(){
super.operation();
addState = "New State";
//装饰类A添加的操作
}
}
DecoratorImpB类:
public class DecoratorImpB extends Decorator{
@Override
public override void Operation(){
super.Operation();
AddBehavior();
//装饰类B添加的操作
}
private void AddBehavior(){
//本类添加功能
}
}
测试类:
public static void main(String[] args){
Component component = new ComponentImp();
Decorator decoratorA = new DecoratorImpA();
Decorator decoratorB = new DecoratorImpB();
decoratorA.setComponent(component);
decoratorB.setComponent(decoratorA);
decoratorB.operation();
//首先实例化对象component,然后用包装类对象decoratorA来包装component,
//然后用decoratorB来包装decoratorA,最后执行decoratorB的Operation方法。
}
小结
装饰模式用于为已有功能动态地添加更多的功能,其主要优势为:将装饰的功能从类中移出去,简化原有繁杂的类,有效的将核心职责和装饰功能区分开了,当需要时将其动态的组装起来。