由於一些特殊原因,今天的教程就先將GoF中的“組合模式 ”和“命令模式”
組合模式
組合模式(結構型模式):組合多個對象形成樹形結構以表示具有部分-整體關係的層次結構。組合模式讓客戶端可以統一對單個對象和組合對象。
類圖
組合模式類圖
代碼實現
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](http://p2.ttnews.xyz/loading.gif)
模式解析
組合模式主要可以分為以下三個角色:
構件接口
構件
構件容器
構件:主要實現該構件的業務邏輯,即operation()方法;
構件容器:這裡需要說明一下,構件容器本身也是一個構件,也就是說構件容器中不僅可以包含構件,也可以包含容器,在構建容器A中可以包含構件容器B,將會採取遞歸的方式來執行構件容器A的operation方法。
適用環境
在具有整體和部分的層次結構中,希望通過一種方式忽略整體與部分之間的差異,客戶端可以一致的調用他們。
在使用面嚮對象語言開發的系統中需要處理一個樹形結構。
在一個系統中能夠分離出構件對象和容器對象,而且他們的類型是不固定的,需要增加一些新的類型。
命令模式
命令模式(結構型):將一個請求封裝成對象,從而讓你可以用不同的請求對客戶進行參數化,對請求排隊或者記錄請求日誌,以及支持可撤回的操作。
類圖
命令模式類圖
代碼實現
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();
效果
命令模式效果圖
模式解析
根據上面的類圖和程序,我們可以看出,在命令模式中主要有四個角色:
具體命令類:有具體的接受者對象,在Execute方法中調用接受者的action方法。
調用者:及命令發送者,他通過一個命令對象來執行請求。
接受者:執行與請求相關的操作,即實現具體的業務邏輯。
命令隊列
命令隊列的實現需要在前面的基礎上增加一個命令隊列類
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();
}
}
使用環境
命令的發送者和命令接受者具有不同的生命週期。
命令發送了並不是立即執行。
命令的執行順序需要進行各種邏輯管理。
單例模式
單例模式是結構最簡單的設計模式,它只包涵了一個類,即單例類。
單例模式的目的是保證一個類有且僅有一個實例,並提供一個訪問它的全局訪問點。
這裡就直接用兩段程序來看看單例模式是什麼樣的
餓漢式單例
///
/// 餓漢式單例
///
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;
}
}
使用環境
系統只需要一個實例對象,例如系統要求提供一個唯一的序列號生成器或是資源管理器,或者因為資源消耗太大二隻允許創建一個對象。
客戶調用類的單個實例只允許使用一個公共訪問點,除了該公共訪問點,不能通過其他途徑訪問該實例。
閱讀更多 騎著豬豬的CodeMonkey 的文章