策略模式

【35】考虑virtual方法以外的其他选择

你说的曾经没有我的故事 提交于 2019-11-27 01:21:35
1、使用Non-Virtual Interface 实现方法模版   将虚方法声明为private,子类重写private的虚方法,在父类中通过public方法调用虚方法。NVI的优点是:可以在虚方法之前和之后做一些事情。 2、使用方法指针实现策略模式   在类中关联一个方法指针,方法指针的形参是类对象的引用。实例化一个对象的时候,把一个方法传递给对象,这就意味着每个对象都有一个方法。这种方式提供了一些有趣的弹性:a、同一类型的不同对象可以有不同的计算方法;b、在运行期可以更改对象的计算方法。这种方式的缺点是:计算方法不能访问protected成员,要解决这个问题,只能弱化类的封装。 3、使用tr1::function 实现策略模式   可以认为function对方法指针进行了优化,function是泛型的方法指针,function可以指向functor,可以指向成员方法,可以指向兼容于function的方法。 4、古典的策略模式   类型建立一个继承结构,functor建立一个继承结构。 转载于:https://www.cnblogs.com/nzbbody/p/3489570.html 来源: https://blog.csdn.net/weixin_30881367/article/details/99234570

设计模式之行为类模式大PK

夙愿已清 提交于 2019-11-27 00:36:31
行为类模式大PK 行为类模式包括 责任链模式 、 命令模式 、解释器模式、迭代器模式、 中介者模式 、 备忘录模式 、 观察者模式 、 状态模式 、 策略模式 、 模板方法模式 、 访问者模式 。该组设计模式众多,如下我们着重介绍一下命令模式VS策略模式、状态模式VS策略模式、观察者模式VS责任链模式。 命令模式VS策略模式 命令模式和策略模式类图很相似,只是命令模式多了一个接收者(Receiver)角色,通过确切的Command类调用Receiver类,实现了调用者和具体的接收者的解耦。策略模式的意图是封装算法,它认为“算法”已经是一个完整的、不可拆分的原子业务,通过对算法的封装实现算法的独立,并且可以相互转换,让行为的变化独立于拥有行为的客户,如我们在策略模式中的例子:诸葛亮给赵云的锦囊妙计,其中每个计策就是一个算法,对妙计进行封装,在不同的时间调用执行不同的计策;而命令模式是对动作解耦,把一个动作的执行分为执行对象(Receiver)和执行行为(Command),让两者相互独立而不相互影响,我们在命令模式中举出了软件开发的例子,软件开发中包括美工组、界面组、编码组,这就是各个执行对象,还包括一个产品经理,就是那个执行行为,客户通过只跟Command打交道实现各个执行对象的行为。   接下来我们从对文件压缩的业务需求出发,分别按照命令模式和策略模式设计出一套实现

21.策略模式

江枫思渺然 提交于 2019-11-26 23:56:56
策略模式 一、策略模式(Strategy Pattern) 1.基本介绍 1)策略模式中,定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户 2)这算法体现了几个设计原则: 把变化的代码从不变的代码中分离出来 针对接口编程而不是具体类(定义了策略接口) 多用组合/聚合,少用继承(客户通过组合方式使用策略) 2.原理类图 二、应用实例 1.实例要求 1)有各种鸭子(比如野鸭、北京鸭、水鸭等,鸭子有各种行为,比如叫、飞行等) 2)显示鸭子的信息 2.思路分析 3.代码实现 public class Client { public static void main(String[] args) { WildDuck wildDuck = new WildDuck(); wildDuck.fly();// ToyDuck toyDuck = new ToyDuck(); toyDuck.fly(); PekingDuck pekingDuck = new PekingDuck(); pekingDuck.fly(); //动态改变某个对象的行为, 北京鸭 不能飞 pekingDuck.setFlyBehavior(new NoFlyBehavior()); System.out.println("北京鸭的实际飞翔能力");

spring中策略模式使用

£可爱£侵袭症+ 提交于 2019-11-26 20:07:28
策略模式 工作中经常使用到策略模式+工厂模式,实现一个接口多种实现的灵活调用与后续代码的扩展性。在spring中使用策略模式更为简单,所有的bean均为spring容器管理,只需获取该接口的所有实现类即可。 下面以事件处理功能为例,接收到事件之后,根据事件类型调用不同的实现接口去处理。如需新增事件,只需扩展实现类即可,无需改动之前的代码。这样即做到了功能的隔离,又可防止改动原代码导致的bug。 类图 代码示例 定义接口 public interface IBaseEventService { /** * 处理事件 * @param eventObject * @return * @throws Exception */ public boolean dealEvent(String eventObject); /** * 获取事件类型 * @return */ public String getType(); } 接口实现 @Service public class AddUserEventServiceImpl implements IBaseEventService { @Override public boolean dealEvent(String eventObject) { // TODO 业务处理逻辑 return false; } @Override public

策略模式+工厂方法消除if...else

天涯浪子 提交于 2019-11-26 16:51:10
今天来讲一下如何通过策略模式和工厂方法来消除累赘的if...else,具体什么是策略模式,大家可以自行百度学习,我就不再这里做过多的介绍了。 注意:如果业务场景简单,建议使用if...else,因为代码逻辑简单,便于理解 1.策略接口 1 /** 2 * 策略接口 3 * 4 */ 5 public interface Eat { 6 7 public void eatFruit(String fruit); 8 9 } 2.策略类 EatApple.java 1 /** 2 * 具体的策略类:吃苹果 3 */ 4 public class EatApple implements Eat{ 5 6 @Override 7 public void eatFruit(String fruit) { 8 System.out.println("吃苹果"); 9 } 10 11 } EatBanana.java 1 /** 2 * 具体的策略类:吃香蕉 3 */ 4 public class EatBanana implements Eat { 5 6 @Override 7 public void eatFruit(String fruit) { 8 System.out.println("吃香蕉"); 9 } 10 11 } EatPear.java 1 /** 2 * 具体的策略类

策略模式

限于喜欢 提交于 2019-11-26 15:44:42
在 上一篇文章 中介绍了简单工厂模式,一个简单的银行系统开始初现端倪,现在我们开始为银行增加一个货币兑换业务,我们只需增加一个业务类,并实现 IOperation 接口就行了: 1 /**/ /// <summary> 2 /// 汇兑业务 3 /// </summary> 4 class Exchange : IOperation 5 { 6 public void operation() 7 { 8 Console.WriteLine( " you are exchanging! " ); 9 } 10 } 然后再在简单工厂类中加上一个判断: 1 switch (operation) 2 { 3 case " turn " : 4 opera = new TurningBox(); 5 break ; 6 case " out " : 7 opera = new OutingBox(); 8 break ; 9 case " exchange " : 10 opera = new Exchange(); // 汇兑业务 11 break ; 12 default : 13 opera = new SavingBox(); 14 break ; 15 } 也就是说我们每为银行增加一个业务都要重复以上两步操作,很明显,在银行业务很多的情况下,如缴费、汇款、理财等,用户每提出一个需求

简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

别等时光非礼了梦想. 提交于 2019-11-26 11:50:48
转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰)、Bmw(宝马)、Audi(奥迪)),还雇了司机为他开车。不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上 Audi后他说“开奥迪车!”。 你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的! 幸运的是这种有病的现象在OO语言中可以避免了。下面以Java语言为基础来引入我们本文的主题:工厂模式! 二、简介 工厂模式主要是为创建对象提供了接口。工厂模式按照《Java与模式》中的提法分为三类: 1. 简单工厂模式(Simple Factory) 2. 工厂方法模式(Factory Method) 3. 抽象工厂模式(Abstract Factory) 这三种模式从上到下逐步抽象,并且更具一般性。还有一种分类法,就是将简单工厂模式看为工厂方法模式的一种特例,两个归为一类。两者皆可,这本为使用《Java与模式》的分类方法。 在什么样的情况下我们应该记得使用工厂模式呢

Java设计模式:策略模式

五迷三道 提交于 2019-11-25 19:46:49
策略模式 (Strategy Pattern) Define a family of algorithms,encapsulate each one,and make them interchangeable. 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。 策略模式定义:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 大多数的设计模式都是为了解决系统中变化部分的问题 设计原则: 封装变化(找出应用中可能需要变化之处,把它们独立出来,不要和哪些不需要变化的代码混在一起) 多用组合,少用继承 (有一个好于是一个) 面向接口编程而是不实现(这里的接口泛指超类,可以是interface、也可以是abstract class) 借用 head first 鸭子事例: FlyBehavior、QuackBehavior分别封装了鸭子飞的行为和叫的行为的算法族。 来源: https://blog.csdn.net/andy_only/article/details/98725327