装饰模式 | 青训营笔记

75 阅读2分钟

装饰模式(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方法。
}

小结

装饰模式用于为已有功能动态地添加更多的功能,其主要优势为:将装饰的功能从类中移出去,简化原有繁杂的类,有效的将核心职责和装饰功能区分开了,当需要时将其动态的组装起来

image.png