找回密码
 立即注册
首页 业界区 业界 【策略设计模式详解】C/Java/JS/Go/Python/TS不同语言实 ...

【策略设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

殳世英 2025-6-6 09:51:16
简介

策略模式(Strategy Pattern)属于行为型设计模式。将每一个算法封装到具有共同接口的独立类中,根据需要来绑定策略,使得具体实现和策略解耦。
当你想使用对象中各种不同的算法变体,使用if...else 所带来的复杂和难以维护,可使用策略模式。或者当有许多相同类,它们仅在执行某些行为时略有不同,可使用策略模式。
作用


  • 策略算法可以自由切换,保持策略与执行类的松耦合。
  • 避免使用多重条件判断,不同环境角色可以组装多个策略。
  • 扩展性良好,可以随时增删策略行为。
  • 体现了多用组合,少用继承。
实现步骤


  • 建立一个策略接口。
  • 新建多个策略行为类,实现该策略接口。
  • 建立一个抽象环境角色类,并将策略接口组合进来。是否需要抽象类可选。
  • 建立多个环境角色类来继承该抽象类。
  • 可以动态改变环境角色的策略行为。
 
不同语言设计模式源码下载:
https://github.com/microwind/design-pattern
UML

1.png

 
Java代码

状态基础接口
  1. // Strategy.java 基础策略接口
  2. public interface Strategy {
  3.   public void run();
  4. }
复制代码
策略实现类
  1. // StrategyA.java 策略A
  2. public class StrategyA implements Strategy {
  3.   @Override
  4.   public void run() {
  5.      System.out.println("StrategyA::run().");
  6.   }
  7. }
复制代码
  1. // StrategyB.java 策略B
  2. public class StrategyB implements Strategy {
  3.   @Override
  4.   public void run() {
  5.      System.out.println("StrategyB::run().");
  6.   }
  7. }
复制代码
  1. // StrategyC.java 策略C
  2. public class StrategyC implements Strategy {
  3.   @Override
  4.   public void run() {
  5.      System.out.println("StrategyC::run().");
  6.   }
  7. }
复制代码
抽象业务类
  1. // Context.java 抽象业务类,聚合策略对象
  2. public abstract class Context {
  3.   protected Strategy strategy;
  4.   public void setStrategy(Strategy strategy) {
  5.     this.strategy = strategy;
  6.   }
  7.   public void action() {
  8.     this.strategy.run();
  9.   }
  10. }
复制代码
具体业务类
  1. // ContextCat.java 业务类构造器聚合了某策略
  2. public class ContextCat extends Context {
  3.   public ContextCat() {
  4.     // 使用某个策略
  5.     System.out.println("ContextCat::setStrategy(StrategyC).");
  6.     this.setStrategy(new StrategyC());
  7.   }
  8. }
复制代码
  1. // ContextDog.java 业务类构造器聚合了某策略
  2. public class ContextDog extends Context {
  3.   public ContextDog() {
  4.     // 使用某个策略
  5.     System.out.println("ContextDog::setStrategy(StrategyB).");
  6.     this.setStrategy(new StrategyB());
  7.   }
  8. }
复制代码
测试调用
  1.   /**
  2.    * 策略模式就是根据需要给对象绑定具体策略,使得具体实现和策略可以灵活搭配。
  3.    * 先声明某个具体Context对象,该对象已经绑定了具体策略,同时还可以更改策略。
  4.    */
  5.     // 实例化某个内容,策略已经绑定上
  6.     Context contextCat = new ContextCat();
  7.     contextCat.action();
  8.     // 重新设置策略
  9.     System.out.println("reset contextCat'strategy to StrategyA.");
  10.     contextCat.setStrategy(new StrategyA());
  11.     contextCat.action();
  12.    
  13.     // 实例化某个内容,策略已经绑定上
  14.     Context contextGog = new ContextDog();
  15.     contextGog.action();
复制代码
Go代码

状态基础接口
  1. // Strategy.go 基础策略接口
  2. // 定义一个策略接口,注意go语言数据类型即接口
  3. type Strategy interface {
  4.     Run()
  5. }
  6. // 写在接口文件的其他全局方法
  7. func Init() {
  8.     fmt.Println("strategy init!")
  9. }
复制代码
策略实现类
  1. // StrategyA.go 策略A
  2. type StrategyA struct {
  3. }
  4. // 实现策略接口的对应方法
  5. func (s *StrategyA) Run() {
  6.     fmt.Println("StrategyA::Run")
  7. }
复制代码
  1. // StrategyB.go 策略B
  2. type StrategyB struct {
  3. }
  4. // 实现策略接口的对应方法
  5. func (s *StrategyB) Run() {
  6.     fmt.Println("StrategyB::Run")
  7. }
复制代码
  1. // StrategyC.go 策略C
  2. type StrategyC struct {
  3. }
  4. // 实现策略接口的对应方法
  5. func (s *StrategyC) Run() {
  6.     fmt.Println("StrategyC::Run")
  7. }
复制代码
抽象业务类
  1. // Context.go 抽象业务类,聚合策略对象
  2. type Context struct {
  3.     strategy Strategy
  4. }
  5. // 设置不同strategy,方法名首字母大写
  6. func (c *Context) SetStrategy(s Strategy) {
  7.     c.strategy = s
  8. }
  9. // 执行策略接口里面的方法
  10. func (c *Context) Run() {
  11.     c.strategy.Run()
  12. }
复制代码
具体业务类
  1. // ContextCat.go 业务类构造器聚合了某策略
  2. // 定义具体执行对象,Go没有继承,用聚合来调用Context里的函数
  3. type ContextCat struct {
  4.     context Context
  5. }
  6. // 可提前绑定具体的策略
  7. func (c *ContextCat) Init() {
  8.     c.context.SetStrategy(&StrategyC{})
  9.     fmt.Println("ContextCat::init. setStrategy(StrategyC)")
  10. }
  11. // 调用策略方法
  12. func (c *ContextCat) Run() {
  13.     fmt.Println("ContextCat::run")
  14.     c.context.Run()
  15. }
复制代码
  1. // ContextDog.go 业务类构造器聚合了某策略
  2. type ContextDog struct {
  3.     context Context
  4. }
  5. // 可提前绑定具体的策略
  6. func (c *ContextDog) Init() {
  7.     c.context.SetStrategy(&StrategyB{})
  8.     fmt.Println("ContextDog::init. setStrategy(StrategyB)")
  9. }
  10. // 调用策略方法
  11. func (c *ContextDog) Run() {
  12.     fmt.Println("ContextDog::run")
  13.     c.context.Run()
  14. }
复制代码
测试调用
  1. func main() {
  2.     fmt.Println("test start:")
  3.     // 这里src.Init来自strategy.go文件
  4.     src.Init()
  5.     /**
  6.      * 策略模式就是根据需要给对象绑定具体策略,使得具体实现和策略可以灵活搭配。
  7.      * 先声明某个具体Context对象,该对象已经绑定了具体策略,同时还可以更改策略。
  8.      */
  9.     // 声明策略执行对象
  10.     context := src.Context{}
  11.     // 设置策略A
  12.     context.SetStrategy(&src.StrategyA{})
  13.     // 执行策略A,打印StrategyA
  14.     context.Run()
  15.     // 设置策略B
  16.     context.SetStrategy(&src.StrategyB{})
  17.     // 执行策略B,打印StrategyB
  18.     context.Run()
  19.     // 执行策略C,打印StrategyC
  20.     context.SetStrategy(&src.StrategyC{})
  21.     context.Run()
  22.     // /*********************** 分割线 ******************************************/
  23.     // 直接实例化具体执行对象,策略已经绑定
  24.     contextCat := src.ContextCat{}
  25.     contextCat.Init()
  26.     contextCat.Run()
  27.     // 直接实例化具体执行对象,策略已经绑定
  28.     contextDog := src.ContextDog{}
  29.     contextDog.Init()
  30.     contextDog.Run()
  31. }
复制代码
更多语言版本

不同语言设计模式源码:https://github.com/microwind/design-pattern

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册