軟體工程 – 設計模式學習之策略模式Strategy

來源:互聯網
上載者:User

技術交流,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.

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.