《大话设计模式》——读后感 (2)商场促销?——策略模式

 按照我的习惯,先看策略模式UML结构图:

从图中,我看到了Strategy类,还有具体的实现类,还有一个Context,感觉和简单工厂好像啊,只是名字不一样而已。此处,我还用接口.

什么是策略模式呢?

实现:

原文是针对商场促销进行各种各样的打折进行设计案例的,而大话设计模式中还提到:

等等,打折、返现等等一系列促销具体方式只是一些算法,而算法本身也是一种策略。那我在此就要偷懒了:

Operation接口,OperationAdd、OperationDelete、OperationDIv、OperationMulti我也理解成和打折具体实现类的一种算法,那么代码基本一致。

接口:

package com.sjmx.slpFactory;

public interface Operation {
    public double getResult(double a,double b);
}

加法:

package com.sjmx.slpFactory;

public class OperationAdd implements Operation {

    @Override
    public double getResult(double a, double b) {
        return a+b;
    }

}

减法:

package com.sjmx.slpFactory;

public class OperationDelete implements Operation {

    @Override
    public double getResult(double a, double b) {
        return a-b;
    }

}

其他的省略不写了,此处不影响演示策略模式效果:

上下问类:

package com.sjmx.strategy;

import com.sjmx.slpFactory.Operation;
import com.sjmx.slpFactory.OperationAdd;
import com.sjmx.slpFactory.OperationDelete;
import com.sjmx.slpFactory.OperationDiv;
import com.sjmx.slpFactory.OperationMulti;

public class Context {

    Operation o ;

    //优化版的策略模式
    public Operation getInstance(String type){
        switch(type){
            case "+":
                o = new OperationAdd();
                break;
            case "-":
                o = new OperationDelete();
                break;
            case "*":
                o = new OperationMulti();
                break;
            case "/":
                o = new OperationDiv();
                break;
            default:
                o = null;
        }
        return o;
    }

    public double getResult(double a, double b){
        return o.getResult(a, b);
    }
}

客户端:

package com.sjmx.strategy;

import com.sjmx.slpFactory.Factory;
import com.sjmx.slpFactory.Operation;

public class Client {

    public static void main(String[] args) {

        double result;
        Operation oper;

        oper= Factory.getInstance("+");
        result = oper.getResult(3, 9);
        System.out.println(result);
        System.out.println("---------------");

        oper = Factory.getInstance("-");
        result = oper.getResult(3, 9);
        System.out.println(result);
        System.out.println("---------------");

        oper = Factory.getInstance("*");
        result = oper.getResult(3, 9);
        System.out.println(result);
        System.out.println("---------------");

        oper = Factory.getInstance("/");
        result = oper.getResult(9, 0);
        System.out.println(result);

    }
}

运行效果:

回过头来再次分析一下策略模式:

策略模式应用场景:

1、加、减、乘、除在简单工厂中,是具体的算法;而在策略模式中,它们理解成具体的策略而已,这一点,只是表达不同而已。

2、虽然策略模式和简单工厂模式的例子都是运算,但这两种模式绝对不是一回事。

3、策略模式侧重策略的变化,比如商场打折:我们可以打8折、7折、6折....., 还有返现,比如满100返10,满110返12...等等,这些具体的策略还是会变化的;    而简单工厂的运算侧重固定,比如加法运算,我给你1+1,结果是2,接下来再给你1+2,结果肯定是3,不会出现1+1=2,而1+2=5了。概括一句话就是简单工厂中的算法类被策略模式中的策略包含了(具体策略可以和算法一样不变,也可以变)

4、简单工厂主要是解决众多具体算法的创建问题,而策略模式主要体现在变化上,它将具体使用什么策略交给客户端去判断,而自己本身利用多态的关系,只需要去执行固定的方法就可以了,你给我什么策略,我就执行这个策略的****()方法

反思:策略模式使用到了封装、继承、多态了吗?答案是肯定的

时间: 2024-08-19 07:20:09

《大话设计模式》——读后感 (2)商场促销?——策略模式的相关文章

大话设计模式第二章---商场促销简单工厂模式、策略模式 PHP实现及对比

简单工厂模式: <?php abstract class Cash_super { abstract public function accept_cash(float $money); } class Cash_normal extends Cash_super { public function accept_cash(float $money) { return $money; } } class Cash_rebate extends Cash_super { private $_mon

第 2 章 商场促销——策略模式

背景:做一个商场收银软件 收费情形:正常收费.打八折.打七折.打五折 策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合. 策略模式的Strategy类参差为Context定义了一系列的可供重用的算法或行为.继承又助于析取出这些算法中的公共功能. 策略模式的优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的借口单独测试. 当不同的行为堆砌在一个类中时,就很难避免使用条

商场促销——策略模式

策略模式(Strategy):它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. “面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类”.打一折和打九折只是形式的不同,抽象分析出来,所有的打折算法都是一样的,所以打折算法应该是一类. Strategy类,定义所有支持的算法的公共接口. //抽象算法类 abstract class Strategy{ //算法方法 public ab

《大话设计模式》c++实现 之策略模式

一.UML图   二.概念 策略模式:他定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户.   三.优点 (1)策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,他可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合. (2)策略模式的Strategy类曾是为Context定义了一些列的可供重用的算法或行为.集成有助于析取出这些算法中的公共功能. (3)策略模式简化了单元测试,因为

大话设计模式java版本 第二章 策略模式

package strategy; //嵌入策略 public class CashContext { private Cash cs; public CashContext(Cash cs) { super(); this.cs = cs; } public double getResult(double money){ return cs.acceptCash(money); } } package strategy; public interface Cash { public abstr

设计模式总结篇系列:策略模式(Strategy)

前面的博文中分别介绍了Java设计模式中的创建型模式和结构型模式.从本文开始,将分别介绍设计模式中的第三大类,行为型模式.首先我们了解下分为此三大类的依据. 创建型模式:主要侧重于对象的创建过程: 结构型模式:主要侧重于处理类或对象的组合: 行为型模式:主要侧重于类或对象之间的交互以及职责分配. 首先了解下策略模式的概念:定义了多个算法,并将它们封装起来(一般的是每个算法封装成一个单独的类),让算法独立于客户端而可以单独变化. 具体可以看一下下面的例子(以计算加.减.乘为例): 1. 对加.减.

设计模式 ( 十九 ):Strategy策略模式 -- 行为型

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查找.排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法:当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择.这

设计模式之第8章-策略模式(Java实现)

设计模式之第8章-策略模式(Java实现) “年前大酬宾了啊,现在理发冲500送300,冲1000送500了.鱼哥赶紧充钱啊,理发这事基本一个月一回,挺实惠的啊.不过话说那个理发店的老板好傻啊,冲1000才送500,不如冲两次500,这样可以送600呢.”“这只能说明你不是很笨,但是也算不上聪明.”“啊?难道我想错了?”“这是一种策略,策略,懂?他如果是冲1000送700的话你是不是很大的可能性冲500?而不是1000,但是如果这样的话,在“聪明人”,对,没错,就是你这样的人来说,冲两次500表

大话设计模式读书笔记1——简单工厂模式

最近几日,重温了一下<大话设计模式>这本书,当时读的仓促,有很多没有注意的地方,现在仔细翻看起来,发现这值得细细品味的一本书!! 好东西就要记下来!!! 第一章笔记:从一个简单的计算器程序来看简单工厂模式. 变化的地方就要封装,用一个单独的类来做创造实例的过程这就是工厂. UML图: /// <summary> /// 运算类 /// </summary> public class Operation { public double Number1 { get; set

设计模式(一)学习----策略模式

策略设计模式:定义一组算法,将每个算法都分装起来,并使他们之间可以互换. 策略模式就是使用的面向对象思想中的继承和多态的机制 策略模式的通用类图: Context类:Strategy类,并且和Strategy类是整体和个体的关系,即聚合关系.对策略角色个体进行封装. Strategy接口:定义这个策略或算法必须有的方法和属性. ConcreteStrategy1,ConcreteStrategy2具体策略角色实现类.实现抽象策略中的方法,该类中含有具体的算法. 上图变成Java代码: 抽象的策略