动态地给对象添加一些额外的职责功能
主要组成:
Component-抽象父类(接口)
ConcreteComponent-具体对象
Decorator-装饰父类
ConcreteDecorator-具体装饰类
装饰与适配器区别:
- 装饰仅改变对象的职责,不改变对象的接口。
- 适配器给对象一个新的接口。
装饰和组合的区别:
- 组合目的在于对象的聚集。
- 装饰目的在于动态为对象添加职责。
相关类定义:
using System;
namespace Decorator
{
/// <summary>
/// 文本抽象类(可为接口)
/// </summary>
abstract class TextComponent
{
public abstract void Show();
}
/// <summary>
/// 文本
/// </summary>
class MyText : TextComponent
{
public override void Show()
{
Console.WriteLine("文本");
}
}
/// <summary>
/// 文本风格装饰
/// </summary>
class TextStyleDecorator : TextComponent
{
TextComponent myText;
public TextStyleDecorator(TextComponent text)
{
myText = text;
}
public override void Show()
{
myText.Show();
}
}
/// <summary>
/// 加粗装饰
/// </summary>
class BoldDecorator : TextStyleDecorator
{
public BoldDecorator(TextComponent text)
: base(text)
{
}
public override void Show()
{
base.Show();
Console.WriteLine("文本加粗");
}
}
/// <summary>
/// 加下划线装饰
/// </summary>
class UnderlineDecorator : TextStyleDecorator
{
public UnderlineDecorator(TextComponent text)
: base(text)
{
}
public override void Show()
{
base.Show();
Console.WriteLine("文本加下划线");
}
}
}
调用:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Decorator
{
class Program
{
static void Main(string[] args)
{
TextComponent myText = new MyText();
//文本加粗
BoldDecorator boldDecorator = new BoldDecorator(myText);
boldDecorator.Show();
Console.WriteLine("*********");
//文本加下划线
UnderlineDecorator underlineDecorator = new UnderlineDecorator(myText);
underlineDecorator.Show();
}
}
}
结果:
参考资料:《设计模式-可复用面对对象软件的基础》