java策略_java策略模式
如果都使用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策略模式相关推荐
- java命令_JAVA与模式之命令模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述命令(Command)模式的: 命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式. ...
- java桥_JAVA 桥模式
桥梁模式的用意是"将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化".这句话很短,但是第一次读到这句话的人很可能都会思考良久而 ...
- java建造_java建造者模式
使用场景 遇到多个构造器参数时要考虑用构造器 实现 不直接生产想要的对象,而是让客户端利用所以必要的参数调用构造器,得到一个builder对象,最后,客户端调用无参的build方法来生产不可变的对象, ...
- Java中的策略模式实例教程
策略模式是一种行为模式.用于某一个具体的项目有多个可供选择的算法策略,客户端在其运行时根据不同需求决定使用某一具体算法策略. 策略模式也被称作政策模式.实现过程为,首先定义不同的算法策略,然后客户端把 ...
- Java设计模式之策略模式与状态模式
一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...
- Java设计模式之策略模式(UML类图分析+代码详解)
大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...
- Java设计模式之策略模式+工厂模式+模板模式
Java设计模式之策略模式+工厂模式+模板模式 1.策略模式+工厂模式+模板模式 个人的理解:实际开发工程中,一些业务很复杂的逻辑使用很多的 if 或者 if···else 语句,不利于维护和扩展,为 ...
- java 设计模式之桥接模式,策略模式
java 设计模式之桥接模式,策略模式 1.引出设计模式 相信大家都玩过王者荣耀这款游戏.我们知道现在大概有九十多个英雄且各自技能及背景故事.台词.被动都不一样而且还带着召唤师技能比如实现,惩戒,弱化 ...
- Java设计模式之——策略模式
策略模式的简单介绍 在软件开发中常常遇到这样的情况:实现某一个功能可以有多种算法或者策略,我们根据事件情况选择不同的算法或者策略来完成该功能.例如,排序算法,可以使用插入排序.归并排序.冒泡排序等. ...
最新文章
- centos的ssh配置
- log4j使用方法(一)——先跑起来再说
- 多伦多计算机科学大学,加拿大计算机科学专业 - 加拿大多伦多大学的计算机专业...
- 两数之和-给定一个整数数组nums和一个目标值target,请你在该数组找出和为目标值的那两个整数,并返回他们的数组下标,你可以假设每种输入只会对应一个答案。但是,数组同一个元素不能使-python
- Window_纪中_1326_单调队列
- Spark之SparkSQL和DataFrame
- Python中的Bunch模式
- 计算机硬盘有磁性材料吗,电脑硬盘里有磁铁吗
- 由numpy.arange函数看双精度浮点数的精度问题
- 分享RTFM和STFW的意思
- git常用命令及常见问题
- oracle提示符sqlprompt
- 如何做自己开发一个app
- 新数组中的元素是对原数组中的元素升序排列后所得。
- java两个frame之间_java – JFrame中的两个JPanel,另一个是JP
- SPARQL入门(一)SPARQL简介与简单使用
- 如何选择手游代理加盟平台?
- 怎么计算PMP证书续证日期?
- 复习一周,字节跳动三场技术面+HR面,不小心拿了offer
- 知乎最高赞回答!零代码基础,把报表做出科技感是什么体验?
热门文章
- 为什么要做漏洞扫描呢?
- WeLink的杀手锏和远程办公软件的另一面
- 【华为云技术分享】40%性能提升,华为云推出PostgreSQL 12 商用版
- 【华为云技术分享】云小课 | SAP容灾一点通
- 云图说|高效管理华为云SAP的“秘密武器”
- 2021c语言教程,全国计算机等级考试二级教程——C语言程序设计(2021年版)
- 关于Python生成器的一个小问题(StopIteration)
- window10安装oracle VirtualBox 虚拟机+ubuntu16.04安装Ros
- Python类的成员
- dll可以在linux下使用吗_Linux下使用rm删除文件,并排除指定文件