裝飾模式
【裝飾模式】:
動態的給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。
Component是定義一個對象接口,可以給這些對象動態的添加職責。
ConcreteComponent是定義一個具體的對象,也可以給這個對象添加一些職責。
Decorator裝飾抽象類,繼承了Component類,從外類來擴展Component類的功能,但對於Component來說,是無需知道Decorator類的存在的。至於ConcreteDecorator
就是具體的裝飾對象,起到給Component添加職責的功能。
【優點】:把類中的裝飾功能從類中搬移到類外,這樣可以簡化原有的類;能有效的把核心職責和裝飾功能區分開,而且可以除去相關類中重複的邏輯。
【示例代碼】
using System;
//Component是定義一個對象接口,可以給這些對象動態的添加職責。
abstract class Componet
{
public abstract void Operation();
}
// 具體要操作的對象,實現上麵的Componet接口,將要添加的職責移到類外。
class ConcreteComponent : Componet
{
public override void Operation()
{
Console.WriteLine("具體對象的操作");
}
}
// 裝飾類基類,也實現Componet接口。並保存一個Componet類的引用。
// 相當於是兩次繼承。
abstract class Decorator : Componet
{
protected Componet component;
public void SetComponent(Componet component)
{
this.component = component;
}
public override void Operation()
{
if (component != null)
{
//重寫Operation(),實際執行的是Component雷的Operation();
component.Operation();
}
}
}
//進行A裝飾;
class ConcreteDecoratorA : Decorator
{
private string addedState;
public override void Operation()
{
//先完成本來要進行的操作;
base.Operation();
addedState="new State";
Console.WriteLine("對具體對象進行“A裝飾”的操作");
}
}
//進行B裝飾;
class ConcreteDecoratorB : Decorator
{
public override void Operation()
{
base.Operation();
AddedBehavior();
Console.WriteLine("對具體對象進行“B裝飾”的操作");
}
private void AddedBehavior()
{ }
}
///////////////////////////////////////////////////////////////////////////////
/*客戶端代碼*/
class APP
{
static void Main()
{
ConcreteComponent c = new ConcreteComponent();
ConcreteDecoratorA d1 = new ConcreteDecoratorA();
ConcreteDecoratorB d2 = new ConcreteDecoratorB();
d1.SetComponent(c);//對c進行A裝飾;
d2.SetComponent(d1);//對d1進行B裝飾;
d2.Operation();
Console.Read();
}
}
例子:以人的裝扮為例。
【代碼實現】
using System;
//Person類
class Person
{
public Person(){}
private string name;
public Person(string name)
{
this.name=name;
}
public virtual void Show()
{
Console.WriteLine("裝扮的{0}",name);
}
}
//服飾類:繼承自Person,並維護一個Person的引用。
class Finery:Person
{
protected Person component;
//打扮
public void Decorate(Person component)
{
this.component=component;
}
public override void Show()
{
if(component!=null)
{
component.Show();
}
}
}
//具體服飾類;繼承自裝飾類;
class TShirts:Finery
{
public override void Show()
{
base.Show();
Console.WriteLine("T恤衫");
}
}
class Sneakers:Finery
{
public override void Show()
{
base.Show();
Console.WriteLine("膠底運動鞋");
}
}
class Trousers:Finery
{
public override void Show()
{
base.Show();
Console.WriteLine("短褲");
}
}
class LeatherShoes:Finery
{
public override void Show()
{
base.Show();
Console.WriteLine("皮鞋");
}
}
//客戶代碼
class App
{
static void Main()
{
Person xs=new Person("小山");
Console.WriteLine("第一種裝扮");
Sneakers sk=new Sneakers();
Trousers ts=new Trousers();
TShirts tst=new TShirts();
sk.Decorate(xs);
ts.Decorate(sk);
tst.Decorate(ts);
tst.Show();
}
}
最後更新:2017-04-02 03:42:38