設計模式
目的:動態功能附加在物件上。
何謂裝飾模式?
裝飾模式動態將責任附加在物件上,若要擴展功能上,裝飾者提供比繼承更有彈性的
替代方案。
為什麼使用它?
利用繼承的特性,可以使兒子具備有老爸的屬性和方法,兒子繼承老爸之後,因為需
求狀況,透過重寫方式加強老爸的方法一些功能,也可以重新定義某些屬性,覆蓋老爸原
有屬性與方法讓老爸有不同類別功能,再來它的意義在於動態給物件與增加額外的職責。
Component:被裝飾的中心元件
Decorator:裝飾中心元件的其他元件
class Program
{
//第五步:撰寫主程式
static void Main(string[] args)
{
ConcreteComponent c = new ConcreteComponent();
ConcreteDecoratorA d1 = new ConcreteDecoratorA();
ConcreteDecoratorB d2 = new ConcreteDecoratorB();
d1.SetComponent(c);
d2.SetComponent(d1);
d2.Operation();
}
}
//第一步:給一個抽象類別,規範方法
abstract class Component
{
public abstract void Operation();
}
//第二步:給具體組件
class ConcreteComponent:Component
{
public override void Operation()
{
Console.WriteLine("ConcreteComponent.Operation()");
}
}
//第三步:抽象裝飾者
abstract class Decorator:Component
{
protected Component component;
public void SetComponent(Component component)
{
this.component = component;
}
public override void Operation()
{
if (component !=null)
{
component.Operation();
}
}
}
//第四步:具體抽象者
class ConcreteDecoratorA:Decorator
{
public override void Operation()
{
base.Operation();
Console.WriteLine("ConcreteDecoratorA.Operation()");
}
}
class ConcreteDecoratorB:Decorator
{
public override void Operation()
{
base.Operation();
AddedBehavior();
Console.WriteLine("ConcreteDecoratorB.Operation()");
}
void AddedBehavior()
{
}
}
來個案例,我今天去天瓏買了單元測試藝術,想加購Design Pattern,ASP.net MVC
按照上面的步驟
步驟一:定義一個抽象類別叫做書
abstract class Book
{
public abstract void Buy();
}
步驟二:我要的IT書或是電腦書都可
class ITBook : Book
{
public override void Buy()
{
Console.WriteLine("我去天瓏資訊買的書:");
}
}
步驟三:抽象裝飾者,我要針對電腦書籍做裝飾者
abstract class ITBookDecorator : Book
{
protected Book book;
public void SetBook(Book book)
{
this.book = book;
}
public override void Buy()
{
if (this.book != null)
{
book.Buy();
}
}
}
第四步:具體抽象者 ,買了單元測試藝術,加購其他書
class UnitTestArt_Decorator : ITBookDecorator
{
public override void Buy()
{
base.Buy();
Console.WriteLine("購買單元測試藝術");
}
}
class DesignPattern_Decorator : ITBookDecorator
{
public override void Buy()
{
base.Buy();
Console.WriteLine("加購Design Pattern");
}
}
class AspNetMvc_Decorator : ITBookDecorator
{
public override void Buy()
{
base.Buy();
Console.WriteLine("加購ASP.net MVC");
}
}
第五步:撰寫主程式
class Program
{
private static void Main(string[] args)
{
ITBook itBook = new ITBook();
UnitTestArt_Decorator unitTest = new UnitTestArt_Decorator();
DesignPattern_Decorator designPattern = new DesignPattern_Decorator();
AspNetMvc_Decorator aspNetMvc = new AspNetMvc_Decorator();
unitTest.SetBook(itBook);
designPattern.SetBook(unitTest);
aspNetMvc.SetBook(designPattern);
aspNetMvc.Buy();
}
}
元哥的筆記