- 装饰模式概述
定义:动态地给一个对象增加一些附属的职责。
装饰装饰,自然的理解就是在原有物品的基础上,增加一些别的东西,让它变得更令人满意。且装饰模式是在不改变对象本身的基础上就行额外的增加,更加灵活。
比如买房,首先买的是个空房,随后我们会放进去家具,和各种生活中要用的东西,让这个家变得更有家的味道,这就是装饰。我们也没有改变房子的结构。下次,也可以重新对家具进行布局,变成另外的风格
- 装饰模式的结构和实现
Component(抽象构件): (空房):具体构件和抽象装饰类的父类,声明了具体构件中的业务方法
1 abstract class Component 2 { 3 public abstract void Operation(); 4 }
ConcreteComponent(具体构件类):(刚买的北京二环内的一套房)抽象构件类的子类,用于定义具体的构件对象,实现在抽象构件中声明的方法。装饰类可以为它增加额外职责
1 class ConcreteComponent : Component 2 { 3 public override void Operation() 4 { 5 //功能实现 6 }
Decorator(抽象装饰类):(家具城)抽象构件类的子类,用来给具体构件增加职责
1 class Decorator :Component 2 { 3 private Component component;//抽象构件对象的引用 4 5 public Decorator(Component component) 6 { 7 this.component = component; 8 } 9 10 public override void Operation() 11 { 12 component.Operation();//调用原有业务方法 13 } 14 }
ConcreteDecorator(具体装饰类):(桌子 椅子 电器 床.......)抽象装饰类的子类,负责向构件增加新的职责
1 class ConcreteDecorator :Decorator 2 { 3 public ConcreteDecorator(Component component ):base (component) 4 { 5 } 6 7 public void AddedBehavir() 8 { 9 //新的业务方法 10 } 11 12 public override void Operation() 13 { 14 base.Operation();//调用原有方法 15 AddedBehavir();//调用新的方法 16 } 17 }
- 装饰模式的应用
现有一家咖啡店,可以根据客户需求提供对应的咖啡。咖啡{ {浓缩咖啡(Espresso),25},{混合咖啡(House Blend),30},{重烘焙咖啡(Dark Roast),20} }
配料{ {摩卡(Mocha),10} ,{奶泡(Whip),8 },{牛奶 (Milk),6} }
输出 浓缩咖啡,摩卡,牛奶 41
分析:这就是个混合搭配的情况,只要你有钱,一种咖啡想搭配多少种配料都可以,那我们算算,3种咖啡,3种配料,一共可以搭配出多少种不同的饮料呢???不难算出,一种咖啡可以有8种(2^3)搭配,那么3种咖啡共有24种。那么这题写出24种类不就行了。当然是可以的。用继承,也是可以的。但是,由于自由搭配的情况,导致把全部情况写出来是完全低效的。所以,饮料类可以作为抽象类,配料类作为装饰类,使用装饰模式。我们想想,咖啡和配料的搭配,无论是咖啡搭配配料,还是配料搭配咖啡,效果都是一样的。但是,为了不影响咖啡类本身,我们是将配料类关联咖啡类的,即将咖啡类的对象作为自己的成员变量。
Component(抽象构件):Coffee
1 abstract class Coffee//饮料类 2 { 3 public abstract double Cost(); 4 public abstract string Description(); 5 }