如果都使用if-else的话,就会使用代码变的臃肿,而且难以复用。那我们就可以根据不同的情况,将不同的方式封装成不同的策略,将策略与它的使用对象分离开来。

案例:

定义注解,标注范围

/**

* @author Gjing

* 价格范围注解

**/

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

public @interface PriceRegion {

int min() default 0;

int max() default Integer.MAX_VALUE;

}

具体策略

/**

* @author Gjing

* 抽象策略

**/

public interface Price {

BigDecimal getPrice(BigDecimal price);

}

/**

* @author Gjing

* 会员,六折

**/

@PriceRegion(min = 10000,max = 20000)

class Member implements Price {

@Override

public BigDecimal getPrice(BigDecimal price) {

return price.multiply(new BigDecimal(0.6 + ""));

}

}

/**

* @author Gjing

* 普通客户

**/

@PriceRegion(max = 10000)

class Ordinary implements Price {

@Override

public BigDecimal getPrice(BigDecimal price) {

return price;

}

}

/**

* @author Gjing

* 超级会员,4折

**/

@PriceRegion(min = 20000)

class SuperMember implements Price{

@Override

public BigDecimal getPrice(BigDecimal price) {

return price.multiply(new BigDecimal(0.4+""));

}

}

策略上下文和策略工厂

/**

* @author Gjing

* 上下文

**/

class PriceContext {

BigDecimal getPrice(BigDecimal costPrice) throws Exception {

Price price = PriceFactory.getInstance().getPrice(costPrice);

return price.getPrice(costPrice);

}

}

/**

* @author Gjing

* 策略工厂

**/

class PriceFactory {

private static final PriceFactory FACTORY = new PriceFactory();

/**

* 策略类集合

*/

private List> priceList = new ArrayList<>();

private PriceFactory() {

//这边是可以改造成自动获取文件路径的哈

priceList.add(Member.class);

priceList.add(Ordinary.class);

priceList.add(SuperMember.class);

}

/**

* 获取对应金额的策略类

* @param price 金额

* @return Price

* @throws Exception classNotFound

*/

Price getPrice(BigDecimal price) throws Exception{

for (Class extends Price> clazz : priceList) {

PriceRegion priceRegion = clazz.getAnnotation(PriceRegion.class);

if (price.compareTo(new BigDecimal(priceRegion.max())) < 0 && price.compareTo(new BigDecimal(priceRegion.min())) > 0) {

return clazz.newInstance();

}

}

return null;

}

static PriceFactory getInstance() {

return FACTORY;

}

}

调用:

/**

* @author Gjing

**/

public class Test {

public static void main(String[] args) throws Exception {

PriceContext priceContext = new PriceContext();

System.out.println(priceContext.getPrice(new BigDecimal(200)));

System.out.println(priceContext.getPrice(new BigDecimal(11100)));

System.out.println(priceContext.getPrice(new BigDecimal(30000)));

}

}

以上为个人见解,如有误欢迎大家指正

java策略_java策略模式相关推荐

  1. java命令_JAVA与模式之命令模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述命令(Command)模式的: 命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式. ...

  2. java桥_JAVA 桥模式

    桥梁模式的用意是"将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化".这句话很短,但是第一次读到这句话的人很可能都会思考良久而 ...

  3. java建造_java建造者模式

    使用场景 遇到多个构造器参数时要考虑用构造器 实现 不直接生产想要的对象,而是让客户端利用所以必要的参数调用构造器,得到一个builder对象,最后,客户端调用无参的build方法来生产不可变的对象, ...

  4. Java中的策略模式实例教程

    策略模式是一种行为模式.用于某一个具体的项目有多个可供选择的算法策略,客户端在其运行时根据不同需求决定使用某一具体算法策略. 策略模式也被称作政策模式.实现过程为,首先定义不同的算法策略,然后客户端把 ...

  5. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

  6. Java设计模式之策略模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  7. Java设计模式之策略模式+工厂模式+模板模式

    Java设计模式之策略模式+工厂模式+模板模式 1.策略模式+工厂模式+模板模式 个人的理解:实际开发工程中,一些业务很复杂的逻辑使用很多的 if 或者 if···else 语句,不利于维护和扩展,为 ...

  8. java 设计模式之桥接模式,策略模式

    java 设计模式之桥接模式,策略模式 1.引出设计模式 相信大家都玩过王者荣耀这款游戏.我们知道现在大概有九十多个英雄且各自技能及背景故事.台词.被动都不一样而且还带着召唤师技能比如实现,惩戒,弱化 ...

  9. Java设计模式之——策略模式

    策略模式的简单介绍 在软件开发中常常遇到这样的情况:实现某一个功能可以有多种算法或者策略,我们根据事件情况选择不同的算法或者策略来完成该功能.例如,排序算法,可以使用插入排序.归并排序.冒泡排序等. ...

最新文章

  1. centos的ssh配置
  2. log4j使用方法(一)——先跑起来再说
  3. 多伦多计算机科学大学,加拿大计算机科学专业 - 加拿大多伦多大学的计算机专业...
  4. 两数之和-给定一个整数数组nums和一个目标值target,请你在该数组找出和为目标值的那两个整数,并返回他们的数组下标,你可以假设每种输入只会对应一个答案。但是,数组同一个元素不能使-python
  5. Window_纪中_1326_单调队列
  6. Spark之SparkSQL和DataFrame
  7. Python中的Bunch模式
  8. 计算机硬盘有磁性材料吗,电脑硬盘里有磁铁吗
  9. 由numpy.arange函数看双精度浮点数的精度问题
  10. 分享RTFM和STFW的意思
  11. git常用命令及常见问题
  12. oracle提示符sqlprompt
  13. 如何做自己开发一个app
  14. 新数组中的元素是对原数组中的元素升序排列后所得。
  15. java两个frame之间_java – JFrame中的两个JPanel,另一个是JP
  16. SPARQL入门(一)SPARQL简介与简单使用
  17. 如何选择手游代理加盟平台?
  18. 怎么计算PMP证书续证日期?
  19. 复习一周,字节跳动三场技术面+HR面,不小心拿了offer
  20. 知乎最高赞回答!零代码基础,把报表做出科技感是什么体验?

热门文章

  1. 为什么要做漏洞扫描呢?
  2. WeLink的杀手锏和远程办公软件的另一面
  3. 【华为云技术分享】40%性能提升,华为云推出PostgreSQL 12 商用版
  4. 【华为云技术分享】云小课 | SAP容灾一点通
  5. 云图说|高效管理华为云SAP的“秘密武器”
  6. 2021c语言教程,全国计算机等级考试二级教程——C语言程序设计(2021年版)
  7. 关于Python生成器的一个小问题(StopIteration)
  8. window10安装oracle VirtualBox 虚拟机+ubuntu16.04安装Ros
  9. Python类的成员
  10. dll可以在linux下使用吗_Linux下使用rm删除文件,并排除指定文件