裝飾器模式允許向現有對象中添加新功能,同時又不改變其結構。 介紹 裝飾器模式屬於結構型模式,主要功能是能夠動態地為一個對象添加額外功能。在保證現有功能的基礎上,再添加新功能,可聯想到 WPF 中的附件屬性。 類圖描述 由上圖可知,我們定義了一個基礎介面 IShape 用於約定對象的基礎行為。然後通過 ...
裝飾器模式允許向現有對象中添加新功能,同時又不改變其結構。
介紹
裝飾器模式屬於結構型模式,主要功能是能夠動態地為一個對象添加額外功能。在保證現有功能的基礎上,再添加新功能,可聯想到 WPF 中的附件屬性。
類圖描述
由上圖可知,我們定義了一個基礎介面 IShape 用於約定對象的基礎行為。然後通過定義ShapeDecorator 類 來擴展功能,RedShapleDecorator 為具體的擴展實現。
代碼實現
1、定義介面
public interface IShape
{
void Draw();
}
2、定義對象類型
public class Circle:IShape
{
public void Draw()
{
Console.WriteLine("Shape:Circle");
}
}
public class Rectangle : IShape
{
public void Draw()
{
Console.WriteLine("Shape:Rectangle");
}
}
3、定義新的擴展裝飾類
public class ShapeDecorator:IShape
{
protected IShape decoratedShape;
public ShapeDecorator(IShape decoratedShape)
{
this.decoratedShape = decoratedShape;
}
public virtual void Draw()
{
decoratedShape.Draw();
}
}
4、定義擴展類的具體實現
public class RedShapleDecorator : ShapeDecorator
{
public RedShapleDecorator(IShape decoratedShape) : base(decoratedShape)
{
}
public override void Draw()
{
this.decoratedShape.Draw();
setRedBorder(this.decoratedShape);
}
private void setRedBorder(IShape decoratedShape)
{
Console.WriteLine("Border Color:Red");
}
}
5、上層調用
class Program
{
static void Main(string[] args)
{
IShape circle = new Circle();
IShape redCircle = new RedShapleDecorator(new Circle());
IShape redRectangle = new RedShapleDecorator(new Rectangle());
Console.WriteLine("Circle with normal border");
circle.Draw();
Console.WriteLine("Circle of red border");
redCircle.Draw();
Console.WriteLine("Rectangel of red border");
redRectangle.Draw();
Console.ReadKey();
}
}
總結
裝飾器模式使得對象的核心功能和擴展功能能夠各自獨立擴展互不影響。但是對於裝飾功能較多的情況下不建議採用這種模式。