1. 程式人生 > >模板模式 策略模式 命令模式 比說明與比較

模板模式 策略模式 命令模式 比說明與比較

模板模式

在模板模式中,一個抽象類公開定義了執行它的方法/模板.它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方式進行.這種型別模式屬於行為模式.

定義一個操作演算法的骨架,而將這一些步驟延遲到子類中,模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟.

優點:

  1. 封裝不變部分,擴充套件可變部分.
  2. 提取公共程式碼,便於維護.
  3. 行為由父類控制,子類實現.

缺點:

每個不同的事項都需要一個子類來實現,導致類的個數增加,使得系統更加龐大.

生活中的例子:

實現程式碼:

//寫一個父類
abstract class AbstractClass
    {
        public abstract void PrimitiveOperation1();
        public abstract void PrimitiveOperation2();

        public void TemplateMethod()
        {
            PrimitiveOperation1();
            PrimitiveOperation2();
            Console.WriteLine("");
        }
}
//兩個子類繼承父類
class ConcreteClassA : AbstractClass
    {
        public override void PrimitiveOperation1()
        {
            Console.WriteLine("具體類A方法1實現");
        }
        public override void PrimitiveOperation2()
        {
            Console.WriteLine("具體類A方法2實現");
        }
    }

    class ConcreteClassB : AbstractClass
    {
        public override void PrimitiveOperation1()
        {
            Console.WriteLine("具體類B方法1實現");
        }
        public override void PrimitiveOperation2()
        {
            Console.WriteLine("具體類B方法2實現");
        }
    }

客戶端程式碼:

AbstractClass c;

            c = new ConcreteClassA();
            c.TemplateMethod();

            c = new ConcreteClassB();
            c.TemplateMethod();

            Console.Read();

策略模式

在策略模式中,一個類的行為或其演算法可以在執行是更改.這種型別的設計模式屬於行為模式.

在策略模式中,我們建立表示各種策略的物件和一個行為隨著策略物件改變的context物件.策略物件改變context物件的執行演算法.

定義一系列的演算法,把他們一個個給封裝起來,並且使他們可以互相替換.

優點:

  1. 演算法可以自由切換.
  2. 避免使用多重條件判斷.
  3. 擴充套件性良好,

缺點:

  1. 策略類會增多.
  2. 所有策略類都需要對外暴露.

生活中的例子:

程式碼實現:

//抽象演算法類
    abstract class Strategy
    {
        //演算法方法
        public abstract void AlgorithmInterface();
    }
    //具體演算法A
    class ConcreteStrategyA : Strategy
    {
        //演算法A實現方法
        public override void AlgorithmInterface()
        {
            Console.WriteLine("演算法A實現");
        }
    }
    //具體演算法B
    class ConcreteStrategyB : Strategy
    {
        //演算法B實現方法
        public override void AlgorithmInterface()
        {
            Console.WriteLine("演算法B實現");
        }
    }
    //具體演算法C
    class ConcreteStrategyC : Strategy
    {
        //演算法C實現方法
        public override void AlgorithmInterface()
        {
            Console.WriteLine("演算法C實現");
        }
    }
    //上下文
    class Context
    {
        Strategy strategy;

        public Context(Strategy strategy)
        {
            this.strategy = strategy;
        }
        //上下文介面
        public void ContextInterface()
        {
            strategy.AlgorithmInterface();
        }
}

客戶端程式碼

Context context;

            context = new Context(new ConcreteStrategyA());
            context.ContextInterface();

            context = new Context(new ConcreteStrategyB());
            context.ContextInterface();

            context = new Context(new ConcreteStrategyC());
            context.ContextInterface();

            Console.Read();

命令模式

命令模式是一種資料驅動的設計模式,它屬於行為型模式.請求以命令的形式包裹在物件中,並傳給呼叫物件.呼叫物件尋找可以處理該命令的合適的物件,並把該命令傳給相對應的物件,該物件執行命令.

將一個請求封裝成一個物件,從而讓使用者可以用不同的請求對客戶進行引數化.

優點:

  1. 降低了系統耦合度.
  2. 新的命令可以很容易新增到系統中去.

缺點:

使用明亮模式可能會導致某些系統由過多的具體命令類.

程式碼實現:

abstract class Command
    {
        protected Receiver receiver;

        public Command(Receiver receiver)
        {
            this.receiver = receiver;
        }

        abstract public void Execute();
    }

    class ConcreteCommand : Command
    {
        public ConcreteCommand(Receiver receiver)
            :
          base(receiver) { }

        public override void Execute()
        {
            receiver.Action();
        }
    }

    class Receiver
    {
        public void Action()
        {
            Console.WriteLine("執行請求!");
        }
    }

    class Invoker
    {
        private Command command;

        public void SetCommand(Command command)
        {
            this.command = command;
        }

        public void ExecuteCommand()
        {
            command.Execute();
        }
}

客戶端程式碼:

Receiver r = new Receiver();
            Command c = new ConcreteCommand(r);
            Invoker i = new Invoker();

            // Set and execute command 
            i.SetCommand(c);
            i.ExecuteCommand();

            Console.Read();