淺談設計模式3

由於一些特殊原因,今天的教程就先將GoF中的“組合模式

”和“命令模式

組合模式

組合模式(結構型模式):組合多個對象形成樹形結構以表示具有部分-整體關係的層次結構。組合模式讓客戶端可以統一對單個對象和組合對象。

類圖

淺談設計模式3

組合模式類圖

代碼實現

IComponent(構件接口)

public interface IComponent

{

void operation();

void add(IComponent c);

void remove(IComponent c);

IComponent getComponent(int i);

}

Component(構件類)

public class Component : IComponent

{

string name;

public Component(string name)

{

this.name = name;

}

public void add(IComponent c)

{

throw new NotImplementedException();

}

public IComponent getComponent(int i)

{

throw new NotImplementedException();

}

public void operation()

{

Console.WriteLine("執行了操作"+name);

}

public void remove(IComponent c)

{

throw new NotImplementedException();

}

}

Container(構件容器類)

public class Container : IComponent

{

List list = new List();

public void add(IComponent c)

{

list.Add(c);

}

public IComponent getComponent(int i)

{

return list[i];

}

public void operation()

{

foreach(IComponent c in list)

{

c.operation();

}

}

public void remove(IComponent c)

{

list.Remove(c);

}

}

客戶端調用示例

Container c = new Container();

c.add(new Component("開機"));

c.add(new Component("滑動鼠標"));

c.add(new Component("關機"));

c.operation();

淺談設計模式3

模式解析

組合模式主要可以分為以下三個角色:

  1. 構件接口

  2. 構件

  3. 構件容器

構件:主要實現該構件的業務邏輯,即operation()方法;

構件容器:這裡需要說明一下,構件容器本身也是一個構件,也就是說構件容器中不僅可以包含構件,也可以包含容器,在構建容器A中可以包含構件容器B,將會採取遞歸的方式來執行構件容器A的operation方法。

適用環境

  1. 在具有整體和部分的層次結構中,希望通過一種方式忽略整體與部分之間的差異,客戶端可以一致的調用他們。

  2. 在使用面嚮對象語言開發的系統中需要處理一個樹形結構。

  3. 在一個系統中能夠分離出構件對象和容器對象,而且他們的類型是不固定的,需要增加一些新的類型。


命令模式

命令模式(結構型):將一個請求封裝成對象,從而讓你可以用不同的請求對客戶進行參數化,對請求排隊或者記錄請求日誌,以及支持可撤回的操作。

類圖

淺談設計模式3

命令模式類圖

代碼實現

ICommand

public interface ICommand

{

void execute();

}

Invoker

public class Invoker

{

public ICommand cmd;

public Invoker(ICommand cmd)

{

this.cmd = cmd;

}

public void call()

{

cmd.execute();

}

}

Receiver

public class Receiver

{

public void action()

{

Console.WriteLine("操作操作");

}

}

Command

public class Command : ICommand

{

Receiver r = new Receiver();

public void execute()

{

r.action();

}

}

客戶端調用

Invoker i = new Invoker(new Command());

i.call();

效果

淺談設計模式3

命令模式效果圖

模式解析

根據上面的類圖和程序,我們可以看出,在命令模式中主要有四個角色:

  1. 具體命令類:有具體的接受者對象,在Execute方法中調用接受者的action方法。

  2. 調用者:及命令發送者,他通過一個命令對象來執行請求。

  3. 接受者:執行與請求相關的操作,即實現具體的業務邏輯。

命令隊列

命令隊列的實現需要在前面的基礎上增加一個命令隊列類

CommandQueue

public class CommandQueue

{

List list = new List();

public void add(ICommand cmd)

{

list.Add(cmd);

}

public void remove(ICommand cmd)

{

list.Remove(cmd);

}

public void execute()

{

foreach(ICommand cmd in list)

{

cmd.execute();

}

}

}

原本的調用者類需要做部分修改

public class Invoker

{

//public ICommand cmd;

public CommandQueue cmd;

//public Invoker(ICommand cmd)

//{

// this.cmd = cmd;

//}

public Invoker(CommandQueue cmd)

{

this.cmd = cmd;

}

public void call()

{

cmd.execute();

}

}

使用環境

  1. 命令的發送者和命令接受者具有不同的生命週期。

  2. 命令發送了並不是立即執行。

  3. 命令的執行順序需要進行各種邏輯管理。


單例模式

單例模式是結構最簡單的設計模式,它只包涵了一個類,即單例類。

單例模式的目的是保證一個類有且僅有一個實例,並提供一個訪問它的全局訪問點。

這裡就直接用兩段程序來看看單例模式是什麼樣的

餓漢式單例

///

/// 餓漢式單例

///

class HungrySingle

{

private static HungrySingle single = new HungrySingle();

private HungrySingle()

{

}

public static HungrySingle get()

{

return single;

}

}

懶漢式單例

///

/// 懶漢式單例

///

class LazySingle

{

private static LazySingle single = null;

private LazySingle() { }

public static LazySingle get()

{

if(single == null)

{

single = new LazySingle();

}

return single;

}

}

使用環境

  1. 系統只需要一個實例對象,例如系統要求提供一個唯一的序列號生成器或是資源管理器,或者因為資源消耗太大二隻允許創建一個對象。

  2. 客戶調用類的單個實例只允許使用一個公共訪問點,除了該公共訪問點,不能通過其他途徑訪問該實例。


分享到:


相關文章: