最简单的策略模式代替if-else实战
一、需求
根据用户vip等级来返回不同的价格,vip等级是不固定的,随时可能要增加,价格也不是固定的。
二、常规的写法
/**
* 如果有新增类型,就需要频繁的修改此处的代码!
* 不符合开闭原则!
* @author DUCHONG
*
*/
public class CommonGetPrice { public static final String VIP1="v1";
public static final String VIP2="v2";
public static final String VIP3="v3";
public static final String VIP4="v4"; /**
* 获取vip的价格
* @param type vip类型
* @param price 原价格
* @return
*/
public static double getVipPrice(String type, double price) { if (type.equals(VIP1)) {
System.out.println("不使用策略模式---不打折,原价");
return price;
}
else if (type.equals(VIP2)) {
System.out.println("不使用策略模式---打九折");
return price * 0.9;
}
else if (type.equals(VIP3)) {
System.out.println("不使用策略模式---打八五折");
return price * 0.85;
}
else if (type.equals(VIP4)) {
System.out.println("不使用策略模式---打八折");
return price * 0.8;
}
return price;
} }
三、使用策略模式
3.1、定义策略接口
/**
* 策略接口
* @author DUCHONG
*/
public interface Strategy { double getVipPrice(double originPrice);
}
3.2、定义上下文
上下文持有策略接口的引用,将算法与调用者隔离。
/**
* 负责和具体的策略类交互
* 这样的话,具体的算法和直接的客户端调用分离了,使得算法可以独立于客户端独立的变化。
* 如果使用spring的依赖注入功能,还可以通过配置文件,动态的注入不同策略对象,动态的切换不同的算法.
* @author DUCHONG
*
*/
public class VipContext { /**
* 当前采用的算法对象
*/
private Strategy strategy; public VipContext() { }
/**
* 可以通过构造器来注入
*/
public VipContext(Strategy strategy) {
super();
this.strategy = strategy;
}
/**
* 可以通过set方法来注入
*/
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
} public double getVipPrice(double originPrice){
return strategy.getVipPrice(originPrice);
} }
3.3、不同算法实现类
/**
* @author DUCHONG
* @since 2019-09-24 18:28
**/
public class VipOneStrategy implements Strategy { /**
* vip1 不打折
* @param originPrice
* @return
*/
@Override
public double getVipPrice(double originPrice) { System.out.println("使用策略模式---不打折,原价");
return originPrice;
}
} /**
* @author DUCHONG
* @since 2019-09-24 18:28
**/
public class VipTwoStrategy implements Strategy{ @Override
public double getVipPrice(double originPrice) {
System.out.println("使用策略模式---打九折");
return originPrice * 0.9;
}
} /**
* @author DUCHONG
* @since 2019-09-24 18:28
**/
public class VipThreeStrategy implements Strategy{ @Override
public double getVipPrice(double originPrice) {
System.out.println("使用策略模式---打八五折");
return originPrice * 0.85;
}
} /**
* @author DUCHONG
* @since 2019-09-24 18:28
**/
public class VipFourStrategy implements Strategy{ @Override
public double getVipPrice(double originPrice) {
System.out.println("使用策略模式---打八折");
return originPrice * 0.8;
}
}
四、Client
public class Client {
public static void main(String[] args) {
double originPrice=1000D;
//使用策略模式之前
System.out.println(CommonGetPrice.getVipPrice(CommonGetPrice.VIP1,originPrice));
System.out.println(CommonGetPrice.getVipPrice(CommonGetPrice.VIP2,originPrice));
System.out.println(CommonGetPrice.getVipPrice(CommonGetPrice.VIP3,originPrice));
System.out.println(CommonGetPrice.getVipPrice(CommonGetPrice.VIP4,originPrice));
//使用策略模式之后
VipContext vipContext=new VipContext();
Strategy v1=new VipOneStrategy();
vipContext.setStrategy(v1);
System.out.println(vipContext.getVipPrice(originPrice));
Strategy v2=new VipTwoStrategy();
vipContext.setStrategy(v2);
System.out.println(vipContext.getVipPrice(originPrice));
Strategy v3=new VipThreeStrategy();
vipContext.setStrategy(v3);
System.out.println(vipContext.getVipPrice(originPrice));
Strategy v4=new VipFourStrategy();
vipContext.setStrategy(v4);
System.out.println(vipContext.getVipPrice(originPrice));
}
}
五、结果

最简单的策略模式代替if-else实战的更多相关文章
- 简单的策略模式Strategy演示
策略模式,即规则在变化之中,结果终归为一. 公司给员工计算工资,如有加班费,差旅费,每个月的生活补帖等等其它费用需要计算.这个费的规则是不尽相同. 不管策略的规则怎样,终归需要计算出一个结果 工资: ...
- Android使用的设计模式2——策略模式
今天讲解一下策略模式,策略模式也是很常用的设计模式,对多种算法或者数据结构选择使用的情况下,经常会使用策略模式来管理这些算法.下面会简单讲解一下策略模式的概念和基本实现.然后结合Android里面的实 ...
- Android设计模式之策略模式
今天介绍下策略模式,直接先上UML图 策略模式的概念 The Strategy Pattern defines a family of algorithms,encapsulates each one ...
- Android设计模式—策略模式
1.策略模式概念 定义一系列算法,把他们独立封装起来,并且这些算法之间可以相互替换.策略模式主要是管理一堆有共性的算法,客户端可以根据需要,很快切换这些算法,并且保持可扩展性. 策略模式的本质:分离算 ...
- JavaScript中的设计模式:策略模式
无论学习前端还是后端设计模式是作为一名程序员不可缺少的知识,就像下底传中对于一个边锋来说. 一.策略模式 策略模式给人的第一感觉就是在代码里面消除了很多if-else分支语句,比如一个求员工奖金的程序 ...
- Head First 设计模式 第1章 策略模式
本章从浅入深的讲解了策略模式的使用,以及策略模式中所涉及到的几个设计原则,在本章的最后给出了策略模式的定义. 1.定义及优点 什么是策略模式呢? 答:定义算法族(对象),分别封装起来,让他们之间可以相 ...
- 策略模式(Strategy )
为实现一个目的采用不同的方式都可实现,具体看要采取哪种方式. //接口 public interface Strategy { public void algorithmInterface(); ...
- swift设计模式学习 - 策略模式
移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 策略模式 策略模式定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. ...
- Strategy 策略模式 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
随机推荐
- 关于Keil4 转到 Keil5以后的一些错误解决
一, 看自己选择CPU型号,根据型号再做配置 根据自己型号填写
- 39、Parquet数据源之自动分区推断&合并元数据
一.自动分区推断 1.概述 表分区是一种常见的优化方式,比如Hive中就提供了表分区的特性.在一个分区表中,不同分区的数据通常存储在不同的目录中, 分区列的值通常就包含在了分区目录的目录名中.Spar ...
- webstorm 和 vscode 的纠结
自从知道了 vscode 之后,尝试了一下后,就开始纠结是否要更换到vscode. 特别是在 webstorm 卡的时候. 也研究了几日 vscode,安装了许多插件. 我是安装插件后, 就开始学习快 ...
- JSP了解点基础
了解即可: 1.JSP本质: 是将jsp文件解析为java servlet类! 生成.class文件 存放在工程的work文件夹内! 2.注释 <%-- --%> html ...
- 可能需要用到的Mac技巧or软件
1. Mac 打开任意来源 本博文链接:https://www.cnblogs.com/toulanboy/ 1.1. 打开 在终端中,输入命令sudo spctl --master-disable, ...
- De1ctf - shell shell shell记录
虽然是N1CTF原题,但是自己没遇见过,还是做的题少,记录一下吧== 1.源码泄露,直接可以下到所有源码,然后代码审计到一处insert型注入: 这里直接带入insert里面,跟进去看看 insert ...
- PostgreSQL: Rename a User
Syntax The syntax to rename a user using the ALTER USER statement in PostgreSQL is: ALTER USER user_ ...
- name_scope与variable_scope 详解
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/lucky7213/article/deta ...
- R Shiny app | 交互式网页开发
网页开发,尤其是交互式动态网页的开发,是有一定门槛的,如果你有一定的R基础,又不想过深的接触PHP和MySQL,那R的shiny就是一个不错的选择. 现在R shiny配合R在统计分析上的优势,可以做 ...
- 用variant的数据来推导基因表达 | Imputation of Expression Using PrediXcan
一个工具的逻辑得足够完善.意义足够重大,才有资格发在NG上. A gene-based association method for mapping traits using reference tr ...