最简单的策略模式代替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 ...
随机推荐
- 015_Python3 迭代器与生成器
迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...
- git中常用命令
1.全局安装git Git-2.11.1-64-bit() //配置gitgit config --global user.name "您的git账号名"git config -- ...
- DEV C++的使用
1.点击dev图标: 2.左上角点击:文件——新建——源代码(快捷键ctrl+N): 3. 然后开始写代码: 4.点击运行: 右边的那个编译加运行(点这个),左边编译,中间运行. 5.保存(可以修改保 ...
- Linux 命令集合之进程查看命令-软件安装命令-文件查找命令-主机修改命令
1.dpkg 的使用 dpkg -s ssh 查看是否按装了ssh软件 dpkg -L ssh 查看ssh安装的关联目录结构和安装位置 dpkg -i vim.deb 本地离线安装vim编辑器 apt ...
- rpm命令是RPM软件包的管理工具
rpm命令是RPM软件包的管理工具.rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎.逐渐受到其他发行版的采用.RPM ...
- make 的使用参数
- Vim初学
实现G++编译 1,首先下载安装MinGW,下载地址在http://sourceforge.net/projects/mingw/.这个是边下载边安装的,下载完成即安装完成.我的安装目录是G:\Min ...
- python代码统计
代码统计 修改filename为文件夹or文件地址,然后统计所有python文件代码 import os import sys def count_code_lines(filename): res ...
- P2258 子矩阵——搜索+dp
P2258 子矩阵 二进制枚举套二进制枚举能过多一半的点: 我们只需要优化一下第二个二进制枚举的部分: 首先我们先枚举选哪几行,再预处理我们需要的差值,上下,左右: sum_shang,sum_hen ...
- 第02组 Alpha冲刺(3/6)
第02组 Alpha冲刺(3/6) 队名:無駄無駄组长博客作业博客 组员情况 张越洋 过去两天完成了哪些任务 摸鱼 提交记录(全组共用) 接下来的计划 沟通前后端成员,监督.提醒他们尽快完成各自的 ...