策略模式
来源:互联网 发布:汉诺塔算法 编辑:程序博客网 时间:2024/06/16 00:36
1.策略模式:定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。
2.策略模式结构图
这些算法随时都可能相互替换(变化点),封装变化点是我们面向对象的一种很重要的思维方式。
3.策略模式是一种定义一系列运算的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
4.策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。
4.商城收银系统
(1)具有三种优惠:打折,满返现,满积分返
(2)策略模式
//策略:抽象算法类 定义所有支持的算法的公共接口//付款方式的超类public abstract class CashSuper { public abstract double acceptCash(double money);}//策略:具体算法Apublic class CashNormal extends CashSuper{ @Override public double acceptCash(double money) { return money; }}//具体算法B//打折优惠public class CashRebate extends CashSuper{ private double moneyRebate = 1.0d; public CashRebate(double moneyRebate){ this.moneyRebate = moneyRebate ; } @Override public double acceptCash(double money) { return money*moneyRebate; }}//具体算法C//满300减100public class CashReturn extends CashSuper{ @Override public double acceptCash(double money) { //。。。省略。。。。。。。。。。 return 0; }}
public class CashContext { private CashSuper cs ; //通过构造方法,传入具体的收费策略 public CashContext(CashSuper cashSuper){ this.cs = cashSuper ; } //根据收费策略不同,获得计算结果 public double getResult(double money){ return cs.acceptCash(money); }}//策略模式//客户端代码public class MainTest { public static void main(String[] args) { CashContext c = null; String str = ""; // 选择 switch (str) { case "正常收费": c = new CashContext(new CashNormal()); break; case "满300返100": c = new CashContext(new CashReturn()); break; case "打8折": c = new CashContext(new CashRebate(0.4)); break; default: break; } c.getResult(100); }}
(3)将判断逻辑从客户端抽离,与工厂模式结合
//将判断代码从客户端移出//策略与简单工厂结合public class CashContext1 { CashSuper cs = null ; //参数不是具体的收费策略对象,而是一个对象,而是一个字符串,表示收费类型 public CashContext1(String type){ switch (type) { case "正常收费": CashNormal cs0 = new CashNormal(); cs = cs0; break; case "满300返100": CashReturn cr1 = new CashReturn(); cs = cr1 ; break; case "打8折": CashRebate cr2 = new CashRebate(0.9); cs = cr2; break; } } public double getResult(double money){ return cs.acceptCash(money); }}
public class MainTest2 { public static void main(String[] args) { CashContext1 csuper = new CashContext1("打8折"); csuper.getResult(100); }}
5.
(1)策略模式的strategy类层次为context定义了一系列的可供重用的算法或行为,而且简化了单元测试,因为每个算法都有自己的类
阅读全文
0 0
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- java.lang.IllegalArgumentException: findUserById is ambiguous in Mapped Statements collection
- 结构化程序设计方法
- redis笔记
- Json简介及fastJson使用
- 【数据结构】内部排序算法
- 策略模式
- Android 广播详解
- 【Day02】Aop注解和Aspectj注解+JdbcTemplate
- 【运维】——服务器装Linux系统
- vb.net 教程 8-2 简单的SQL语言3
- 2048小游戏
- DxO PhotoLab(raw图片处理软件)官方正式版V1.0.2.2600下载 | DxO PhotoLab破解版
- Count Binary Substrings(leetcode)
- RESTful 用户创建请求、SpringMvc的Valid注解(三)