技術交流,DH講解.
還是之前的文章,從之前部落格轉過來.
當我們有一個類如類A有一個方法C,但是這個C方法卻被很多情況影響,
那麼我們該怎麼設計才能讓代碼更加容易理解呢?
其實我們前面講的簡單原廠模式也能實現.但是現在想說一下策略模式了.
我們來看一個UML圖:軟體設計師上半年和下半年考試裡面都有這樣一個題,給一個UML讓你說這個UML是哪個模式?哈哈
我們能看到主類Context和Strategy是彙總關係吧,這裡可以是一個屬性 或者是一個成員變數.
而Strategy卻有多個具體的實作類別.
用代碼說話:
abstract class PHPBase{ public abstract function DoIt();} class Add extends PHPBase{ public function DoIt() { echo('Add\n'); }}class Sub extends PHPBase{ public function DoIt() { echo('Sub\n'); }}class PHPStrategy { public function test($a){ $b=NULL; switch($a){ case 0: $b=new Add(); break; case 1: $b=new Sub(); break; } $b->DoIt(); }}是不是和原廠模式有點兒像? $a=new PHPStrategy(); $a->test(0); $a->test(1);看看結果呢?Add\nSub\n沒有換行...哈哈鬱悶.
接下來還是用C#的吧,反正這麼多人用:
namespace Strategy_DesignPattern{ using System;abstract class Strategy {abstract public void DoAlgorithm();}class FirstStrategy : Strategy {override public void DoAlgorithm(){Console.WriteLine("In first strategy");}}class SecondStrategy : Strategy {override public void DoAlgorithm(){Console.WriteLine("In second strategy");}}class Context {Strategy s;public Context(Strategy strat){s = strat;}public void DoWork(){// 這裡}public void DoStrategyWork(){s.DoAlgorithm();}} public class Client { public static int Main(string[] args){FirstStrategy firstStrategy = new FirstStrategy();Context c = new Context(firstStrategy);c.DoWork();c.DoStrategyWork(); return 0; } }}
最後肯定是Delphi登場了,這裡我就不寫了,直接用Delphi建立出來的.
IStrategy = Interface; TContext = Class Strict Private Var /// <link>aggregation</link> FStrategy: IStrategy; Public Constructor Create(AStrategy: IStrategy); Procedure ContextRequest; End; IStrategy = Interface Procedure Sample; End; TConcreteStrategy = Class(TInterfacedObject, IStrategy) Public Procedure Sample; End;Implementation{$R *.dfm}Constructor TContext.Create(AStrategy: IStrategy);Begin Inherited Create; FStrategy := AStrategy;End;Procedure TConcreteStrategy.Sample;Begin { put your code for this particular strategy here }End;Procedure TContext.ContextRequest;Begin FStrategy.Sample;End;
我們的實際演算法類只要實現IStrategy介面就可以了.
最後說下適用情況:
許多相關的類僅僅是行為有異。“策略”提供了一種用多個行為中的一個行為來配置一個類的方法。
需要使用一個演算法的不同變體。例如,你可能會定義一些反映不同的空間/時間權衡的演算法。
當這些變體實現為一個演算法的類層次時[ H O 8 7 ] ,可以使用原則模式。
演算法使用客戶不應該知道的資料。可使用原則模式以避免暴露複雜的、與演算法相關的資料結構。
一個類定義了多種行為, 並且這些行為在這個類的操作中以多個條件陳述式的形式出現。
將相關的條件分支移入它們各自的S t r a t e g y 類中以代替這些條件陳述式。今天就到這裡了,我是DH.