一、介绍
意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
主要解决:使用继承实现类的功能的扩展,有时子类会过多的问题。
应用实例:
1、一幅照片,将它放入玻璃相框里,就具有了防水的功能
分类:属于结构型设计模式。
二、实现
装饰模式
类图:
核心思想:
Source类是被装饰类,Decorator类是一个装饰类,可以为Source类动态的添加一些功能
.NET实现代码:
public interface ISourceable
{
void Method();
}
public class Source : ISourceable
{
public void Method()
{
Console.WriteLine("装饰模式 Source Method() 原始方法");
}
}
public class Decorator : ISourceable
{
private ISourceable Source { get; set; }
public Decorator(ISourceable source)
{
this.Source = source;
}
public void Method()
{
Console.WriteLine("装饰模式 Decorator Method() 之前");
Source.Method();
Console.WriteLine("装饰模式 Decorator Method() 之后");
}
}
public class DecoratorTest
{
public static void Test()
{
ISourceable obj = new Decorator(new Source());
obj.Method();
}
}
输出:
装饰模式 Decorator Method() 之前
装饰模式 Source Method() 原始方法
装饰模式 Decorator Method() 之后
三、总结
装饰器模式的应用场景:
1、需要扩展一个类的功能。
2、动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)
缺点:产生过多相似的对象,不易排错!
参考资料:
23种设计模式全解析 https://www.cnblogs.com/geek6/p/3951677.html
Java之美[从菜鸟到高手演练] https://blog.csdn.net/zhangerqing