《大话设计模式》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 ...
随机推荐
- js比较日期字串的大小
function checkTime() { var startTime = $('#startTime').val(); var endTime = $('#endTime').val(); if( ...
- RN控件之DrawerLayoutAndroid导航栏
/** * Sample React Native App * https://github.com/facebook/react-native */ 'use strict'; import Rea ...
- VCF文件处理工具PyVCF
vcf格式示例 ##fileformat=VCFv4.1 ##FILTER=<ID=LowQual,Description=”Low quality”> ##FORMAT=<ID=A ...
- 【vue2.X+iview2.x】iView在非 template/render 模式下标签的转化
iView在非 template/render 模式下标签的转化. 以下组件,在非 template/render 模式下组件名要分隔: DatePicker:date-picker FormItem ...
- 阶段2-新手上路\项目-移动物体监控系统\Sprint4-嵌入式web服务器开发\第3课-CGI程序开发
实现CGI程序显示一幅图片最核心的功能 把上一节课编写好的led.c程序拷贝过来,并重新命名为image.c 把led的某些部分删除,后如下 那么如何显示一幅图片呢,百度(搜索在html里面去插入图片 ...
- Spring入门第一课
今天先不讲Spring是什么. Spring网址:http://projects.spring.io/spring-framework/ Eclipse 安装开发IDE 在Eclipse Market ...
- Razor中的 内容标记块语法
在C#中,有两种方法来进行内容块标记 第一种方式 用@: 来标识 @if (true) { @: 测试内容标记块 @DateTime.Now.ToString() } <hr /> 第2种 ...
- c#桌面应用程序--窗体重复创建问题
重复创建窗体问题的引出 连续单击添加窗体按钮,通过普通的在按钮事件方法中创建窗体,显示窗体的后果是,我们会发现,相同的窗体会重复不断的弹出.代码如下: //添加窗口事件方法 private void ...
- 聊聊 CDN 缓存与浏览器缓存
CDN 是互联网上内容分发的重要一环.无论您之前是否了解过 CDN,其实它已经在您的日常生活中发挥作用了.比如您正在淘宝挑选心仪的商品,或者在观看一段令人捧腹的视频,以及您正在阅读的这篇文章,这些资源 ...
- python字符串和日期相互转换