首页 > 代码库 > 《大话设计模式》——读后感 (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)商场促销?——策略模式