动态的给一个东西添加一些特别的职责。就添加成果来说,它对比生成子类更为灵活。
一、引言在软件开发中,我们经常想要对一类东西添加差此外成果,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时操作担任来实现的话,就需要界说无数的类,如StickerPhone(贴膜是手机类)、AccessoriesPhone(挂件手机类)等,这样就会导致 ”子类爆炸“问题,为了解决这个问题,我们可以使用装饰者模式来动态地给一个东西添加特别的职责。下面让我们看看装饰者模式。
二、装饰者模式的详细介绍 2.1 界说装饰者模式以对客户透明的方法动态地给一个东西附加上更多的责任,装饰者模式对比生成子类可以更灵活地增加成果。
2.2 装饰者模式实现这里以手机和手机配件的例子来演示装饰者模式的实现,具体代码如下:
/// <summary> /// 手机抽象类,即装饰者模式中的抽象组件类 /// </summary> public abstract class Phone { public abstract void Print(); } /// <summary> /// 苹果手机,即装饰着模式中的具体组件类 /// </summary> public class ApplePhone:Phone { /// <summary> /// 重写基类要领 /// </summary> public override void Print() { Console.WriteLine("开始执行具体的东西——苹果手机"); } } /// <summary> /// 装饰抽象类,要让装饰完全代替抽象组件,所以必需担任自Photo /// </summary> public abstract class Decorator:Phone { private Phone phone; public Decorator(Phone p) { this.phone = p; } public override void Print() { if (phone != null) { phone.Print(); } } } /// <summary> /// 贴膜,即具体装饰者 /// </summary> public class Sticker : Decorator { public Sticker(Phone p) : base(p) { } public override void Print() { base.Print(); // 添加新的行为 AddSticker(); } /// <summary> /// 新的行为要领 /// </summary> public void AddSticker() { Console.WriteLine("此刻苹果手机有贴膜了"); } } /// <summary> /// 手机挂件 /// </summary> public class Accessories : Decorator { public Accessories(Phone p) : base(p) { } public override void Print() { base.Print(); // 添加新的行为 AddAccessories(); } /// <summary> /// 新的行为要领 /// </summary> public void AddAccessories() { Console.WriteLine("此刻苹果手机有标致的挂件了"); } }
此时客户端挪用代码如下:
class Customer { static void Main(string[] args) { // 我买了个苹果手机 Phone phone = new ApplePhone(); // 此刻想贴膜了 Decorator applePhoneWithSticker = new Sticker(phone); // 扩展贴膜行为 applePhoneWithSticker.Print(); Console.WriteLine("----------------------\n"); // 此刻我想有挂件了 Decorator applePhoneWithAccessories = new Accessories(phone); // 扩展手机挂件行为 applePhoneWithAccessories.Print(); Console.WriteLine("----------------------\n"); // 此刻我同时有贴膜和手机挂件了 Sticker sticker = new Sticker(phone); Accessories applePhoneWithAccessoriesAndSticker = new Accessories(sticker); applePhoneWithAccessoriesAndSticker.Print(); Console.ReadLine(); }