天天看點

結合項目執行個體 回顧傳統設計模式(六)指令模式

指令模式将請求封裝成對象,以便使用不同的請求、隊列或者日志來參數化其他對象。指令模式也支援可撤銷的操作。使用者程式在使用的時候,隻與該指令對象打交道,而不用與一類對象打交道,降低了耦合性,提高了程式設計的靈活性。

我們還是那資料庫操作為例

  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