《Head.First设计模式》的学习笔记(4)--装饰者模式
2008-03-31 08:31
369 查看
意图:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
结构:
public class DarkRoast : Beverage
2public class Mocha : CondimentDecorator
13class StarbuzzCoffee
31 {
32 static void Main(string[] args)
33 {
34 Beverage myBeverage = new Espresso();
35 Console.WriteLine(myBeverage.GetDescription() + " $" + myBeverage.Cost());
36
37 Beverage myBeverage2 = new DarkRoast();
38 myBeverage2 = new Mocha(myBeverage2);
39 myBeverage2 = new Mocha(myBeverage2);
40 myBeverage2 = new Whip(myBeverage2);
41 Console.WriteLine(myBeverage2.GetDescription() + " $" + myBeverage2.Cost());
42
43 Console.ReadLine();
44 }
45 }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
装饰模式的适用情况:
1)、需要扩展一个类的功能,或给一个类增加附加责任。
2)、需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
3)、需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。
使用装饰模式主要有以下的优点:
1)、装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。
2)、通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
使用装饰模式主要有以下的缺点:
由于使用装饰模式,可以比使用继承关系需要较少数目的类。使用较少的类,当然使设计比较易于进行。但是,在另一方面,使用装饰模式会产生比使用继承关系更多的对象。更多的对象会使得查错变得困难,特别是这些对象看上去都很相像。
参考文献:
《Head.First设计模式》
吕震宇 设计模式系列
源代码下载:/Files/wxj1020/StarbuzzCoffee.rar
结构:
public class DarkRoast : Beverage
2public class Mocha : CondimentDecorator
13class StarbuzzCoffee
31 {
32 static void Main(string[] args)
33 {
34 Beverage myBeverage = new Espresso();
35 Console.WriteLine(myBeverage.GetDescription() + " $" + myBeverage.Cost());
36
37 Beverage myBeverage2 = new DarkRoast();
38 myBeverage2 = new Mocha(myBeverage2);
39 myBeverage2 = new Mocha(myBeverage2);
40 myBeverage2 = new Whip(myBeverage2);
41 Console.WriteLine(myBeverage2.GetDescription() + " $" + myBeverage2.Cost());
42
43 Console.ReadLine();
44 }
45 }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
装饰模式的适用情况:
1)、需要扩展一个类的功能,或给一个类增加附加责任。
2)、需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
3)、需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。
使用装饰模式主要有以下的优点:
1)、装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。
2)、通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
使用装饰模式主要有以下的缺点:
由于使用装饰模式,可以比使用继承关系需要较少数目的类。使用较少的类,当然使设计比较易于进行。但是,在另一方面,使用装饰模式会产生比使用继承关系更多的对象。更多的对象会使得查错变得困难,特别是这些对象看上去都很相像。
参考文献:
《Head.First设计模式》
吕震宇 设计模式系列
源代码下载:/Files/wxj1020/StarbuzzCoffee.rar
相关文章推荐
- (Head First 设计模式)学习笔记(3) --装饰者模式(StarBuzz咖啡店实例)
- [知了堂学习笔记]设计模式之装饰者模式
- 【知了堂学习笔记】_Java中设计模式之装饰者模式的学习
- C++设计模式学习笔记二:装饰者模式
- 【学习笔记javascript设计模式与开发实践(装饰者模式)----15】
- 设计模式学习笔记--装饰者模式(Decorator Pattern)
- 再起航,我的学习笔记之JavaScript设计模式13(装饰者模式)
- <JAVA学习笔记二>——设计模式之装饰者设计模式
- 【知了堂学习笔记】——设计模式之装饰者模式
- 《Head.First设计模式》的学习笔记(7)--命令模式
- 《Head.First设计模式》的学习笔记(3)--观察者模式
- 设计模式学习笔记——装饰者模式
- 装饰者模式——HeaderFirst学习笔记
- 设计模式-装饰者模式学习笔记
- 设计模式学习笔记(三):装饰者模式
- 学习《Head.First设计模式》—— 装饰者模式
- 《Head first设计模式》学习笔记 - 装饰者模式
- [学习笔记]设计模式[2]-{装饰者模式}
- 《Head.First设计模式》的学习笔记(6)--单件模式
- 《Head.First设计模式》的学习笔记(9)--外观模式