閱讀774 返回首頁    go 阿裏雲 go 技術社區[雲棲]


裝飾模式

【裝飾模式】

  動態的給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。

 

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

  上一篇:go 設置Qt應用程序圖標
  下一篇:go Web開發的幾點經驗談