首页 > 代码库 > 《大话设计模式》——读后感 (2)商场促销?——策略模式

《大话设计模式》——读后感 (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、简单工厂主要是解决众多具体算法的创建问题,而策略模式主要体现在变化上,它将具体使用什么策略交给客户端去判断,而自己本身利用多态的关系,只需要去执行固定的方法就可以了,你给我什么策略,我就执行这个策略的****()方法

 

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

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