大话设计模式之策略模式读后感(代码片段)

恋在那时 恋在那时     2022-10-30     588

关键词:

策略模式:定义了算法家族,分别封装起来,让他们呢之间可以互相的替换,此模式让算法的变化不会影响到使用算法的客户。

UML类图:

解读:策略模式是定义一系列的算法,从概念上来讲,这些算法完成的工作都是一样的,只是他们的实现的不同,可以以相同的方式调用所有的算法,减少了各种算法类和算法调用类之间的耦合。

策略模式中的supperStrategy为context类提供了一系列的可供重用的算法或者行为。继承有助于提取出这些算法的公共功能。

在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给了策略模式中的对象context对象。

代码示例:

 1 package com.dzf.designtest;
 2 
 3 /**
 4  * <desc>
 5  *   策略模式:定义了一系列的算法,让这些算法之间可以互相的替换
 6  * <p>
 7  * </desc>
 8  *
 9  * @author dingzf
10  * @date 2018/4/1
11  * @time 11:23
12  */
13 public class StrategyDemo 
14     //客户端
15     public static void main(String[] args) 
16         Context context1 = new Context(new StrategyOne());
17         context1.operate();
      //当我们需要使用哪种实现的时候,就选择哪种
18 Context context2 = new Context(new StrategyTwo()); 19 context2.operate(); 20 Context context3 = new Context(new StrategyThree()); 21 context3.operate(); 22 23 24 25 26 /** 27 * 策略模式中的上下文对象,引用策略模式中的策略类 28 */ 29 class Context 30 private SupperStrategy supperStrategy; 31 public Context(SupperStrategy supperStrategy) 32 this.supperStrategy = supperStrategy; 33 34 public void operate() 35 if(supperStrategy!=null) 36 supperStrategy.getResult(); 37 38 39 40 41 /** 42 * 策略类 43 */ 44 abstract class SupperStrategy 45 public abstract void getResult(); 46 47 48 /** 49 * 策略子类1 50 */ 51 class StrategyOne extends SupperStrategy 52 @Override 53 public void getResult() 54 System.out.println("我会策略1号"); 55 56 57 /** 58 * 策略子类2 59 */ 60 class StrategyTwo extends SupperStrategy 61 @Override 62 public void getResult() 63 System.out.println("我会策略2号"); 64 65 66 /** 67 * 策略子类3 68 */ 69 class StrategyThree extends SupperStrategy 70 @Override 71 public void getResult() 72 System.out.println("我会策略3号"); 73 74

上面这种写法还是不太好,这样我们调用端需要知道两个类,我们可以改造下:

 1 public class StrategyDemo 
 2     //客户端
 3     public static void main(String[] args) 
 4       Context context1 = new Context("strategyOne");
 5       context1.operate();
 6       Context context2 = new Context("strategyTwo");
 7       context2.operate();
 8       Context context3 = new Context("strategyThree");
 9       context3.operate();
10     
11 
12 
13 
14 /**
15  * 策略模式中的上下文对象,引用策略模式中的策略类
16  */
17 class Context
18     private SupperStrategy supperStrategy;
19     public Context(String supperStrategy) 
20         switch (supperStrategy)
21             case "strategyOne" :
22                 this.supperStrategy = new StrategyOne();
23                 break;
24             case "strategyTwo" :
25                 this.supperStrategy = new StrategyTwo();
26                 break;
27             case "strategyThree" :
28                 this.supperStrategy = new StrategyThree();
29                 break;
30         
31     
32     public void operate()
33         if(supperStrategy!=null)
34             supperStrategy.getResult();
35         
36     
37 

我们来使用简单工厂的方式来判断需要生成的对象,这样调用端只需要知道一个context类就可以啦。

选择所用具体实现的职责由客户端对象承担,并转给了策略模式中的对象context对象。

大家有没有发现代码上和简单工厂很类似,要说和简单工厂的区别,在代码上的体现就是调用端只需要知道context这个类,而使用简单工厂的时候,至少得知道两个类。进一步解耦和了吧,个人感觉策略模式是简单工厂的升级版,把策略模式和简单工厂合在一起使用更佳,当然大话设计模式里面也是推荐这样使用的。

最后:以上可以说是自己读大话涉及模式的一些读后感,如果有不对的地方,希望能够指正出来。

 

大话设计模式之简单工厂读后感(代码片段)

引言:让我们重温经典,致敬经典简单工厂模式:根据调用端传参来有选择的实例化目标对象。UML类图:我们知道简单工厂就是为我们生成我们需要的对象。举个栗子:我们在舞台看表演的时候,一场场表演下来,我们可以总结... 查看详情

大话设计模式之策略模式(代码片段)

背景:商场促销期间,可能会出现8折、5折的促销活动,也可能出现满100减10、满200减30的促销活动,设计一个收银系统。策略模式:定义了算法家族,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。... 查看详情

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

...对商场促销进行各种各样的打折进行设计案例的,而大话设计模式中还提到:  等等,打折、返现等等一系列促销具体方式 查看详情

《大话设计模式》——读后感老板回来了,我不知道?——观察者模式之事件委托

什么都不说,直接上代码,自己去理解,要结合动态代理看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... 查看详情

《大话设计模式》——读后感好菜每回味不同——建造者模式之基础案例

建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 建造者模式通常包括下面几个角色:1.builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定... 查看详情

《大话设计模式》——读后感好菜每回味不同——建造者模式之经典案例

本文参考地址:http://www.cnblogs.com/xieweikai/p/6826481.html建造者模式应用场景比如在玩“极品飞车”这款游戏,那么每一关的地图会千变万化,简单的来说,地图会有晴天和阴天之分,那么创建地图时就要根据晴天或者阴天来对地图... 查看详情

大话设计模式之策略模式

策略模式  定义了一系列的算法,分别封装起来,让他们之间可以互相替换。此模式让算法的改变不会影响到使用算法的客户。  在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对... 查看详情

java之策略模式(大话设计模式)

温故而知新,每次读设计模式都会有不同的体验,坚持每天一个设计模式,直到熟练运用设计模式。策略模式定义了很多完成相同工作的算法,但实现不同,它可以以相同的方式调用所有的算法,减少了算法和调用算法的耦合。... 查看详情

大话设计模式--策略模式(代码片段)

策略模式(Strategy):定义了算法家族,分别封装起来,让各个算法之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。/***策略,定义计算报价算法的接口**/publicinterfaceStrategy/**... 查看详情

大话设计模式之简单工厂模式(代码片段)

大话设计模式——简单工厂模式--参考自《大话设计模式》需求现在有一个需求,实现一个简单的计算器对于一般的初学者来说可能会这么实现:publicclasscalculatepublicstaticvoidmain(String[]args)Scannercin=newScanner(System.in);System.out.println(&qu... 查看详情

《大话设计模式》——读后感代码无错就是优?——简单工厂模式

本篇是我学习设计模式后的第一篇文章,由于本模式也比较简单,在此我就多啰嗦一下。学习本模式之前请下看一下我的《大话设计模式铺垫》文章,然后回答思考如下问题:1、UML类图看懂了吗?2、java的3大特性真的懂了吗?... 查看详情

大话设计模式之代理模式(代码片段)

代理模式是为了隐藏真实对象,为其提供一种代理以控制对这个对象的访问。UML类图: 公用接口Subject类:1/**2*定义共有接口3*/4publicinterfaceSubject56voidresquest();7真实对象RealSubject类:1/**2*真实实现3*/4publicclassRealSubjectimplementsSubj... 查看详情

大话设计模式之简单工厂模式(代码片段)

背景需求:模拟一个简单计算器。UML类图:说明:抽象类AbstractOperation有一个抽象方法getResult和两个成员变量,加减乘除分别继承AbstractOperation并实现getResult方法即可。OperationFactory是一个简单工厂方法,可根据入参实例化不同的... 查看详情

《大话设计模式》——读后感为别人做嫁衣?——静态代理模式

什么是代理模式: 代理模式结构图:   直接上代码:GiveGift接口:packagecom.sjmx.staticProxy;publicinterfaceGiveGift{voidgiveDolls();voidgiveFlows();voidgiveChocolate();}真实实体:packagecom.sjmx.staticProxy;publi 查看详情

大话设计模式之代理模式(代码片段)

引言:让我们重温经典,致敬经典代理模式:为其他对象提供一种代理以控制对这个对象的访问UML: 解读:代理模式要求代理者和被代理者实现同一个接口或者继承自同一个父类。并且代理者要持有真实对象的引用。所以代... 查看详情

《大话设计模式》——读后感雷锋依然在人间?——工厂方法模式

什么是工厂方法模式:工厂方法UML结构图:从图中我获取以下信息:1、Product是个接口,而Creator是个抽象类(我还是试试接口)2、ConcreateProduct和ConcreteCreator是有依赖关系的,后者依赖前者 接下来看看简单工厂模式中例子用... 查看详情

java设计模式之策略模式

...此模式让算法的变化,不会影响到使用算法的客户(大话设计模式)。策略模式UML图      策略模式代码   古代的各种计谋都是一种策略,这次我们的例子就拿其中一种离间计来写的,理解起来非常容易,代码... 查看详情