关键词:
按照我的习惯,先看策略模式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、简单工厂主要是解决众多具体算法的创建问题,而策略模式主要体现在变化上,它将具体使用什么策略交给客户端去判断,而自己本身利用多态的关系,只需要去执行固定的方法就可以了,你给我什么策略,我就执行这个策略的****()方法
反思:策略模式使用到了封装、继承、多态了吗?答案是肯定的
大话设计模式之策略模式(代码片段)
背景:商场促销期间,可能会出现8折、5折的促销活动,也可能出现满100减10、满200减30的促销活动,设计一个收银系统。策略模式:定义了算法家族,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。... 查看详情
策略模式
...一个模式的应用场景。比方这次学习的策略模式。在大话设计模式中举了一个商场促销几种方案的样例,假设以简单工厂模式切入写出的程序和策略模式答题不差。我在用简单工厂模式构想这个商场打折的问题时候相到的方法和... 查看详情
《大话设计模式》——读后感(11)简历复印?——原型模式
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新对象[DP] 说白了,原型模式还是属于创建型模式,主要功能还是创建新对象。下面我自己写一个原型模式试试:案例1:自己写原型接口(Prototy):pac... 查看详情
《大话设计模式》——读后感为别人做嫁衣?——静态代理模式
什么是代理模式: 代理模式结构图: 直接上代码:GiveGift接口:packagecom.sjmx.staticProxy;publicinterfaceGiveGift{voidgiveDolls();voidgiveFlows();voidgiveChocolate();}真实实体:packagecom.sjmx.staticProxy;publi 查看详情
《大话设计模式》读后感
转载:http://blog.csdn.net/u013798619 第一次读《大话设计模式》,是在刚接触C#的时候。疲累于大部头的官方教材中时,无意间翻开了这本生动有趣的书,甚是眼前一亮。由于当时C#基础薄弱,只是把它当小说来看,如饥似渴,饶... 查看详情
《大话设计模式》——读后感雷锋依然在人间?——工厂方法模式
什么是工厂方法模式:工厂方法UML结构图:从图中我获取以下信息:1、Product是个接口,而Creator是个抽象类(我还是试试接口)2、ConcreateProduct和ConcreteCreator是有依赖关系的,后者依赖前者 接下来看看简单工厂模式中例子用... 查看详情
《大话设计模式》——读后感(10)无尽加班何时休?——状态模式
原文定义: 状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变其类【DP】 UML结构图: 背景: 看到此模式,酝酿了好久才决定对状态模式进行总结。光看原文定义,实在... 查看详情
《大话设计模式》——读后感代码无错就是优?——简单工厂模式
本篇是我学习设计模式后的第一篇文章,由于本模式也比较简单,在此我就多啰嗦一下。学习本模式之前请下看一下我的《大话设计模式铺垫》文章,然后回答思考如下问题:1、UML类图看懂了吗?2、java的3大特性真的懂了吗?... 查看详情
大话设计模式之工厂方法模式读后感(代码片段)
引言:让我们重温经典,致敬经典工厂方法模式:定义一个用于创建对象的接口,让子类来决定实例化哪一个类,工厂方法使一个类的实例化延迟到了子类。UML图:1packagecom.dzf.designtest;23/**4*<desc>5*工厂方法:定义一个创建对... 查看详情
设计模式——策略模式
声明:以下内容来源于《大话设计模式》,学习。策略模式:定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。商场收费策略:正常收费、打折收费、返利收费。类... 查看详情
<二>读<<大话设计模式>>之策略模式
...不错,好好加油。 <<大话设计模式>>解说策略模式是以商场收银软件程序开头的,那么问题来了。哪家商场收银软件强,开玩笑了。读过上篇文章《《简单工厂模式》》的知道,它有两个缺点... 查看详情
《大话设计模式》——读后感牛市股票还会亏钱?——外观模式
原文中对外观模式的定义为: 外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子类系统更加的容易使用【DP】. 从定义理解:1、外观模式是为子... 查看详情
行为型模式《大话设计模式》——读后感(15)烤羊肉串引来的思考?——命令模式
命令模式:将一个请求封装为一个对象,从而使得你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作【DP】 先看代码吧:Receiver:packagecom.sjmx.command;publicclassReceiver{publicvoiddoSomething(){Syste... 查看详情
《大话设计模式》——读后感老板回来了,我不知道?——观察者模式之事件委托
什么都不说,直接上代码,自己去理解,要结合动态代理看Event:packagecom.sjmx.observer.application;importjava.lang.reflect.Method;publicclassEvent{privateObjectobject;privateStringmethodName;privateObject[]params;privateClass[]par 查看详情
《大话设计模式》——读后感老板回来了,我不知道?——观察者模式之理论实例
单独看UML类图,有没有发现观察者类图和工厂方法模式的类图和相似?不过代码实现可不一样哦抽象观察者:packagecom.sjmx.observer.theory;publicinterfaceWatcher{publicvoidupdate(Stringstr);}具体观察者:packagecom.sjmx.observer.theory;publicclassConcreteWat... 查看详情
结构型模式《大话设计模式》——读后感(13)手机软件何时能统一?——桥接模式
桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变换【DP】 概述:在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来... 查看详情
行为型模式《大话设计模式》——读后感(16)加薪非要老板批?——职责链模式
职责链模式(ChainofResponsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 适用场景:1、有多个的... 查看详情
结构型模式《大话设计模式》——读后感(12)在nba我需要翻译?——适配器模式
适配器模式:将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以在一起工作了[DP]UML类图: 简单模拟一下代码://已存在的、具有特殊功能、但不符合我们既... 查看详情