装饰者设计模式 -C#
2017-09-29 17:02
295 查看
参考《Head First设计模式》
装饰者模式定义:
动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
主要思想:
将装饰者与被装饰者自同一个超类型;
可以用一个或多个装饰者包装一个对象;
装饰者与被装饰者有相同的超类型,因而在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它;
装饰者可以在被装饰者的行为前/后,添加自己的行为,以达到特定目的;
对象可以在任何时候被装饰,所以可以在运行时动态地装饰对象;
测试代码:
运行结果:
Espresso
1.99
Espresso, Mocha, Soy
2.59
与书上不同的是,Beverage Condiment抽象类中,对getDescription()方法的处理,应该是在C#中,如果子类不用override覆盖父类的方法,则调用的仍然是父类的方法,因而在所有的子类中,都使用了override重写方法。
装饰者模式定义:
动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
主要思想:
将装饰者与被装饰者自同一个超类型;
可以用一个或多个装饰者包装一个对象;
装饰者与被装饰者有相同的超类型,因而在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它;
装饰者可以在被装饰者的行为前/后,添加自己的行为,以达到特定目的;
对象可以在任何时候被装饰,所以可以在运行时动态地装饰对象;
public abstract class Beverage { public string description = "UnKnown Beverage."; public abstract double cost(); public abstract string getDescription(); }
public abstract class Condiment:Beverage { }
class Mocha : Condiment { Beverage beverage; public Mocha(Beverage beverage) { this.beverage = beverage; } public override string getDescription() { return this.beverage.getDescription() + " , Mocha"; } public override double cost() { return this.beverage.cost() + 0.2; } }
public class Soy:Condiment { Beverage beverage; public Soy(Beverage beverage) { this.beverage = beverage; } public override string getDescription() { return this.beverage.getDescription() + " , Soy"; } public override double cost() { return this.beverage.cost() + 0.4; } }
public class Espresso:Beverage { public Espresso() { this.description = "Espresso"; } public override double cost() { return 1.99; } public override string getDescription() { return this.description; } }
class HouseBlend : Beverage { public HouseBlend() { this.description = "House Blend"; } public override double cost() { return 1.01; } public override string getDescription() { return string.Empty; } }
测试代码:
static void Main(string[] args) { Beverage beverage = new Espresso(); Console.WriteLine(beverage.getDescription()); Console.WriteLine(beverage.cost()); Beverage beverage2 = new Espresso(); beverage2 = new Mocha(beverage2); beverage2 = new Soy(beverage2); Console.WriteLine(beverage2.getDescription()); Console.WriteLine(beverage2.cost()); Console.ReadKey(); }
运行结果:
Espresso
1.99
Espresso, Mocha, Soy
2.59
与书上不同的是,Beverage Condiment抽象类中,对getDescription()方法的处理,应该是在C#中,如果子类不用override覆盖父类的方法,则调用的仍然是父类的方法,因而在所有的子类中,都使用了override重写方法。
相关文章推荐
- C#设计模式——装饰者模式(Decorator Pattern)
- C#设计模式-装饰者模式
- C#设计模式--装饰者模式
- 设计模式学习(三): 装饰者模式 (附C#实现)
- C#设计模式(九)装饰者模式(Decorator Pattern)
- C#设计模式——装饰者模式(Decorator Pattern)
- C#设计模式(9)——装饰者模式
- C#设计模式之装饰者
- Head First 设计模式 读书摘记(四) 装饰者模式 C#代码
- c#设计模式之装饰者模式
- C#设计模式之装饰者
- C#设计模式(9)——装饰者模式(Decorator Pattern)
- 解析C#设计模式编程中的装饰者模式
- 201802181505->深入浅出设计模式:c#装饰者模式
- 【C#设计模式-装饰者模式】
- 设计模式学习之—装饰者模式
- 设计模式学习002——装饰者模式
- 设计模式之装饰者模式 三
- Java的设计模式之装饰者模式
- C#设计模式——装饰模式