fbpx
维基百科

策略模式

策略模式作爲一種軟件設計模式,指對象有某個行爲,但是在不同的場景中,該行爲有不同的實現算法。比如每個人都要“交個人所得稅”,但是“在美國交個人所得稅”和“在中華民國交個人所得稅”就有不同的算稅方法。

策略模式:

  • 定义了一族算法(业务规则);
  • 封装了每个算法;
  • 这族的算法可互换代替(interchangeable)。

结构 编辑

 
Strategy Pattern in UML
 
Strategy pattern in LePUS3 ()

示例 编辑

C++ 编辑

#include <iostream> using namespace std; class StrategyInterface {  public:  virtual void execute() = 0; }; class ConcreteStrategyA: public StrategyInterface {  public:  virtual void execute()  {  cout << "Called ConcreteStrategyA execute method" << endl;  } }; class ConcreteStrategyB: public StrategyInterface {  public:  virtual void execute()  {  cout << "Called ConcreteStrategyB execute method" << endl;  } }; class ConcreteStrategyC: public StrategyInterface {  public:  virtual void execute()  {  cout << "Called ConcreteStrategyC execute method" << endl;  } }; class Context {  private:  StrategyInterface *_strategy;  public:  Context(StrategyInterface *strategy):_strategy(strategy)  {  }  void set_strategy(StrategyInterface *strategy)  {  _strategy = strategy;  }  void execute()  {  _strategy->execute();  } }; int main(int argc, char *argv[]) {  ConcreteStrategyA concreteStrategyA;  ConcreteStrategyB concreteStrategyB;  ConcreteStrategyC concreteStrategyC;  Context contextA(&concreteStrategyA);  Context contextB(&concreteStrategyB);  Context contextC(&concreteStrategyC);  contextA.execute();  contextB.execute();  contextC.execute();    contextA.set_strategy(&concreteStrategyB);  contextA.execute();  contextA.set_strategy(&concreteStrategyC);  contextA.execute();  return 0; } 

Java 编辑

//StrategyExample test application class StrategyExample {  public static void main(String[] args) {  Context context;  // Three contexts following different strategies  context = new Context(new FirstStrategy());  context.execute();  context = new Context(new SecondStrategy());  context.execute();  context = new Context(new ThirdStrategy());  context.execute();  } } // The classes that implement a concrete strategy should implement this // The context class uses this to call the concrete strategy interface Strategy {  void execute();   } // Implements the algorithm using the strategy interface class FirstStrategy implements Strategy {  public void execute() {  System.out.println("Called FirstStrategy.execute()");  }   } class SecondStrategy implements Strategy {  public void execute() {  System.out.println("Called SecondStrategy.execute()");  }   } class ThirdStrategy implements Strategy {  public void execute() {  System.out.println("Called ThirdStrategy.execute()");  }   } // Configured with a ConcreteStrategy object and maintains a reference to a Strategy object class Context {  Strategy strategy;  // Constructor  public Context(Strategy strategy) {  this.strategy = strategy;  }  public void execute() {  this.strategy.execute();  } } 

C# 编辑

using System; namespace Wikipedia.Patterns.Strategy {  // MainApp test application  class MainApp  {  static void Main()  {  Context context;  // Three contexts following different strategies  context = new Context(new ConcreteStrategyA());  context.Execute();  context = new Context(new ConcreteStrategyB());  context.Execute();  context = new Context(new ConcreteStrategyC());  context.Execute();  }  }  // The classes that implement a concrete strategy should implement this  // The context class uses this to call the concrete strategy  interface IStrategy  {  void Execute();  }  // Implements the algorithm using the strategy interface  class ConcreteStrategyA : IStrategy  {  public void Execute()  {  Console.WriteLine( "Called ConcreteStrategyA.Execute()" );  }  }  class ConcreteStrategyB : IStrategy  {  public void Execute()  {  Console.WriteLine( "Called ConcreteStrategyB.Execute()" );  }  }  class ConcreteStrategyC : IStrategy  {  public void Execute()  {  Console.WriteLine( "Called ConcreteStrategyC.Execute()" );  }  }  // Configured with a ConcreteStrategy object and maintains a reference to a Strategy object  class Context  {  IStrategy strategy;  // Constructor  public Context(IStrategy strategy)  {  this.strategy = strategy;  }  public void Execute()  {  strategy.Execute();  }  } } 

ActionScript 3 编辑

//invoked from application.initialize private function init() : void {  var context:Context;  context = new Context( new ConcreteStrategyA() );  context.execute();  context = new Context( new ConcreteStrategyB() );  context.execute();  context = new Context( new ConcreteStrategyC() );  context.execute(); } package org.wikipedia.patterns.strategy {  public interface IStrategy  {  function execute() : void ;  } } package org.wikipedia.patterns.strategy {  public final class ConcreteStrategyA implements IStrategy  {  public function execute():void  {  trace( "ConcreteStrategyA.execute(); invoked" );  }  } } package org.wikipedia.patterns.strategy {  public final class ConcreteStrategyB implements IStrategy  {  public function execute():void  {  trace( "ConcreteStrategyB.execute(); invoked" );  }  } } package org.wikipedia.patterns.strategy {  public final class ConcreteStrategyC implements IStrategy  {  public function execute():void  {  trace( "ConcreteStrategyC.execute(); invoked" );  }  } } package org.wikipedia.patterns.strategy {  public class Context  {  private var strategy:IStrategy;    public function Context(strategy:IStrategy)  {  this.strategy = strategy;  }    public function execute() : void  {   strategy.execute();  }  } } 

PHP 编辑

<?php class StrategyExample { public function __construct() { $context = new Context(new ConcreteStrategyA()); $context->execute(); $context = new Context(new ConcreteStrategyB()); $context->execute(); $context = new Context(new ConcreteStrategyC()); $context->execute(); } } interface IStrategy { public function execute(); } class ConcreteStrategyA implements IStrategy { public function execute() { echo "Called ConcreteStrategyA execute method\n"; } } class ConcreteStrategyB implements IStrategy { public function execute() { echo "Called ConcreteStrategyB execute method\n"; } } class ConcreteStrategyC implements IStrategy { public function execute() { echo "Called ConcreteStrategyC execute method\n"; } } class Context { var $strategy; public function __construct(IStrategy $strategy) { $this->strategy = $strategy; } public function execute() { $this->strategy->execute(); } } new StrategyExample; ?> 

Objective-C 编辑

@protocol Strategy <NSObject> @required - (void)print; @end @interface ConcreteStrategyA : NSObject<Strategy> {   } @end @interface ConcreteStrategyB : NSObject<Strategy> {   } @end @interface Context : NSObject {  id<Strategy> _strategy; } @property (nonatomic, assign) id<Strategy> strategy; -(void)doIt; @end @implementation ConcreteStrategyA - (void)print {  NSLog(@"Test01"); } @end @implementation ConcreteStrategyB - (void)print {  NSLog(@"Test02"); } @end @implementation Context @synthesize strategy = _strategy; -(void)doIt {  [self.strategy print]; } @end 


策略模式, 作爲一種軟件設計模式, 指對象有某個行爲, 但是在不同的場景中, 該行爲有不同的實現算法, 比如每個人都要, 交個人所得稅, 但是, 在美國交個人所得稅, 在中華民國交個人所得稅, 就有不同的算稅方法, 定义了一族算法, 业务规则, 封装了每个算法, 这族的算法可互换代替, interchangeable, 目录, 结构, 示例, java, actionscript, objective, c结构, 编辑, nbsp, strategy, pattern, nbsp, strategy, patter. 策略模式作爲一種軟件設計模式 指對象有某個行爲 但是在不同的場景中 該行爲有不同的實現算法 比如每個人都要 交個人所得稅 但是 在美國交個人所得稅 和 在中華民國交個人所得稅 就有不同的算稅方法 策略模式 定义了一族算法 业务规则 封装了每个算法 这族的算法可互换代替 interchangeable 目录 1 结构 2 示例 2 1 C 2 2 Java 2 3 C 2 4 ActionScript 3 2 5 PHP 2 6 Objective C结构 编辑 nbsp Strategy Pattern in UML nbsp Strategy pattern in LePUS3 legend 示例 编辑C 编辑 include lt iostream gt using namespace std class StrategyInterface public virtual void execute 0 class ConcreteStrategyA public StrategyInterface public virtual void execute cout lt lt Called ConcreteStrategyA execute method lt lt endl class ConcreteStrategyB public StrategyInterface public virtual void execute cout lt lt Called ConcreteStrategyB execute method lt lt endl class ConcreteStrategyC public StrategyInterface public virtual void execute cout lt lt Called ConcreteStrategyC execute method lt lt endl class Context private StrategyInterface strategy public Context StrategyInterface strategy strategy strategy void set strategy StrategyInterface strategy strategy strategy void execute strategy gt execute int main int argc char argv ConcreteStrategyA concreteStrategyA ConcreteStrategyB concreteStrategyB ConcreteStrategyC concreteStrategyC Context contextA amp concreteStrategyA Context contextB amp concreteStrategyB Context contextC amp concreteStrategyC contextA execute contextB execute contextC execute contextA set strategy amp concreteStrategyB contextA execute contextA set strategy amp concreteStrategyC contextA execute return 0 Java 编辑 StrategyExample test application class StrategyExample public static void main String args Context context Three contexts following different strategies context new Context new FirstStrategy context execute context new Context new SecondStrategy context execute context new Context new ThirdStrategy context execute The classes that implement a concrete strategy should implement this The context class uses this to call the concrete strategy interface Strategy void execute Implements the algorithm using the strategy interface class FirstStrategy implements Strategy public void execute System out println Called FirstStrategy execute class SecondStrategy implements Strategy public void execute System out println Called SecondStrategy execute class ThirdStrategy implements Strategy public void execute System out println Called ThirdStrategy execute Configured with a ConcreteStrategy object and maintains a reference to a Strategy object class Context Strategy strategy Constructor public Context Strategy strategy this strategy strategy public void execute this strategy execute C 编辑 using System namespace Wikipedia Patterns Strategy MainApp test application class MainApp static void Main Context context Three contexts following different strategies context new Context new ConcreteStrategyA context Execute context new Context new ConcreteStrategyB context Execute context new Context new ConcreteStrategyC context Execute The classes that implement a concrete strategy should implement this The context class uses this to call the concrete strategy interface IStrategy void Execute Implements the algorithm using the strategy interface class ConcreteStrategyA IStrategy public void Execute Console WriteLine Called ConcreteStrategyA Execute class ConcreteStrategyB IStrategy public void Execute Console WriteLine Called ConcreteStrategyB Execute class ConcreteStrategyC IStrategy public void Execute Console WriteLine Called ConcreteStrategyC Execute Configured with a ConcreteStrategy object and maintains a reference to a Strategy object class Context IStrategy strategy Constructor public Context IStrategy strategy this strategy strategy public void Execute strategy Execute ActionScript 3 编辑 invoked from application initialize private function init void var context Context context new Context new ConcreteStrategyA context execute context new Context new ConcreteStrategyB context execute context new Context new ConcreteStrategyC context execute package org wikipedia patterns strategy public interface IStrategy function execute void package org wikipedia patterns strategy public final class ConcreteStrategyA implements IStrategy public function execute void trace ConcreteStrategyA execute invoked package org wikipedia patterns strategy public final class ConcreteStrategyB implements IStrategy public function execute void trace ConcreteStrategyB execute invoked package org wikipedia patterns strategy public final class ConcreteStrategyC implements IStrategy public function execute void trace ConcreteStrategyC execute invoked package org wikipedia patterns strategy public class Context private var strategy IStrategy public function Context strategy IStrategy this strategy strategy public function execute void strategy execute PHP 编辑 lt php class StrategyExample public function construct context new Context new ConcreteStrategyA context gt execute context new Context new ConcreteStrategyB context gt execute context new Context new ConcreteStrategyC context gt execute interface IStrategy public function execute class ConcreteStrategyA implements IStrategy public function execute echo Called ConcreteStrategyA execute method n class ConcreteStrategyB implements IStrategy public function execute echo Called ConcreteStrategyB execute method n class ConcreteStrategyC implements IStrategy public function execute echo Called ConcreteStrategyC execute method n class Context var strategy public function construct IStrategy strategy this gt strategy strategy public function execute this gt strategy gt execute new StrategyExample gt Objective C 编辑 protocol Strategy lt NSObject gt required void print end interface ConcreteStrategyA NSObject lt Strategy gt end interface ConcreteStrategyB NSObject lt Strategy gt end interface Context NSObject id lt Strategy gt strategy property nonatomic assign id lt Strategy gt strategy void doIt end implementation ConcreteStrategyA void print NSLog Test01 end implementation ConcreteStrategyB void print NSLog Test02 end implementation Context synthesize strategy strategy void doIt self strategy print end 取自 https zh wikipedia org w index php title 策略模式 amp oldid 62816309, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。