一、需求

  根据用户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实战的更多相关文章

  1. 简单的策略模式Strategy演示

    策略模式,即规则在变化之中,结果终归为一. 公司给员工计算工资,如有加班费,差旅费,每个月的生活补帖等等其它费用需要计算.这个费的规则是不尽相同. 不管策略的规则怎样,终归需要计算出一个结果 工资: ...

  2. Android使用的设计模式2——策略模式

    今天讲解一下策略模式,策略模式也是很常用的设计模式,对多种算法或者数据结构选择使用的情况下,经常会使用策略模式来管理这些算法.下面会简单讲解一下策略模式的概念和基本实现.然后结合Android里面的实 ...

  3. Android设计模式之策略模式

    今天介绍下策略模式,直接先上UML图 策略模式的概念 The Strategy Pattern defines a family of algorithms,encapsulates each one ...

  4. Android设计模式—策略模式

    1.策略模式概念 定义一系列算法,把他们独立封装起来,并且这些算法之间可以相互替换.策略模式主要是管理一堆有共性的算法,客户端可以根据需要,很快切换这些算法,并且保持可扩展性. 策略模式的本质:分离算 ...

  5. JavaScript中的设计模式:策略模式

    无论学习前端还是后端设计模式是作为一名程序员不可缺少的知识,就像下底传中对于一个边锋来说. 一.策略模式 策略模式给人的第一感觉就是在代码里面消除了很多if-else分支语句,比如一个求员工奖金的程序 ...

  6. Head First 设计模式 第1章 策略模式

    本章从浅入深的讲解了策略模式的使用,以及策略模式中所涉及到的几个设计原则,在本章的最后给出了策略模式的定义. 1.定义及优点 什么是策略模式呢? 答:定义算法族(对象),分别封装起来,让他们之间可以相 ...

  7. 策略模式(Strategy )

    为实现一个目的采用不同的方式都可实现,具体看要采取哪种方式. //接口 public interface Strategy {    public void algorithmInterface(); ...

  8. swift设计模式学习 - 策略模式

    移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 策略模式 策略模式定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. ...

  9. Strategy 策略模式 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

随机推荐

  1. 关于Keil4 转到 Keil5以后的一些错误解决

    一, 看自己选择CPU型号,根据型号再做配置 根据自己型号填写

  2. 39、Parquet数据源之自动分区推断&合并元数据

    一.自动分区推断 1.概述 表分区是一种常见的优化方式,比如Hive中就提供了表分区的特性.在一个分区表中,不同分区的数据通常存储在不同的目录中, 分区列的值通常就包含在了分区目录的目录名中.Spar ...

  3. webstorm 和 vscode 的纠结

    自从知道了 vscode 之后,尝试了一下后,就开始纠结是否要更换到vscode. 特别是在 webstorm 卡的时候. 也研究了几日 vscode,安装了许多插件. 我是安装插件后, 就开始学习快 ...

  4. JSP了解点基础

    了解即可: 1.JSP本质: 是将jsp文件解析为java servlet类! 生成.class文件   存放在工程的work文件夹内! 2.注释  <%--   --%>    html ...

  5. 可能需要用到的Mac技巧or软件

    1. Mac 打开任意来源 本博文链接:https://www.cnblogs.com/toulanboy/ 1.1. 打开 在终端中,输入命令sudo spctl --master-disable, ...

  6. De1ctf - shell shell shell记录

    虽然是N1CTF原题,但是自己没遇见过,还是做的题少,记录一下吧== 1.源码泄露,直接可以下到所有源码,然后代码审计到一处insert型注入: 这里直接带入insert里面,跟进去看看 insert ...

  7. PostgreSQL: Rename a User

    Syntax The syntax to rename a user using the ALTER USER statement in PostgreSQL is: ALTER USER user_ ...

  8. name_scope与variable_scope 详解

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/lucky7213/article/deta ...

  9. R Shiny app | 交互式网页开发

    网页开发,尤其是交互式动态网页的开发,是有一定门槛的,如果你有一定的R基础,又不想过深的接触PHP和MySQL,那R的shiny就是一个不错的选择. 现在R shiny配合R在统计分析上的优势,可以做 ...

  10. 用variant的数据来推导基因表达 | Imputation of Expression Using PrediXcan

    一个工具的逻辑得足够完善.意义足够重大,才有资格发在NG上. A gene-based association method for mapping traits using reference tr ...