装饰模式:动态给的类添加新的功能。
通常给类添加功能,是通过继承的方式实现,但如果需求多了,写的子类就太多了,会出现“子类爆炸”问题。
通常给类添加功能,是通过继承的方式实现,但如果需求多了,写的子类就太多了,会出现“子类爆炸”问题。
如:new PhoneCover(new PhoneSticker(new xxx...(stick)));一层层包装。
C#代码示例:
namespace 装饰模式Decorator
{
class Program
{
static void Main(string[] args)
{
/*
C#内置的Stream就是装饰模式。
FileStream fs = new FileStream(); //都是继承抽象类Stream
BufferedStream buffer = new BufferedStream(fs); //需要哪个就进行装饰处理
GZipStream gzip = new GZipStream(fs,CompressionLevel.Fastest); */
HuaweiPhone hw = new HuaweiPhone();
PhoneSticker stick = new PhoneSticker(hw); //贴膜装饰
PhoneCover cover = new PhoneCover(stick); //加外壳装饰
cover.Show();
}
}
//抽象实体
public abstract class Phone
{
public abstract void Show();
}
//具体实体
public class HuaweiPhone : Phone
{
public override void Show()
{
Console.WriteLine("华为手机.");
}
}
//抽象装饰
public abstract class PhoneDecorator : Phone
{
private Phone phone;
public PhoneDecorator(Phone phone)
{
this.phone = phone;
}
public override void Show()
{
phone.Show();
}
}
//具体装饰:手机贴膜
public class PhoneSticker : PhoneDecorator
{
public PhoneSticker(Phone phone) : base(phone)
{
}
public override void Show()
{
base.Show();
Stick();
}
public void Stick()
{
Console.WriteLine("装饰:贴膜啦~");
}
}
//具体装饰:手机加外壳
public class PhoneCover : PhoneDecorator
{
public PhoneCover(Phone phone) : base(phone)
{
}
public override void Show()
{
base.Show();
Covered();
}
public void Covered()
{
Console.WriteLine("装饰:加手机壳啦~");
}
}
}
运行结果:
装饰模式 面向抽象,这样就显得灵活多了。
如有不足之处,还请各位多多指教。