策略模式(Strategy):它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

  下面将以商场打折为例子,说明策略模式。商场收银如何促销,用打折还是返利其实都是一些算法,用简单工厂来生产算法对象,这没有错,但算法本身只是一种策略,最重要的是这些算法是随时都可能互相替换的,这就是变化点,而封装变化点是我们面向对象的一种很重要的思维方式。

  1.Strategy类,定义所有支持的算法的公共接口:

  

 package com.lujie;
//抽象算法类
public interface CashSuper {
//算法方法
public abstract double acceptCash(double money);
}

  2.ConcreteStrategy,封装了具体的算法或行为,继承与strategy

package com.lujie;
//打折收费子类
public class CashRebate implements CashSuper{
private double moneyRebate=1d;
public void setMoneyRebat(double moneyRebat) {
this.moneyRebate = moneyRebat;
}
public double getMoneyRebat() {
return moneyRebate;
}
@Override
public double acceptCash(double money) {
return money*moneyRebate;
}
public CashRebate(String moneyRebate) {
// TODO Auto-generated constructor stub
this.moneyRebate=Double.valueOf(moneyRebate).doubleValue();
}
}
 package com.lujie;

 //返利收费子类
public class CashReturn implements CashSuper{ private double moneyCondition=0.0d;
private double moneyReturn=0.0d;
public void setMoneyCondition(double moneyCondition) {
this.moneyCondition = moneyCondition;
}
public void setMoneyReturn(double moneyReturn) {
this.moneyReturn = moneyReturn;
}
public double getMoneyCondition() {
return moneyCondition;
}
public double getMoneyReturn() {
return moneyReturn;
}
public CashReturn(String moneyCondition,String moneyReturn) {
// TODO Auto-generated constructor stub
this.moneyCondition=Double.valueOf(moneyCondition).doubleValue();
this.moneyReturn=Double.valueOf(moneyReturn).doubleValue();
}
@Override
public double acceptCash(double money) {
// TODO Auto-generated method stub
double result=money;
if(money>=moneyCondition)
result=money-Math.floor(money/moneyCondition)*moneyReturn;
return result;
}
}
 package com.lujie;
//正常收费子类
public class CashNormal implements CashSuper{
@Override
public double acceptCash(double money) {
// TODO Auto-generated method stub
return money;
}
}

3.Context,用一个ContreteStrategy来配置,维护一个对strategy对象的引用。

 package com.lujie;
//策略模式
public class CashContext {
private CashSuper cs;//声明一个CashSuper对象
public CashContext(String type) {//注意参数不是具体的收费策略对象,
//而是一个字符串,表示收费类型
//初始化时,传入具体的策略对象
switch (type) {
case "正常收费":
CashNormal cs0=new CashNormal();//根据具体的策略对象,调用器算法的方法
cs=cs0;
break;
case "满300返100":
CashReturn cs1=new CashReturn("300","100");
cs=cs1;
break;
case "打8折":
CashRebate cs2=new CashRebate("0.8");
cs=cs2;
break;
//将实例化具体策略的过程由客户端转移到Context类中,简单工厂的应用
}
}
public double getResult(double money) {
return cs.acceptCash(money);
}
}

4.测试用例:

 package com.lujie;

 public class testStrategyMethod {

     public static void main(String[] args) {
testStrategyMethod test=new testStrategyMethod();
test.getResult("正常收费");
test.getResult("满300返100");
test.getResult("打8折");
}
public void getResult(String type) {
double total=0.0d;
// TODO Auto-generated method stub
CashContext csSuper=new CashContext(type);
double totalPrices=0d;
totalPrices=csSuper.getResult(3000);
total=total+totalPrices;
System.out.println(type+"为:"+total);
} }

5.测试结果:

策略模式--Java篇的更多相关文章

  1. 策略模式-Java实现

    策略模式—Java实现 1. 现实需求 本人现在负责开发和维护考核督办系统,其中一个模块叫编写工作计划.是工作计划就要有时间,我们的各种提醒都做了,但是还是有人把x月的工作计划内容写到y月,真心无语了 ...

  2. 设计模式之第8章-策略模式(Java实现)

    设计模式之第8章-策略模式(Java实现) “年前大酬宾了啊,现在理发冲500送300,冲1000送500了.鱼哥赶紧充钱啊,理发这事基本一个月一回,挺实惠的啊.不过话说那个理发店的老板好傻啊,冲10 ...

  3. 策略模式—Java实现(转)

    1. 现实需求 客户有了新的需求,这时我们直接新增策略即可,改很少的代码.基本符合我们面向对象原则中的开闭原则(对扩展开放,对修改关系),实现了高内聚低耦合. 2. 策略模式定义 策略模式,又叫算法簇 ...

  4. StrategyPattern(策略模式)-----Java/.Net

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...

  5. 装饰者模式--Java篇

    装饰者模式(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰者模式比生成子类更为灵活. 1.定义接口,可以动态的给对象添加职责. package com.lujie; p ...

  6. 简单工厂模式-Java篇

    简单工厂模式就是考虑如何实例化对象的问题,就是说到底要实例化谁,将来会不会增加实例化对象,比如计算器类中增加开根元素,应该考虑用一个单独的类来创造实例的过程,这就是工厂.下面将利用计算器类举例,解释简 ...

  7. Strategy策略模式

    策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换.该模式可使得算法能独立于使用它的客户而变化.Strategy模式是行为模式,正因为他是一种行为模式,所以他不是用来解决类的实例化的 ...

  8. JDK设计模式之——策略模式(Comparable和Comparator接口)

    策略模式:其实就是java的多态...父类引用指向子类对象. 使用策略模式,改善排序算法上文中需要排序的是一个数组 让他可以对任何类型的数组进行排序 1.利用 接口 Comparable<T&g ...

  9. Java进阶篇设计模式之十一 ---- 策略模式和模板方法模式

    前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...

随机推荐

  1. SPOJ QTREE6 lct

    题目链接 岛娘出的题.还是比較easy的 #include <iostream> #include <fstream> #include <string> #inc ...

  2. Ubuntu16.04 下python2 | python3

    在终端分别输入python,python2,python3 python和python2默认都是python2 python3才是python3 Ubuntu下是默认没有pip的,需要自己手动安装 s ...

  3. ora-12541无监听的一种场景

    项目上突然出现无法连接Oracle数据库的情况,提示无监听程序. 现象: 查看 listener.ora配置无问题,用Net Configuration Assistant重建监听,NCA也处于假死状 ...

  4. 搭建集群后再namenode上查看进程发现除了三个基本进程还可能有别的进程,例如本来在子节点出现的进程出现在了主节点上

    搭建集群后再namenode上查看进程发现除了三个基本进程还可能有别的进程,例如本来在子节点出现的进程出现在了主节点上,namenode按正常来说是有三个进程的:namenode,resourcema ...

  5. 理解static关键字

    1.static 变量是类变量,通过类名引用. 2.static 方法不需要针对某个对象进行操作,其运行结果仅仅与输入的参数有关,调用时直接类名引用. 3.static 方法不能对非静态成员进行访问. ...

  6. uwsgi 所扮演的的角色是后端 http 服务器,nginx 扮演的角色是前端 http 服务器,hello.py 是客户端应用程序

    小结: 1.nginx传递每一个请求给绑定到3031端口并使用uwsgi协议的服务: http://www.jb51.net/article/76715.htm 在本文中,uwsgi 所扮演的的角色是 ...

  7. mongodb07---用户权限

    用户管理: 注意: 添加用户后,我们再次退出并登陆,发现依然可以直接读数据库? 原因: mongodb服务器启动时, 默认不是需要认证的. 要让用户生效, 需要启动服务器时,就指定 --auth 选项 ...

  8. Magic Grid ComboBox JQuery 版

    在MagicCombo组件中嵌入Grid,以支持分页查找和跨页选取 ​ 1. ​2. [代码][JavaScript]单选示例代码     <script type="text/jav ...

  9. 安装tensorflow的最简单方法(Ubuntu 16.04 && CentOS)

    先说点题外话:在用anaconda安装很多次tensorflow失败之后,我放弃了,如果你遇到这样的问题:Traceback (most recent call last)-如果不是因为pip版本,就 ...

  10. [Usaco2013 DEC] Vacation Planning

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4093 [算法] 对于k个枢纽 , 分别在正向图和反向图上跑dijkstra最短路 , ...