結合項目實例 回顧傳統設計模式(六)命令模式
2011-10-05 14:56 熬夜的蟲子 閱讀(581) 評論(0) 收藏 舉報命令模式將請求封裝成對象,以便使用不同的請求、隊列或者日志來參數化其他對象。命令模式也支持可撤銷的操作。用戶程序在使用的時候,只與該命令對象打交道,而不用與一類對象打交道,降低了耦合性,提高了程序設計的靈活性。
我們還是那數據庫操作為例
public class DBInstance
{
public void ExecuteNonQuery()
{
}
public void ExecuteDataset()
{
}
}
public class SqlInstance : DBInstance
{
public void ExecuteNonQuery()
{
Console.WriteLine("this is a SqlInstance");
}
}
public class OracleInstance : DBInstance
{
public void ExecuteNonQuery()
{
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;
}
public void execute()
{
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();
}
}
{
public void ExecuteNonQuery()
{
}
public void ExecuteDataset()
{
}
}
public class SqlInstance : DBInstance
{
public void ExecuteNonQuery()
{
Console.WriteLine("this is a SqlInstance");
}
}
public class OracleInstance : DBInstance
{
public void ExecuteNonQuery()
{
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;
}
public void execute()
{
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);
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()方法的細節。一般來說,我們設計命令對象,它或許只需要調用一個接收者的一個行為。然而有許多命令對象會實現許多邏輯,直接完成一個請求。當然你可以設計更全面的命令對象,只是這樣一來,調用者和接收者之間的解耦程度會再度降低。實際項目中命令可以將運算快打包(一個接收者一組動作),然后將他們傳來傳去,就像是普通對象一樣。所以在日程安排、線程池、事務隊列中命令模式的使用也是比較廣泛的,
![]() |
原創作品允許轉載,轉載時請務必以超鏈接形式標明文章原始出處以及作者信息。 作者:熬夜的蟲子 點擊查看:博文索引 |

浙公網安備 33010602011771號