指令模式将請求封裝成對象,以便使用不同的請求、隊列或者日志來參數化其他對象。指令模式也支援可撤銷的操作。使用者程式在使用的時候,隻與該指令對象打交道,而不用與一類對象打交道,降低了耦合性,提高了程式設計的靈活性。
我們還是那資料庫操作為例
public class DBInstance
{
public void ExecuteNonQuery()
{
}
public void ExecuteDataset()
}
public class SqlInstance : DBInstance
Console.WriteLine("this is a SqlInstance");
public class OracleInstance : DBInstance
Console.WriteLine("this is a OracleInstance");
public interface Command
void execute();
public class SqlCommand : Command
SqlInstance sqlinstance;
public SqlCommand(SqlInstance sqlins)
this.sqlinstance = sqlins;
public void execute()
sqlinstance.ExecuteNonQuery();
public class OracleCommand : Command
OracleInstance Oracleinstance;
public OracleCommand(OracleInstance Oracleins)
this.Oracleinstance = Oracleins;
Oracleinstance.ExecuteNonQuery();
public class DBControl
Command[] commands;
public DBControl()
commands = new Command[2];
public void setCommand(int index,Command comm)
commands[index] = comm;
public void control(int index)
commands[index].execute();
測試下指令模式
DBControl dc = new DBControl();
SqlInstance si = new SqlInstance();
SqlCommand sc = new SqlCommand(si);
OracleInstance oi = new OracleInstance();
OracleCommand oc = new OracleCommand(oi);
dc.setCommand(0, sc);
dc.setCommand(1, oc);
dc.control(0);
dc.control(1);
總結:有的同學可能會問接收者有必要存在嗎?為何指令對象不知想實作execute()方法的細節。一般來說,我們設計指令對象,它或許隻需要調用一個接收者的一個行為。然而有許多指令對象會實作許多邏輯,直接完成一個請求。當然你可以設計更全面的指令對象,隻是這樣一來,調用者和接收者之間的解耦程度會再度降低。實際項目中指令可以将運算快打包(一個接收者一組動作),然後将他們傳來傳去,就像是普通對象一樣。是以在日程安排、線程池、事務隊列中指令模式的使用也是比較廣泛的,
本文轉自 熬夜的蟲子 51CTO部落格,原文連結:http://blog.51cto.com/dubing/712411