Design Pattern Explained 读书笔记四——Strategy

What?

Define a family of algorithms, encapsulate each one, and

make them interchangeable. Strategy lets the algorithm

vary independently from the clients that use it. ——GOF

定义一系列算法,封装每一个,并且使每个封装是可相互替换的。Strategy模式,做到了 以独立于使用这些算法的客户端的方式 , 替换这一系列算法算法。自由替换每种算法,不受客户端束缚。

官网实例:

public class TaskController {
    public void process () {
        // this code is an emulation of a
        // processing task controller
        // . . .
        // figure out which country you are in
        CalcTax myTax;
        myTax= getTaxRulesForCountry();
        SalesOrder mySO= new SalesOrder();
        mySO.process(myTax);
    }
    private CalcTax getTaxRulesForCountry() {
        // In real life, get the tax rules based on
        // country you are in. You may have the
        // logic here or you may have it in a
        // configuration file
        // Here, just return a USTax so this
        // will compile.
        return new USTax();
    }
}
public class SalesOrder {
    public void process (CalcTax taxToUse) {
        long itemNumber= 0;
        double price= 0;
        // given the tax object to use
        // . . .
        // calculate tax
        double tax = taxToUse.taxAmount(itemNumber,price);
    }
}
public abstract class CalcTax {
    abstract public double taxAmount(long itemSold,double price);
}
public class CanTax extends CalcTax {
    public double taxAmount(long itemSold,double price) {
        // in real life, figure out tax according to
        // the rules in Canada and return it
        // here, return 0 so this will compile
        return 0.0;
    }
}
public class USTax extends CalcTax {
    public double taxAmount(long itemSold,double price) {
        // in real life, figure out tax according to
        // the rules in the US and return it
        // here, return 0 so this will compile
        return 0.0;
    }
}

The Strategy Pattern: Key Features (关键特点)

  • Intent(目的):

    允许你根据不同的环境(上下文情况),使用不同的业务逻辑或者算法。

    Allows you to use different business rules or algorithms depending

    upon the context in which they occur.

  • Problem(应用场景):

    如何选择合适、匹配的算法 取决于客户端的请求或逻辑的执行。假如,你的选择算法唯一,你并不需要Strategy模式。

    当分析到 要根据不同情况去选择不同业务方案,考虑下Strategy!

    The selection of an algorithm that needs to be applied depends upon

    the client making the request or the data being acted upon. If you

    simply have a rule in place that does not change, you do not need a

    Strategy pattern.

  • Solution(具体方案):

    将算法的选择与算法的实现分离开来。允许根据上下文去对算法做选择。

    Separates the selection of algorithm from the implementation of the

    algorithm. Allows for the selection to be made based upon context.

  • Participants and Collaborators:

    Strategy策略明确了 不同算法被使用的 方式。

    1.每个具体的 Stragety 类 实现了 每个具体的算法(或业务逻辑)。

    2.上下文Context根据 一个 Strategy类型的引用 来选择 具体的算法( Stragety).也就是说对算法的选择,是Context和Stragety类型的交互结果。

    3.Context将来自Clinet的请求转给 Stragety.

    The strategy specifies how the different algorithms are used.

    ? The concreteStrategies implement these different algorithms.

    ? The Context uses the specific ConcreteStrategy with a reference of

    type Strategy. The strategy and Context interact to implement the

    chosen algorithm (sometimes the strategy must query the Context).

    ? The Context forwards requests from its Client to the Strategy.

  • Consequences(效果):

    1 .Strategy模式 定义了一系列 算法(业务逻辑)

    2 .消除 switch、if else 等语句。

    3 . 用同一种方式调用所有算法(因为有多态)。算法实现类与Context上下文的交互 也许需要Context调用额外的 Context.getState() 。

    4.每个Stragety实现都是一个独立的类,简化了测试的难度。

    ? The Strategy pattern defines a family of algorithms.

    ? Switches and/or conditionals can be eliminated.

    ? You must invoke all algorithms in the same way (they must all have the same interface). The interaction between the ConcreteStrategies and the Context may require the addition of getstate type methods to the Context.

  • Implementation

    让使用算法的类(Context)包含一个抽象类(Strategy),该抽象类中

    有一个抽象方法指定如何调用算法。每个派生类按需要实现算法。

    注意:在原型Stragety模式中,选择所用具体实现类的职责由Client对象承担,并转给Strategy模式的Context对象。

Have the class that uses the algorithm (the Context) contain an

abstract class (the stragegy) that has an abstract method pecifying

how to call the algorithm. Each derived class implements the algorithm

as needed. Note: this method wouldn’t be abstract if you wanted to

have some default behavior. Note: In the prototypical Strategy

pattern, the responsibility for selecting the particular

implementation to use is done by the Client object and is given to the

context of the Strategy pattern.

  • Strategy与Context的耦合

    Strategy模式要求所封装的算法 必须处在 使用他们的类(Context)之外。也就是以为这 要么把Strategy需要的信息传给它(Strategy),要么以其他形式获得。

缺点:

不得不创建多个额外的类。但如果不考虑扩展算法的情况下,可以在抽象类 **Strategy中 用内部类包含所有算法。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-26 21:54:19

Design Pattern Explained 读书笔记四——Strategy的相关文章

Design Pattern Explain 读书笔记一 重新认识面向对象|规范使用UML

新视角看面向对象 与 UML图 什么是内聚性 closely the operations in a routine are related. 就是一个类中,各个方法之间的联系的紧密程度. 内聚就是一个模块内各个元素彼此结合的紧密程度,高内聚就是一个模块内各个元素彼此结合的紧密程度高. 所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则. 低内聚就是说一个类中各个方法直接没有关系,最极端的例子就是,这个类中的方法几乎与系统中所有的东西纠缠在一起. 高内聚

Design Pattern Explain 读书笔记三——Adapter

What? Convert the interface of a class into another interface that the clients expect. Adapter lets classes work together that could not otherwise because of incompatible inter- faces. --GOF 先来个例子: 比如我接到需求要开发一套图形系统,于是我设计 统一接口(为了多态性)Shape, Shape接口的行为是

Design Pattern Explain 读书笔记三——Facade

哎,刚写了一篇文章,保存草稿,关闭浏览器,再次登录发现文章没了!服了CSDN,一堆bug!已经不是第一次了!垃圾CSDN. 这篇文章就不详细写了,留个纪念! 版权声明:本文为博主原创文章,未经博主允许不得转载.

Design Pattern Explain 读书笔记二—— Facade 模式

what? Provide a unified interface to a set of interfaces in a sub- system. Facade defines a higher-level interface that makes the subsystem easier to use. --GOF 给子系统中的一堆接口提供一个统一,标准的接口--更高层次的接口--这样使得子系统更易于使用. Facade模式的特点: 对应的译文: 意图: 希望简化原有系统的使用方式.需要定义

Design Pattern Explain 读书笔记二——设计模式序言

设计模式的由来: 20 世纪 90 年代初,一些聪明的开发人员偶然接触到 Alexander(Christopher Alexander 的建筑师) 有关模式的工作.他们很想知道,在建筑学成立的理论,是否在软件设计中也适用. ● 软件中是否存在不断重复出现.可以以某种相同方式解决的问题? ● 是否可能用模式方法来设计软件,即先找出模式,然后根据这些模式 创建特定的解决方案? GoF 自己并没有创造书中的模式,认识到这一点很重要.相反,他们只是 将软件界已经存在的.反映了(针对各种具体问题的)优秀

R实战读书笔记四

第三章 图形入门 本章概要 1 创建和保存图形 2 定义符号.线.颜色和坐标轴 3 文本标注 4 掌控图形维数 5 多幅图合在一起 本章所介绍内容概括如下. 一图胜千字,人们从视觉层更易获取和理解信息. 图形工作 R具有非常强大的绘图功能,看下面代码. > attach(mtcars) > plot(wt, mpg) > abline(lm(mpg~wt)) > title("Regression of MPG on Weight") > detach(m

悟道—位IT高管20年的职场心经(读书笔记四)

悟道--一位IT高管20年的职场心经 第四章 人情练达即文章 "问世间情为何物,直教人生死相许" 那是说的爱情. 职场中的人情实在没那么浪漫, 很多时候是冷冰冰的, 但是你必须去面对, 以积极的.正面的心态去面对. 不但要面对,还要苦心经营. 1.1  谁都别惯着:下属不能惯 学会安排事情,分担事情. 1.2  谁都别惯着:老板不能惯 怎么样去和不同性格的老板交流,老板也有他自己的不足的地方,在这种情况下,最好是自己有自己的解决问题的方法. 1.3  谁都别惯着:客户不能惯 对客户,有

《高效能程序员的修炼》读书笔记四

第一章第三节:如何培养写作习惯 -------------------------------- 我个人一直坚信要成为一名优秀的程序员,其实和写代码是没有多大关系的(刚好本书作者也是这样的想法).当然,作为一名程序员的话,具有一定水平的技术能力还是需要的.但,个人觉得更重要的是良好地沟通技巧. 本书作者的合伙人Joel Spolsky有过这样一段话: 杰出的程序员跟勉强过得去的程序员之间的差别,不在于他们掌握了多少种编程语言,也不在于他们谁更擅长Python或Java.真正的关键是,他们能不能把

《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构

一.网站性能测试 (1)性能测试指标:①响应时间:②并发数:③吞吐量:④性能计数器: (2)性能测试方法:①性能测试:②负载测试:③压力测试:④稳定性测试: (3)性能优化策略: ①性能分析:检查请求处理各个环节的日志,分析哪个环节响应时间不合理,检查监控数据分析影响性能的因素: ②性能优化:Web前端优化,应用服务器优化,存储服务器优化: 二.Web前端性能优化 (1)浏览器访问优化: ①减少http请求:因为http是无状态的,每次请求的开销都比较昂贵(需要建立通信链路.进行数据传输,而服务