《C#设计模式》【装饰者模式】

一:案例场景

在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给房子添加安防,房子暖气,房子防水等,如果此时利用继承来实现的话,就需要定义无数的类,如HouseSecuity(安防类)、HouseWarm(暖气类)等,这样就会导致 ”子类爆炸“问题,为了解决这个问题,我们可以使用装饰者模式来动态地给一个对象添加额外的职责。下面让我们看看装饰者模式。

二:概念定义 

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

 三:案例解析

以建房子的场景来举例,具体实现方式代码如下!

//定义房子抽象类,即装饰者模式中的抽象组件类
public abstract class House
{
   public abstract void SetHouse();
}
 //具体类型,建粉色的房子,即装饰着模式中的具体组件类
 public sealed class PinkHouse : House
    {
        public override void SetHouse()
        {
             
        }
    }

 

  // 装饰抽象类,要让装饰完全取代抽象组件,所以必须继承自House
  public abstract class GetHouseModel : House
    {
        public House house;
        public GetHouseModel(House houses)
        {
            this.house = houses;
        }

        public override void SetHouse()
        {
            if (house == null)
            {
                this.house.SetHouse();
            } 
        }
    }
//添加安防,具体装饰者
 public sealed class HouseSecutity : GetHouseModel
    {
        public HouseSecutity(House house) : base(house) { }
        public override void SetHouse()
        {
            base.SetHouse();
            SetSecutity();
        }
        public void SetSecutity()
        {
            
        }
    }


//添加暖气,具体装饰者
public sealed class HosueWarm: GetHouseModel
    {
        public HosueWarm(House house) : base(house) { }
        public override void SetHouse()
        {
            base.SetHouse();
            SetWarm();
        }
        public void SetWarm()
        {

        }
    }

 

四:具体调用

   public ObservermMode()
        {
            House _house = new PinkHouse();
            GetHouseModel getHouse = new HouseSecutity(_house);
            getHouse.SetHouse();

            getHouse = new HosueWarm(_house);
            getHouse.SetHouse();
            
            HouseSecutity secutity = new HouseSecutity(_house);
            HosueWarm warm = new HosueWarm(secutity);
            warm.SetHouse();

        }

 

以上便是装饰者模式的全部内容,综上所述,从上客户端代码可以看出,客户端可以动态地将房子装修项目(安防,暖气)增加到房子上,如果需要添加房子安防时,此时只需要添加一个继承GetHouseModel的手机外壳类,从而,装饰者模式扩展性也非常好。 

五:总结

在装饰者模式中各个角色有:

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

优点:

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

缺点

装饰者模式会导致设计中出现许多小对象,如果过度使用,会让程序变的更复杂。并且更多的对象会是的差错变得困难,特别是这些对象看上去都很像。

应用场景:

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

     

六:课后与练习

利用装饰者模式完成对汽车Car的装饰,汽车买下来之后需要安装座套,行车记录仪,还需要安装脚垫等等东西。请用装饰者模式设计并完成内容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章