分析&回答
装饰模式动态地给一个对象添加一些额外的职责,就增加功能来说,它比生成子类更灵活。 也可以这样说,装饰模式把复杂类中的核心职责和装饰功能区分开了,这样既简化了复杂类,有去除了相关类中重复的装饰逻辑。装饰模式没有通过继承原有类来扩展功能,但却达到了一样的目的,而且比继承更加灵活,所以可以说装饰模式是继承关系的一种替代方案。装饰模式解耦了核心和装饰功能,所以也是强调了松耦合。
实例代码讲解:
/**
* 最高接口,被装饰者和“装饰品”都继承于此
*/
abstract public class Component{
public abstract void Operation();
}
/**
* 具体的被装饰者
*/
public class Concretecomponent:Component{
public override void Operation(){
Console.Write("具体对象的装饰操作");
}
}
/**
* 装饰类
*/
abstract public class Decorator:Component(){
protected Component component;
public void SetComponent(Component component){
this.component = component;
}
public override void Operation(){
if(component!=null) component.Operation();
}
}
/**
* 具体的装饰类A
*/
public class ConcreteDecoratorA:Decorator{
private string addedState;
public override void Operation(){
base.Operation();
addedState="New State";
Console.Write("具体装饰A的操作(添加了新的状态)");
}
}
/**
* 具体的装饰类B
*/
public class ConcreteDecoratorB:Decorator{
public override void Operartion(){
base.Operation();
AddedBehavior();
Console.WriteLine("具体装饰B的操作(添加了新的方法)");
}
private void AddedBehavior(){
//添加新的行为
}
}
/**
* client端
* @param args
*/
static void Main(string[] args)
{
Concretecomponent c = new Concretecomponent();
Decorator d1 = new ConcreteDecoratorA();
Decorator d2 = new ConcreteDecoratorB();
d1.SetComponent(c);
d2.SetComponent(d1);//注意这里装饰的是d1,因为这里的d1是装饰了d1的c。
d2.Operation();
Console.ReadLine();
}
反思&扩展
喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!