一、引言
移动互联时代,手机的使用已经几乎普及到每个人,但是大家有没有想过为什么买的手机通常不会带有贴膜、保护壳?嗯,这个很容易理解,因为这些东西属于装饰手机的配件,买到的手机核心职责和行为已经实现了,至于想怎么装饰手机,有的人想给手机配个钥匙链挂着,有的人想给手机再加一层手机包装起来等等。面对这些特殊的手机装饰行为,如果手机的厂商一 一去全部实现,会造成生产过程极其复杂,增加成本,所以买到的手机通常不会带有这些装饰。还有一个现象,淘宝上买手机时为什么默认显示的价格不是手机附带不同个数、种类配件的价格?显然这样的排列组合太多了,通过继承的预编译计算方式是不适用的(这里不适用主要指的是占用页面空间太多),它是采用选择不同配件时(运行时)才进行计算的方式。其实在软件开发中,也会经常存在一类对象添加不同功能的现象。如果将每个功能都添加到主类中,会增加主类的复杂度,不符合程序设计思想,那我们是不是可以把某些特定情况下执行的特定行为分离出去呢?下面请看我们今天学习的装饰模式是如何很好的解决这个问题的:
二、装饰模式
定义:以对客户透明的方式动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活
下面是代码demo:
//手机抽象类 抽象组件类,对象接口 public abstract class BasePhone { public abstract void Print(); }
//苹果手机类 具体组件类 public class ApplePhone:BasePhone { public override void Print() { Console.WriteLine("我是苹果手机"); } }
//装饰抽象类 装饰完全取代抽象组件,从外部扩展抽象组件,抽象组件类不需要知道装饰抽象类存在 public abstract class BaseDecoratorPhone:BasePhone { private BasePhone phone; public BaseDecoratorPhone(BasePhone basePhone) { this.phone = basePhone; } public override void Print() { if (phone != null) { phone.Print(); } } }
//手机壳类 具体的装饰者类 class CaseDecorator : BaseDecoratorPhone { private BasePhone phone; public CaseDecorator(BasePhone phone) : base(phone) { this.phone = phone; } public override void Print() { base.Print(); //添加新行为 AddCase(); } public void AddCase() { Console.WriteLine("给手机{0}带上保护壳",phone.GetType().Name); } }
//贴膜类 具体装饰者类 class StickerDecorator:BaseDecoratorPhone { private BasePhone phone; public StickerDecorator(BasePhone phone) : base(phone) { this.phone = phone; } public override void Print() { base.Print(); //添加新的行为 AddSticker(); } public void AddSticker() { Console.WriteLine("给手机{0}贴膜",phone.GetType().Name); } }
static void Main(string[] args) { //买一个苹果手机 BasePhone phone = new ApplePhone(); //买一个手机壳 BaseDecoratorPhone caseDecorator = new CaseDecorator(phone); //给手机添加手机壳 caseDecorator.Print(); BaseDecoratorPhone stickerDecorator = new StickerDecorator(phone); stickerDecorator.Print(); //同时想给手机添加手机壳 添加贴膜 BaseDecoratorPhone stickerAndCaseDecorator = new StickerDecorator(caseDecorator); stickerAndCaseDecorator.Print(); Console.Read(); }
优点:
1.装饰者模式将类的核心职责与装饰功能分离,简化原有类,去除相关类中的重复逻辑;
2.与继承都是扩展对象的功能,但比继承更具有灵活性
缺点:装饰类之间彼此独立,过度使用会产生很多对象,不宜排错
使用场景:
1.需要动态给一个对象附加职责
2.需要增加一些功能的排列组合产生非常大量的功能
关于装饰者模式的学习就到此结束了,希望能够帮到你,若有不足,欢迎斧正,感谢您的阅读。