装饰者模式
允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰器模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。
装饰者模式有四个角色:
1)抽象构建(Component ):给出一个抽象接口,来规范被添加职责的对象;
2)具体构件(ConcreteComponent):定义一个将要接收附加责任的具体对象;
3)装饰抽象类(Decorator):持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口;
4)具体装饰对象(ConreteDecorator):负责给构件对象 ”贴上“附加的责任。起到给Component添加职责的功能。
要点:
1)装饰者和被装饰对象有相同的超类型。
2)可以用一个或多个装饰者包装一个对象。
3)装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的。
4)对象可以在任何时候被装饰,所以可以在运行时动态的,不限量的用你喜欢的装饰者来装饰对象。
5)装饰模式中使用继承的关键是想达到装饰者和被装饰对象的类型匹配,而不是获得其行为。
6)装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型。在实际项目中可以根据需要为装饰者添加新的行为,做到“半透明”装饰者。
结构图(Structure)
盖房子实例
namespace 装饰模式的实现
{
/// <summary>
/// 该抽象类就是房子抽象接口的定义,该类型就相当于是Component类型,是饺子馅,需要装饰的,需要包装的
/// </summary>
public abstract class House
{
//房子的装修方法--该操作相当于Component类型的Operation方法
public abstract void Renovation();
}
/// <summary>
/// 该抽象类就是装饰接口的定义,该类型就相当于是Decorator类型,如果需要具体的功能,可以子类化该类型
/// </summary>
public abstract class DecorationStrategy:House //关键点之二,体现关系为Is-a,有这这个关系,装饰的类也可以继续装饰了
{
//通过组合方式引用Decorator类型,该类型实施具体功能的增加
//这是关键点之一,包含关系,体现为Has-a
protected House _house;
//通过构造器注入,初始化平台实现
protected DecorationStrategy(House house)
{
this._house=house;
}
//该方法就相当于Decorator类型的Operation方法
public override void Renovation()
{
if(this._house!=null)
{
this._house.Renovation();
}
}
}
/// <summary>
/// PatrickLiu的房子,我要按我的要求做房子,相当于ConcreteComponent类型,这就是我们具体的饺子馅,我个人比较喜欢韭菜馅
/// </summary>
public sealed class PatrickLiuHouse:House
{
public override void Renovation()
{
Console.WriteLine("装修PatrickLiu的房子");
}
}
/// <summary>
/// 具有安全功能的设备,可以提供监视和报警功能,相当于ConcreteDecoratorA类型
/// </summary>
public sealed class HouseSecurityDecorator:DecorationStrategy
{
public HouseSecurityDecorator(House house):base(house){}
public override void Renovation()
{
base.Renovation();
Console.WriteLine("增加安全系统");
}
}
/// <summary>
/// 具有保温接口的材料,提供保温功能,相当于ConcreteDecoratorB类型
/// </summary>
public sealed class KeepWarmDecorator:DecorationStrategy
{
public KeepWarmDecorator(House house):base(house){}
public override void Renovation()
{
base.Renovation();
Console.WriteLine("增加保温的功能");
}
}
public class Program
{
static void Main()
{
//这就是我们的饺子馅,需要装饰的房子
House myselfHouse=new PatrickLiuHouse();
DecorationStrategy securityHouse=new HouseSecurityDecorator(myselfHouse);
securityHouse.Renovation();
//房子就有了安全系统了
//如果我既要安全系统又要保暖呢,继续装饰就行
DecorationStrategy securityAndWarmHouse=new HouseSecurityDecorator(securityHouse);
securityAndWarmHouse.Renovation();
}
}
}
总结
总结一下我对这个模式的看法,这个模式有点像包饺子,ConcreteComponent其实是饺子馅,Decorator就像饺子皮一样,包什么皮就有什么的样子,皮和皮也可以嵌套,当然我们生活中的饺子只是包一层。
其实手机也是一个装饰模式使用的好例子,以前我们的手机只是接打电话,然后可以发短信和彩信,我在装饰一个就可以拍照了。我们现在的手机功能很丰富,其结果也类似装饰的结果
。随着社会的进步,技术发展,模块化的手机也出现了,其设计原理也和“装饰模式”就更接近了。