《大话设计模式》num02---策略模式
2018年01月22日 22:04:57 独行侠的守望 阅读数:72更多
个人分类: 设计模式
编辑
版权声明:本文为博主原创文章,转载请注明文章链接。 https://blog.csdn.net/xiaoanzi123/article/details/79133768
今天继续设计模式的回顾:第二篇策略模式:
只听名字总没有什么头绪,什么策略?
情景: 超市活动,有满减,有打折,有正常收费,求 不同情况下的付款额。
①创建 付款基类抽象类,有一个抽象方法apply用于计算活动后实际付款额
//付款 基类
public abstract class CashSuper {
//计算付款额
public abstract double apply(double money);
}
② 创建正常付费、打折付费、满减付费 三种付费方式类,分别继承付费基类。各自重写自己的apply方法。
// 满A返现(B) 方式
public class CashReturn extends CashSuper {
private double A;
private double B;
public CashReturn(String a, String b) {
super();
A = Double.valueOf(a.toString());
B = Double.valueOf(b.toString());
}
@Override
public double apply(double money) {
if(money >= A){
return money - B;
}else{
return money;
}
}
}
package num02_策略模式;
// 打折方式 付费
public class CashRebate extends CashSuper {
private double zhekou;// 打几折
public CashRebate(String zhekou){
this.zhekou = Double.valueOf(zhekou.toString());
}
@Override
public double apply(double money) {
return money * zhekou;
}
}
package num02_策略模式;
//正常付费无活动 付款方式类
public class CashNormal extends CashSuper{
@Override
public double apply(double money) {
return money;
}
}
③创建付费工厂类,用于根据不同的情景创建不同付款方式的 具体类对象
package num02_策略模式;
//付款 工厂类,用于创建 不同付款方式 具体类对象
public class Context {
CashSuper cs;
//返现方式
public Context(String high,String low){
cs = new CashReturn(high,low);
}
public Context(String type) {
switch(type){
case "normal":
cs = new CashNormal();
break;
case "0.8": //这里直接写死,用于说明折扣问题即可。
cs = new CashRebate("0.8");
break;
}
}
//用于接受活动前初始金额,调用apply方法计算实际付款额
public double getResult(double money){
return cs.apply(money);
}
}
④ main方法测试:
package num02_策略模式;
public class Main {
public static void main(String[] args) {
Context context = new Context("normal");
double result = context.getResult(200);
System.out.println(result); // 正常付款 200.0
context = new Context("0.8");
double result2 = context.getResult(200);
System.out.println(result2); // 折扣付款 160.0
context = new Context("500","50"); //满500减50
double result3 = context.getResult(600);
System.out.println(result3); // 满减付款 550.0
double result4 = context.getResult(300);
System.out.println(result4); // 满减付款 300.0
}
}
策略模式:定义 了算法家族,分别封装起来,让他们之间可以互相替换。从而使算法的变化不会影响到使用算法的用户。算法本身只是一种策略,他是随时会变化的,比如超时又搞一个加多少元减多少元的活动,这是变化点。
就例子而言:不管打折还是返利,都是具体的付费算法。他们继承于抽象算法类CashSuper。在工厂类中有一个对CashSuper的引用,

利用多态在工厂类中创建具体付费方式对象。由于实例化不同的策略,所以最终在调用context.getResult时就会调用不同付费类的apply方法。
如果只用简单工厂模式,客户端需要认识CashSuper和Context两个类,现在采用策略模式结合简单工厂模式,只需要让客户端认识一个Context类即可,耦合度更加降低了【策略模式减少了 定义算法类 与 使用算法类 之间的耦合】。
ps:面向对象编程并不是类越多越好,类的划分是为了封装,但是分类的基础是抽象,具有相同属性和功能的对象的抽象集合 才是 类。
《大话设计模式》num02---策略模式的更多相关文章
- 大话设计模式之策略模式(strategy)
策略模式:它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响使用算法的用户. 针对商城收银模式,打折,返现促销等的例子: 打折还是促销其实都是一些算法,可以用工厂模式来 ...
- JavaScript设计模式之策略模式(学习笔记)
在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选 ...
- [design-patterns]设计模式之一策略模式
设计模式 从今天开始开启设计模式专栏,我会系统的分析和总结每一个设计模式以及应用场景.那么首先,什么是设计模式呢,作为一个软件开发人员,程序人人都会写,但是写出一款逻辑清晰,扩展性强,可维护的程序就不 ...
- 设计模式:策略模式(Strategy)
定 义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...
- PHP设计模式之策略模式
前提: 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查 找.排序等,一种常用的方法是硬编码(Hard Cod ...
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...
- JavaScript设计模式之策略模式
所谓"条条道路通罗马",在现实中,为达到某种目的往往不是只有一种方法.比如挣钱养家:可以做点小生意,可以打分工,甚至还可以是偷.抢.赌等等各种手段.在程序语言设计中,也会遇到这种类 ...
- 【设计模式】【应用】使用模板方法设计模式、策略模式 处理DAO中的增删改查
原文:使用模板方法设计模式.策略模式 处理DAO中的增删改查 关于模板模式和策略模式参考前面的文章. 分析 在dao中,我们经常要做增删改查操作,如果每个对每个业务对象的操作都写一遍,代码量非常庞大. ...
- 大话设计模式之模板模式 C#
学无止境,精益求精 十年河东,十年河西,莫欺少年穷 今天一起探讨模板模式,如下: 一.概念 上一篇文章讲了大话设计模式:原型模式,原型模式主要是通过Clone()方法<深浅复制>,创建新的 ...
- 设计模式入门,策略模式,c++代码实现
// test01.cpp : Defines the entry point for the console application.////第一章,设计模式入门,策略模式#include &quo ...
随机推荐
- linux命令-gzip压缩
把很大的目录/文件压缩成更小的文件,传输节省带宽,从服务端到客户端下载过程节省时间,减少带宽,节省使用率.使用cpu的资源. 压缩命令gzip [root@wangshaojun ~]# ls111. ...
- shell入门-awk-1
awk对于sed grep的优势在于分段,把分隔符分割成一小段一小段,针对段进行匹配,替换,操作,逻辑判断,比较...等 awk的基本操作 [root@wangshaojun ~]# awk -F ' ...
- MS-SQL循环、随机数
---创建视图 create view myview as select re=rand() --自定义函数:取得指定范围的随机数 create function mydata( @a int, @b ...
- maven spring3.2.5
出现的情形: 开发环境: spring3.2.5 + springmvc +spirngDATA +maven 一. 偶然的spring Junit4测试 加载applicationContext.x ...
- C++之queue模板类
1.queue常用成员函数 ①size() 返回队列中元素的个数 ②empty() 如果队列空则返回真 ③back() 返回最后一个元素引用即队尾. ④front() 返回第一个元素引用即队首. ⑤ ...
- 业务逻辑:完成基于CRM地址完全匹配的自动分单业务逻辑
思路: 后台系统的业务接口服务处理接收到的数据并使用Webservice技术来远程调用CRM系统的业务接口服务来进行定区的查询操作,随后从该定区中匹配一个快递员来分配工单并发送短信通知取件 操作步骤: ...
- Umbraco遇到的问题解决
在本地VS2015运行公司的Corporate website时,有几个页面出现错误如下: 但事实是那个,这几个View都是存在的.弄了半天也没有能够解决.后来看到这个blog: https://ou ...
- java笔记--关于线程同步(5种同步方式)
转自:http://www.2cto.com/kf/201408/324061.html 为何要使用同步? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改 ...
- 第一章 –– Java基础语法
第一章 –– Java基础语法 span::selection, .CodeMirror-line > span > span::selection { background: #d7d4 ...
- Python:列表也能拆包?
前几天,微信学习群里有个小伙伴在看书时遇到了这样一个问题,在群里提问,看下图: 这是常用的 matplotlib 库,只是一般我们调用 plot 方法绘图时,不会去关心它的返回值.然而 plt1, = ...