自学内容网 自学内容网

c#代码介绍23种设计模式_09装饰者模式

目录

1、装饰者模式定义

2、装饰者模式实现

3、在装饰者模式中各个角色

4、装饰者模式的优缺点

5、使用场景

6、实现思路


在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,
如StickerPhone(贴膜是手机类)、AccessoriesPhone(挂件手机类)等,这样就会导致 ”子类爆炸“问题,为了解决这个问题,我们可以使用装饰者模式来动态地给一个对象添加额外的职责

1、装饰者模式定义

装饰者模式以对客户透明的方式动态地给一个对象附加上更多的责任,装饰者模式相比生成子类可以更灵活地增加功能。

2、装饰者模式实现

手机抽象类(Phone) => 手机实现类(ApplePhone) =>装饰类创建继承Phone(Decorator) =>增加的贴膜挂件继承装饰类

3、在装饰者模式中各个角色

1)抽象构件(Phone)角色:给出一个抽象接口,以规范准备接受附加责任的对象。
2)具体构件(AppPhone)角色:定义一个将要接收附加责任的类。
3)装饰(Dicorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
4)具体装饰(Sticker和Accessories)角色:负责给构件对象 ”贴上“附加的责任。

4、装饰者模式的优缺点

优点:
1)装饰这模式和继承的目的都是扩展对象的功能,但装饰者模式比继承更灵活
2)通过使用不同的具体装饰类以及这些类的排列组合,设计师可以创造出很多不同行为的组合
3)装饰者模式有很好地可扩展性
缺点:
装饰者模式会导致设计中出现许多小对象,如果过度使用,会让程序变的更复杂。并且更多的对象会是的差错变得困难,特别是这些对象看上去都很像。

5、使用场景

1)需要扩展一个类的功能或给一个类增加附加责任。
2)需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
3)需要增加由一些基本功能的排列组合而产生的非常大量的功能

装饰者模式采用对象组合而非继承的方式实现了再运行时动态地扩展对象功能的能力,而且可以根据需要扩展多个功能,避免了单独使用继承带来的 ”灵活性差“和”多子类衍生问题“。
同时它很好地符合面向对象设计原则中 ”优先使用对象组合而非继承“和”开放-封闭“原则

6、实现思路

个人理解:
1、Phone => ApplePhone
            -> override void Print()
      => abstract class Decorator(装饰类)  => Sticker(贴膜) : Decorator
            -> Decorator(Phone p)               -> Sticker(Phone p)
            -> override void Print()            -> override void Print()
                  -> phone.Print();                    -> base.Print();
                                                       -> 添加贴膜的行为

                                           => Accessories(贴膜) : Decorator
                                                -> Accessories(Phone p)
                                                -> override void Print()
                                                       -> base.Print();
                                                       -> 添加手机挂件的行为

2、客户端
   //我买了个苹果手机
   Phone phone = new ApplePhone();
   //现在想贴膜了
   Decorator applePhoneWithSticker = new Sticker(phone);
   //扩展贴膜行为
   applePhoneWithSticker.Print();    //Print方法中又调用贴膜的函数

✳详细的代码实现,请点击资源绑定


原文地址:https://blog.csdn.net/soarfeng/article/details/142577504

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!