设计模式-结构型-装饰模式(Decorator)
将对象放入包含其他方法的对象中,为原始对象绑定新的行为方法。
文章目录
一、装饰模式(Decorator)
装饰模式又叫装饰着模式,装饰器模式,使一种结构型设计模式,通过将原始对象放入包含其他行为方法的类中,来为原始对象绑定新的扩展行为。
装饰器的核心是功能扩展,比继承要更加灵活。
二、应用场景
- 扩展类的功能,或者给类添加附加行为方法
- 动态的给对象添加功能,这些功能可以动态的撤销
- 需要为同级类修改功能或者增加功能。
三、角色解析
装饰器的角色分配复合里氏替换原则,依赖倒置原则。具备很强的扩展性。
- 抽象组件(Component):充当装饰类的原始对象,规定被装饰对象的行为,可以是抽象或接口。
- 具体组件(ConcreteComponent):实现||继承Component的具体对象,是被装饰的对象。
- 抽象装饰器(Decorator):通用的具体组件装饰器,内部必有抽象组件的属性,实现一般是抽象类,强制统一通用行为。如果逻辑单一此抽象可以省略,直接实现具体装饰器。
- 具体装饰器ConcreteDecorator():抽象装饰器的具体实现。
四、使用步骤
1.抽象组件
代码如下(示例):抽象组件
/// <summary>
/// 抽象组件
/// 声明封装器和被封装对象的公用接口
/// </summary>
public interface IComponent
{
public void SendMSG(string msg);
}
2.组件功能的实现类
代码如下(示例):组件功能的实现类
/// <summary>
/// 组件功能的实现类
/// </summary>
public class SendMessageComponent : IComponent
{
public void SendMSG(string msg)
{
Console.WriteLine($"发送消息:{msg}");
}
}
3.抽象装饰类
代码如下(示例):基础装饰类,抽象方法,定义装饰类操作规则。
/// <summary>
/// 基础装饰类
/// </summary>
public abstract class BaseDecorator : IComponent
{
private IComponent component;
public BaseDecorator(IComponent component)
{
this.component = component;
}
public abstract void SendMSG(string msg);
}
4.实现装饰类
代码如下(示例):邮箱具体装饰类
/// <summary>
/// 邮箱具体装饰类
/// </summary>
public class EmailDecorator : BaseDecorator
{
private IComponent component;
public EmailDecorator(IComponent component) : base(component)
{
this.component = component;
}
public override void SendMSG(string msg)
{
Console.Write("使用Email---");
this.component.SendMSG(msg);
}
}
代码如下(示例):微信具体装饰类
/// <summary>
/// 微信具体装饰类
/// </summary>
public class WeChartDecorator : BaseDecorator
{
private IComponent component;
public WeChartDecorator(IComponent component) : base(component)
{
this.component = component;
}
public override void SendMSG(string msg)
{
Console.Write("使用WeChart---");
this.component.SendMSG(msg);
}
}
5.客户端调用
代码如下(示例):客户端调用
/// <summary>
/// 客户端调用方
/// </summary>
public class ClientSendMsg
{
private IComponent component;
public void doTestClient()
{
var Component = new SendMessageComponent();
new EmailDecorator(Component).SendMSG("邮箱提醒消息");
new WeChartDecorator(Component).SendMSG("微信提醒消息");
}
}
扩展消息发送方式可增加实现装饰类实现扩展,扩展装饰类需要遵循抽象装饰类的标准。
五、优缺点
1.优点
比继承更加灵活,再不改变原有对象的情况下,动态的给对象扩展功能,即插即用。
使用不同装饰类及这些装饰类的排列组合,可以实现不同效果
完全遵循开闭原则
2.缺点
出现大量的具体装饰类,增加了程序的复杂性。
动态装饰再多层装饰使会更复杂。
总结
`装饰模式,更注重类自身的扩展,灵活的为对象添加新功能,灵活扩展,同宗同源。