最简单的策略模式代替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 ...
随机推荐
- learning java AWT widowEvent and MouseEvent
import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import jav ...
- copy()函数技术推演
/*** str_copy.c ***/ #include<stdio.h> void copy_str21(char *from, char *to) { for(; *from != ...
- coturn编译运行在Windows平台
turn 编译安装到Windows平台 https://www.webrtc-experiment.com/docs/TURN-server-installation-guide.html#windo ...
- Oracle误删除数据恢复。Oracle删除后恢复数据
发现误删除时需要及时处理,速度要快,姿势要帅.晚了就恢复不了额 1.查询时间 以确保恢复到某个时间点 select SQL_TEXT, LAST_ACTIVE_TIME from v$sqlarea ...
- 性能测试学习第八天-----linux环境整合篇
- Hadoop hadoop balancer配置
hadoop版本:2.9.2 1.带宽的设置参数: dfs.datanode.balance.bandwidthPerSec 默认值 10m 2.datanode之间数据块的传输线程大小:dfs. ...
- shell脚本实例,通向shell脚本大师的必经之路
概述 读书百遍其义自见,shell脚本也是,只要例子看得多了,自然就知道怎么写了.这里主要整理了20几个例子,因为内容比较多,所以分了几次来做介绍了.下面的实例最好先自己思考怎么去实现,然后再看下实现 ...
- lol英雄时刻
2019.5.30 翻出了当年人生中第一次LOL五杀截图...我用佐伊拿五杀了! 第一次五杀超激动的
- VS2017打包注册IE插件及修改IE安全选项设置【转】
前言 最近项目需要在浏览器环境下读取员工身份证信息,要实现网页与硬件设备通信,考虑了几种实现方式: 1.借助ActiveX插件,通过程序库直接与设备通信. 优点:厂家提供了IE插件,开发简单 缺点:只 ...
- 从库延迟增大,MySQL日志出现InnoDB: page_cleaner: 1000ms intended loop took 17915ms.
今天同事负责的数据库从库出现从库延迟增大,MySQL日志InnoDB: page_cleaner: 1000ms intended loop took 17915ms. 了解原因,keepalived ...