装饰者模式是一种结构型模式,在不改变对象现有结构的条件下,动态的添加其他的职责的模式,就像早餐吃山东煎饼,可以加鸡蛋,加蔬菜等,但是不管怎么添加都不会影响它还是煎饼这样一个事实。所以要强调的是 不改变对象现有结构下的添加。
实例如下:
namespace Designmode.Decorator
{
/// <summary>
/// Food的抽象接口
/// </summary>
public interface IFood
{
/// <summary>
/// 吃食物的方法
/// </summary>
void Eat();
}
}
namespace Designmode.Decorator
{
/// <summary>
/// 煎饼的具体food实现
/// </summary>
public class JianBing : IFood
{
/// <summary>
/// 吃煎饼
/// </summary>
public void Eat()
{
Console.WriteLine("吃煎饼");
}
}
}
namespace Designmode.Decorator
{
/// <summary>
/// 煎饼的装饰类
/// </summary>
public abstract class JianBingDecorator : IFood
{
/// <summary>
/// 与需要装饰的类形成组合关系
/// </summary>
protected IFood _jianbing = null;
/// <summary>
/// 附加物
/// </summary>
protected string _addtion;
/// <summary>
/// 吃煎饼
/// </summary>
public abstract void Eat();
/// <summary>
/// 吃煎饼
/// </summary>
public abstract void SetAddtion(string addtion);
}
}
namespace Designmode.Decorator
{
/// <summary>
/// 加蛋的煎饼
/// </summary>
public class JianBingWithEgg : JianBingDecorator
{
/// <summary>
/// 构造一个加蛋的煎饼实例
/// </summary>
/// <param name="jianbing">原煎饼</param>
public JianBingWithEgg(IFood jianbing)
{
this._jianbing = jianbing;
}
/// <summary>
/// 吃煎饼
/// </summary>
public override void Eat()
{
ShowAddition();
this._jianbing.Eat();
}
/// <summary>
/// 设置添加物
/// </summary>
/// <param name="addtion">添加物</param>
public override void SetAddtion(string addtion)
{
this._addtion = addtion;
}
/// <summary>
/// 显示添加物
/// </summary>
public void ShowAddition()
{
Console.WriteLine($"add {this._addtion}");
}
}
}
在C#语法中,扩展方法的语法,可以对装饰者模式有个很好的而实现。扩展方法允许在现有的类型上扩展新的方法可以无需修改原始类型的定义,扩展方法是静态类的静态方法,其第一个参数需要用this装饰符修饰,且第一个参数的类型是需要扩展的类型。
namespace Demo
{
/// <summary>
/// 数组扩展方法
/// </summary>
public static class ArrayExtensions
{
/// <summary>
/// 复制一份二维数组的副本
/// </summary>
public static byte[,] Copy(this byte[,] bytes)
{
int width = bytes.GetLength(0), height = bytes.GetLength(1);
byte[,] newBytes = new byte[width, height];
Array.Copy(bytes, newBytes, bytes.Length);
return newBytes;
}
}
}