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

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

  • 相关阅读:
    Open Live Writer增加代码插件
    WinSCP列出’/’目录项出错
    Ueditor中增加迅雷下载支持
    Ueditor设置默认字体
    PDF编辑、删除、替换某页面或文字
    个人站长如何使用svn发布到服务器不遗漏文件
    PHP 测试程序运行时间 microtime函数用法
    LeetCode---Stack && Heap
    LeetCode---Binary Search
    LeetCode---Hash Table
  • 原文地址:https://www.cnblogs.com/chen1-kerr/p/7054974.html
Copyright © 2011-2022 走看看