Decorator装饰模式

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。

eg:,我们买了一部手机,慢慢的给这部手机添加新的装饰,比如说贴膜,添加挂件等。

装饰模式角色:

(1)抽象构件角色:给出一个抽象接口,以规范准备接收附加责任的对象。

   public abstract class Phone
   {
     public abstract void BuyPhone ();
   }

(2)具体构件角色:定义一个将要接收附加责任的类。


   public class ApplePhone:Phone
   {
     public override void BuyPhone ()
     {
       Console.WriteLine( "我买了一个苹果手机" );
     }
   }
(3)装饰角色:持有一个构件对象的实例,并实现一个与抽象构件接口一致的接口。

   public abstract class Decorator:Phone
   {
     private Phone p ;  //该装饰对象装饰到的Phone组件实体对象
   
     public Decorator(Phone p)
     {
       this .p = p;
     }
     public override void BuyPhone()
     {
       if ( this .p != null )
       {
         p.BuyPhone();
       }
     }
   }
(4)具体装饰角色:负责给构件对象添加上附加的责任。

   public class Sticker:Decorator
   {
     public Sticker(Phone p) : base (p) { }
     public override void BuyPhone ()
     {
       base .BuyPhone();
       // 添加新的 行为
       AddSticker();
     }
     public void AddSticker()
     {
       Console.WriteLine( "现在苹果手机有贴膜了" );
     }
   }
   public class Accessories:Decorator
   {
     public Accessories(Phone p) : base (p) { }
     public override void BuyPhone ()
     {
       base .BuyPhone();
       // 添加新的行为
       AddAccessories();
     }
     public void AddAccessories()
     {
       Console.WriteLine( "现在苹果手机有漂亮的挂件了" );
    
   }


 调用:  Phone ap = new ApplePhone(); //新买了个苹果手机
     Decorator aps = new Sticker(ap); //准备贴膜组件
     aps.BuyPhone();

     Decorator apa =newAccessories(ap);//过了几天新增了挂件组件
     apa.BuyPhone();

     Sticker s = new Sticker(ap);    //准备贴膜组件
     Accessories a = new Accessories(s); //同时准备挂件
     a.BuyPhone();

优点:

1. 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。
2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

缺点:

1. 这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。
2. 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值