Core Design Patterns(1) Decorator 装饰模式
VS 2008
当我们需要给一个已有的对象动态的附加状态或行为时,使用装饰模式。
装饰模式的要点是:装饰类实现了最初的被装饰类,并且包含了被装饰类的一个实例
1. 模式静态类图
![](/images/cnblogs_com/guozhijian/Design Pattern/decorator-01.gif)
2. 应用
从一只可以写的Pen开始
把它装饰成有颜色的笔、粗线的笔,甚至可以是有颜色且粗线的笔
![](/images/cnblogs_com/guozhijian/Design Pattern/decorator-03.gif)
IWritable
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.Decorator.BLL {
interface IWritable {
void Write();
}
}
Pen
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.Decorator.BLL {
class Pen : IWritable {
IWritable Members
}
}
ColoredPen
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.Decorator.BLL {
class ColoredPen : IWritable {
![](/Images/OutliningIndicators/InBlock.gif)
IWritable component = null;
string color = string.Empty;
![](/Images/OutliningIndicators/InBlock.gif)
public ColoredPen(IWritable component, string color) {
this.component = component;
this.color = color;
}
![](/Images/OutliningIndicators/InBlock.gif)
IWritable Members
![](/Images/OutliningIndicators/InBlock.gif)
public void SetColor(string color) {
this.color = color;
}
}
}
BoldPen
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.Decorator.BLL {
class BoldPen : IWritable {
![](/Images/OutliningIndicators/InBlock.gif)
IWritable component = null;
int borderWidth = 0;
![](/Images/OutliningIndicators/InBlock.gif)
public BoldPen(IWritable component, int borderWidth) {
this.component = component;
this.borderWidth = borderWidth;
}
![](/Images/OutliningIndicators/InBlock.gif)
IWritable Members
![](/Images/OutliningIndicators/InBlock.gif)
public void SetBorderWidth(int borderWidth) {
this.borderWidth = borderWidth;
}
}
}
Client
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DesignPattern.Decorator.BLL;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.Decorator {
class Program {
static void Main(string[] args) {
IWritable p = new Pen();
p.Write();
Console.WriteLine();
![](/Images/OutliningIndicators/InBlock.gif)
ColoredPen coloredPen = new ColoredPen(p, "red");
coloredPen.Write();
Console.WriteLine();
![](/Images/OutliningIndicators/InBlock.gif)
BoldPen boldPen = new BoldPen(p, 2);
boldPen.Write();
Console.WriteLine();
![](/Images/OutliningIndicators/InBlock.gif)
BoldPen coloredAndBoldPen = new BoldPen(coloredPen, 4);
coloredAndBoldPen.Write();
}
}
}
当我们需要给一个已有的对象动态的附加状态或行为时,使用装饰模式。
装饰模式的要点是:装饰类实现了最初的被装饰类,并且包含了被装饰类的一个实例
1. 模式静态类图
![](/images/cnblogs_com/guozhijian/Design Pattern/decorator-01.gif)
2. 应用
从一只可以写的Pen开始
把它装饰成有颜色的笔、粗线的笔,甚至可以是有颜色且粗线的笔
![](/images/cnblogs_com/guozhijian/Design Pattern/decorator-03.gif)
IWritable
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
Pen
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
ColoredPen
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
BoldPen
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
Client
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)