`

第二章 策略模式

 
阅读更多
面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。
收费对象生成工厂
策略模式strategy:它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的用户。
商场收银时如何促销,用打折还是返利,其实都是一些算法,用工厂来生成算法对象,这没有错,但是算法本身只是一种策略,最重要的是这些算法是随时都可能互相替换的,这就是变化点,二封装变化点是我们面向对象的一种很重要的思维方式。
策略模式解析
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。
另外一个策略模式的优点是简化了单元测试,以为每个算法都有自己的类,可以通过自己的接口单独测试。

策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。


public class Context {
private CashSuper cash;
// public Context(CashSuper cash) {
// this.cash = cash;
// }
//简单工厂模式改造后的构造函数
public Context(int type){
switch(type){
case 1:
cash = new CashNormal();
break;
case 2:
cash = new CashRebate(0.5);
break;
case 3:
cash = new CashReturn(200,50);
break;
}
}

// 上下文接口
public double ContextInterface(double money) {
return cash.acceptCash(money);
}
}


-------------------------------------------------------------------------------------------


策略模式是比较常用的一种模式.封装不算法。每一个算法封装在不同类中。然后根据客户端的需求。选择相应的算法。

策略模式主要角色:

环境角色:一般会持有策略类的父类引用。

抽象策略角色:提供策略类的共有行为和接口。

具体策略角色:每个策略包装一种算法和行为。

现在以人不同方式回家为例。。把每种回家方式封装成一个不同的算法,分别封装在不同的类中

//抽象回家方式接口。封装一个父类接口

public interface GoHomeStrategy{

//不同回家方式,不同算法行为

public void howGoHome();

}

//走路回家的策略方式。

public class WalkGoHomeStrategy implements GoHomeStrategy{

//回家的方式 走路

public void howGoHome(){

System.out.println("今天我要走路回家...想运动了!");

}

}

//骑自行车回家的方式 不同算法。

public class BikeGoHomeStrategy implements GoHomeStrategy{

//骑车回家的方法。不同算法的方法

public void howGoHome(){

System.out.println("腿有点酸。我要骑车回家!");

}

}

//环境角色。可以选择不同的算法。根据客户端需求 来选择相应的算法。

public class GoHomeContext{

//策略的引用对象变量

private GoHomeStrategy goHome;

private static GoHomeContext instance = new GoHomeContext();

private GoHomeContext(){}

public staticGoHomeContext getInstance(){

return instance;

}

public void operation(int i ){

//根据参数判断来选择相应的策略

if(i==0){

goHome = new WalkGoHomeStrategy ();

}else {

goHome = new BikeGoHomeStrategy ();

}

goHome.howGoHome();

}

}

//客户端调用

public class Client{

public static void main(String args[]){

GoHomeContext context = GoHomeContext.getInstance();

//选择走路回家发方式

context.operation(0);

//选择骑车走路的方式

context.operation(1);

}

}

//打印结果

今天我要走路回家...想运动了!";

腿有点酸。我要骑车回家!";

客户端根据不同的参数,选择不同的算法回家

策略模式关注的是算法的变化。而不关注领域实体的变化。变化的因素是算法行为的变化。

可以任意动态的添加和删除算法类。符合开闭原则。

优点:

1,策略模式,提供管理算法簇的方法。恰当使用继承,可以把公共的代码移到父类中去。避免代码的重复。

2,使用策略类,避免多重条件的转移语句,使代码看起来更优雅。耦合性降低。

缺点:

1,客户端必须清楚,知道所有的策略类。

2,策略模式会造成很多策略类。有时会使代码臃肿和数量庞大。

策略模式的的核心:

行为的单一变化,每个行为都封装在不同的类中。


分享到:
评论

相关推荐

    第二章计算机辅助教学的模式和策略.pptx

    第二章计算机辅助教学的模式和策略.pptx

    php设计模式介绍

    《PHP设计模式介绍》第二章 值对象模式 《PHP设计模式介绍》第三章 工厂模式 《PHP设计模式介绍》第四章 单条模式 《PHP设计模式介绍》第五章 注册模式 《PHP设计模式介绍》第六章 伪对象模式 《PHP设计模式...

    C#设计模式 C# Design Patterns:A Tutorial

    目录 ······ 第一部分 C#面向对象程序设计 第1章 设计模式概述 第2章 C#语言的语法 第3章 用C#编写Windows程序 第4章 在C#中使用类和对象 ...第29章 策略模式 第30章 模板方法模式 第31章 访问者模式 参考文献

    Delphi模式编程第二分卷

    第24章 策略模式(Strategy) 24.1 模式解说 24.2 结构与用法 24.2.1 模式结构 24.2.2 代码模板 24.2.3 问题讨论 24.3 范例与实践 24.3.1 策略模式在酒店管理系统中的应用 24.3.2 范例小结 第25章...

    java设计模式

    第二部分 我惹了谁——真刀实枪篇 第7章 单例模式 7.1 我是皇帝我独苗 7.2 单例模式的定义 7.3 单例模式的应用 7.4 单例模式的扩展 7.5 最佳实践 第8章 工厂方法模式 8.1 女娲造人的故事 8.2 工厂方法模式的定义 8.3...

    Delphi模式编程第一分卷

    第二部分 创建型模式编程 第4章 工厂方法模式(Factory Method) 4.1 模式解说 4.2 结构和用法 4.2.1 模式结构 4.2.2 代码模板 4.2.3 问题讨论 4.3 范例与实践 4.3.1 利用工厂方法模式设计可动态切换持久层...

    设计模式解析-英文

     第1章 面向对象范型 2 第2章 UML 21 第二部分 传统面向对象设计的局限 第3章 对代码灵活性要求很高的问题 33 第4章 标准的面向对象解决方案 41 第三部分 设计模式 第5章 设计模式简介 53 第6章 Facade模式 65 第7...

    戏说面向对象程序设计

    第二章代码规范、重构 第三章复制 VS复用 第四章业务的封装 第五章体会简单工厂模式的美妙 第六章工厂不好用了? 第七章用“策略模式”是一种好策略 第八章反射——程序员的快乐! 第九章会修电脑不会修收音机?——...

    Ruby设计模式(中文版+英文版).pdf

    第二部分ruby中的模式  第3章使用模板方法变换算法  第4章使用策略替换算法  第5章通过观察器保持协调  第6章使用组合模式将各部分组成整体  第7章通过迭代器遍历集合  第8章使用命令模式完成任务

    php程序设计模式chm文档

    第二章 值对象模式(The Value Object Pattern) 第三章 工厂模式(The Factory Pattern) 第四章 单件模式 第五章 注册模式 第六章 伪对象模式 第七章 策略模式 ·· ··· ··· 有兴趣的自已下载看一看吧,比较...

    高级软件架构设计实践笔记

    第二章 架构对新产品的作用 第三章 架构师职责 第四章 项目经理与构架师的分工与协作 第五章 架构设计为开发人员解决什么问题 第六章 开发过程 第七章 软件的质量属性 第八章 架构设计的准入条件 第九章 需求层次 ...

    设计模式--可复用面向对象软件的基础

    第二章 实例研究:设计一个文档编辑器 2.1 设计问题 2.2 文档结构 2.3 格式化 2.4 修饰用户界面 2.5 支持多种视感标准 2.6 支持多种窗口系统 2.7 用户操作 2.8 拼写检查和断字处理 2.9 小结 第三章 创建型模式 3.1 ...

    Juniper防火墙技术资料 基本原理+管理+高可用性

    第二章:路由表和静态路由 第三章:区段 第四章:接口 第五章:接口模式 第六章:为策略构建块 第七章:策略 第八章:地址转换 第十一章:系统参数 管理 Juniper防火墙初始化配置和操纵 查看系统概要信息 主菜单...

    精通python设计模式与源码

    本书用实际生活中的例子带你了解...第二部分介绍处理一个系统中不同实体(类、对象等)之间关系的设计模式,包括外观模式、享元模式等;第三部分介绍处理系统实体之间通信的设计模式,包括责任链模式、观察者模式等。

    OBJECTIVE-C编程之道 IOS设计模式解析电子书+源代码

    策略19.1 何为策略模式19.2 何时使用策略模式19.3 在UITextField中应用验证策略19.4 总结第20章 命令20.1 何为命令模式20.2 何时使用命令模式20.3 在Cocoa Touch框架中使用命令模式20.3.1 NSInvocation对象20.3.2 ...

    基于自营配送模式的车辆路径规划设计与实现-kaic.docx

    第二章 自营物流配送模式相关理论 2.1自营配送存在的问题 2.2车辆路径问题相关理论 2.3车辆路径问题现代启发式算法介绍 2.3.1禁忌搜索算法 2.3.2遗传算法 第三章 数学模型的建立 3.1问题描述与模型建立 3.1.1问题...

    Delphi 深度探索(第二版)〖含随书光盘源代码〗

    6.3.1 策略模式(strategy模式) 6.3.2 模板模式(template method模式) 6.3.3 责任链模式(chain of responsibility模式) 6.3.4 观察者模式(observer模式) 6.3.5 命令模式(command模式) 6.3.6 备忘录...

    juniper防火墙实用手册.zip

    1.1.2第二章:路由表和静态路由 1.1.3第三章:区段 1.1.4第四章:接口 1.1.5第五章:接口模式 1.1.6第六章:为策略构建块 1.1.7第七章:策略 1.1.8第八章:地址转换 1.1.9第十一章:系统参数 1.2第三卷:管理 1.2.1...

Global site tag (gtag.js) - Google Analytics