首页 > 其他分享 >策略模式

策略模式

时间:2023-04-16 21:22:25浏览次数:42  
标签:策略 InterestCalStrategy List 模式 calInterest 算法 测算 public

概述

《设计模式》一书中对于 “策略模式” 的意图描述如下:

定义一系列算法,将它们一个个封装起来,并是他们可以相互替代

一般策略模式的 UML 图如下所示:

strategy_pattern_uml.png

一般在以下几种情况中使用策略模式:

  • 许多相关的类仅仅是行为有异。“策略” 提供了一种用多个行为中的一个行为来配置一个类的方法
  • 需要使用一个算法的不同变体。比如,在不同的使用场景下,可能需要考虑时间/空间复杂度较为优秀的算法
  • 算法使用了客户端不应该知道的数据
  • 一个类定义了多种行为,并且这些行为在这个类的操作中一多个条件语句的形式出现

具体示例

假设现在存在一个需要计算利息的的测算模型,对于不同的测算模型,需要采取不同的利息测算算法,一般常见的测算算法分为等额本金和等额本息,可能不同的资产管理公司还会存在其它的测算算法,为了能够可扩展地对利息进行测算,我们需要将利息的测算和当前的上下文进行分离,有具体的使用场景来决定采用何种测算算法

首先,我们定义我们的利息测算的接口策略 InterestCalStrategy

public interface InterestCalStrategy {
    /**
    	根据传入的本金信息计算对应的还本付息计划
    */
    List<CashFlow> calInterest(List<Principal> prinicipalList);
}

对于不同的测算算法,我们需要定义不同的具体测算实例类:

public class EqualPrinicipalStrategy implements InterestCalStrategy {
    @Override
    public List<CashFlow> calInterest(List<Principal> prinicipalList) {
        // 具体的测算逻辑
    }
}

public class EqualInterestStrategy implements InterestCalStrategy {
    @Override
    public List<CashFlow> calInterest(List<Principal> prinicipalList) {
        // 具体的测算逻辑
    }
}

对于所处的上下文来讲,它只需要持有对应测算算法的引用即可:

public class ApplicationContext {
    private InterestCalStrategy strategy;
    
    public void setStrategy(InterestCalStrategy strategy) {
        this.strategy = strategy;
    }
    
    public List<CashFlow> calInterest(List<Principal> prinicipalList) {
        return strategy.calInterest(prinicipalList);
    }
}

实际使用时只需要由客户端选取对应的策略进行测算即可:

public class Application {
    public static void main(String[] args) {
        ApplicationContext context = new ApplicationContext();
        // 等额本金的算法计算
        context.setStrategy(new EqualPrinicipalStrategy());
        context.calInterest(obtainPrinicipals());
        
        //  等额本息的计算
        context.setStrategy(new EqualInterestStrategy());
        context.calInterest(obtainPrinicipals());
    }
}

总结

策略模式的使用可以减少一些冗余的 if{}else{} 的使用,看起来和 "命令模式" 很相似。实际上这两个模式的最大区别在于 “命令模式” 强调需要做什么,而 “策略模式” 则在强调需要怎么做


参考:

[1] 《设计模式—可复用面向对象基础》

[2] https://stackoverflow.com/questions/4834979/difference-between-strategy-pattern-and-command-pattern

标签:策略,InterestCalStrategy,List,模式,calInterest,算法,测算,public
From: https://www.cnblogs.com/FatalFlower/p/17324122.html

相关文章

  • Day07-设计模式之桥接模式
    桥接模式介绍桥接模式(BridgePattern)是将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变,保持各部分的独立性以及应对他们的功能扩展。UML类图及角色职责抽象类(Abstraction):定义抽象接口,由聚合关系可知,抽象类中包含一个Implementor类型的对象,它与Implementor......
  • Day08-设计模式之装饰者模式
    设计模式之装饰者模式引例需求:假设现在有烧饵块:白米饵块(WhiteRice),紫米饵块(PurpleRice),黄米饵块(yellowRice),调料有热狗(HotDog),油条(oilNoodle),鸡柳(chicken),客户可以单点白米的,或者白米+调料的组合,计算相应的费用,要求在扩展饵块种类的时候,具有良好的扩展性,改动维护方便。一般解法方......
  • Day09-设计模式之组合模式
    设计模式之组合模式引例在现实生活中,存在很多“部分-整体”的关系,例如,大学中的学院与系、总公司中的分公司与部门,文件系统中的文件与文件夹等。对这些简单对象与复合对象的处理,如果用组合模式来实现会很方便。组合模式介绍组合模式定义如下:组合模式(CompositePattern)也称为......
  • 关于敏捷开发、系统重构、设计原则、设计模式之间的思考
    敏捷开发、系统重构、设计模式是软件开发中不同的概念,它们之间有一些联系和相互影响。敏捷开发方法强调快速响应客户需求,通过迭代和增量的方式来开发软件。在敏捷开发中,设计模式可以被用来提高软件质量和可维护性,因为设计模式是已经被证明有效的软件设计方案。在开发过程中,团队可......
  • docker网络模式
    Docker有4种网络模式(--network=)bridge默认模式,分配networknamespace和IP,连接到docker0网桥上。host使用主机IP,不分配networknamespace和IP,和宿主机共用networknamespace。container和已存在的某个容器共享networknamespace,不分配IP。k8s的业务容器采用Docker的container网......
  • Golang - Option模式(2)(函数选项模式)
    函数式选项模式(FunctionalOptionsPattern)函数式选项模式是一种在Go中构造结构体的模式,它通过设计一组非常有表现力和灵活的API来帮助配置和初始化结构体。优缺点选项模式有很多优点,例如:支持传递多个参数并且在参数发生变化时保持兼容性;支持任意顺序传递参数;支持默认值;方......
  • eureka源码简单剖析-服务端(服务接口暴露策略)
    下面来看下服务接口暴露的策略。其中服务端使用了Jersey框架,而Jersey框架是一个发布restful风格接口的框架,类似我们使用的springmvc, 然后下面看下jersey部分    以上就是服务接口暴露的相关策略部分......
  • 状态模式
    概述《设计模式》一书中对于“状态模式”的描述如下:允许一个对象在其内部状态发生改变时改变它的行为,使得这个对象看起来像修改了它的类状态模式的UML图如下所示:一般在以下几种情况下使用状态模式:一个对象的行为取决于它的状态一个操作中含有庞大的多分支条件语句,且......
  • 《3D编程模式》写书-第3次记录
    大家好,这段时间我完成了“积木模式”、“管道模式”、“多线程模式”、“依赖隔离模式”的初稿目前我已经完成了所有模式(7个模式)的初稿,下面会给出它们的使用场景,如果您正好能用到,请联系我提前阅读模式的初稿,欢迎大家给出反馈建议,您的大名有机会出现在《3D编程模式》的书中,感谢!我......
  • [Mellanox] 安装MFT并配置网卡为以太网模式
    [Mellanox]安装MFT并配置网卡为以太网模式当我们想要配置Mellanox网卡时,如果出现了下面情况:$sudomststartmst:commandnotfound这说明我们的系统中缺少MFT。MFT是一套管理Mellanox网卡的工具,也是MLEX_OFED中的一部分。如果你不小心搞丢了MFT,可以用下面的方法安装:去......