大话设计模式之策略模式读后感

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

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这个类,而使用简单工厂的时候,至少得知道两个类。进一步解耦和了吧,个人感觉策略模式是简单工厂的升级版,把策略模式和简单工厂合在一起使用更佳,当然大话设计模式里面也是推荐这样使用的。

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

原文地址:https://www.cnblogs.com/zfding/p/8686201.html

时间: 2024-11-03 09:43:57

大话设计模式之策略模式读后感的相关文章

大话设计模式_策略模式(Java代码)

策略模式:定义算法家族,分别封装,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户 简单描述:一个父类,多个子类实现具体方法.一个Context类持有父类的引用(使用子类实例化此引用),客户端代码只需要与此Context类交互即可 大话设计模式中的截图: 例子代码: 策略类: 1 package com.longsheng.strategy; 2 3 public abstract class Strategy { 4 5 public abstract double getR

&lt;二&gt;读&lt;&lt;大话设计模式&gt;&gt;之策略模式

又和大家见面了,能够坚持写出第二篇文章真不错,好好加油. <<大话设计模式>>讲解策略模式是以商场收银软件程序开头的,那么问题来了,哪家商场收银软件强,开玩笑了.读过上篇文章<<简单工厂模式>>的知道,它有两个缺点:1.客户端依赖两个类,耦合性高:2.如果算法过多则需要写很多类.解决上面问题的就是策略模式了. 策略模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 商场收银软件:单价*打折算法=售价.

【大话设计模式】——策略模式

一.开篇 上篇文章[大话设计模式]--简单工厂模式告诉了我们一个网吧收费工厂对象怎样创建收费形式(白天收费.夜间收费)的实例.简单工厂代码中有非常多 case分支语句 ,假设我们还想填加收费的形式(比方会员收费啊,通宵收费啊),就须要修改工厂代码,每次维护和扩展都要花费非常多时间,另外修改非常easy造成纰漏(比方之前的白天收费形式,非常可能由于修改从多收钱或者少收钱),所以简单工厂模式非常不安全.所以我们要把常常变化的代码抽象出来,做到业务逻辑和界面逻辑分开,仅仅有这样才干更加easy做到维护

大话设计模式之策略模式

第二章:商场促销——策略模式 策略模式的定义: 策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,知识实现不同,他可以以相同的方式调用所有的算法,减少了各类算法类与使用算法类之间的耦合 策略模式的优点 : 1. 策略模式的Strategy 类层次为Context定义了一些列的可供重用的算法或行为.继承有助于析取这些算法中的公共功能 2.简化了单元测试,因为每个算法都要自己的类,可以通过自己的接口单独测试 当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择

设计模式之策略模式【4】

一.模式定义 它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法变化,不会影响到使用算法的客户. 二.模式分析 1.策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它们可以以相同的方式调用所有算法,减少了各种算法类与是哟算法类之间的耦合. 2.策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或者行为.继承有助于析取出这些算法中的公共功能. 3.策略模式就是用来封装算法的,但在实践中,我们发现可以用它来

学习大话设计模式02_工厂模式 进阶至 策略模式

1 /** 2 * 现金收费抽象类 3 * @author Monica 4 * 5 */ 6 public abstract class CashSuper { 7 /** 8 * 现金收取超类的抽象方法 9 * @param money 收取现金,参数为原价 10 * @return 返回当前价 11 */ 12 public abstract double acceptCash(double money); 13 } 14 15 /** 16 * 正常收费子类 17 * @author M

设计模式之策略模式(Strategy)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

【大话设计模式】——代理模式

对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念.Hibernate 的继承映射可以理解持久化类之间的继承关系.例如:人和学生之间的关系.学生继承了人,可以认为学生是一个特殊的人,如果对人进行查询,学生的实例也将被得到. Hibernate支持三种继承映射策略: 使用 subclass 进行映射:将域模型中的每一个实体对象映射到一个独立的表中,也就是说不用在关系数据模型中考虑域模型中的继承关系和多态. 使用 joined-subclass 进行映射: 对于继承关系中的子类使用同一个表

JavaScript设计模式之策略模式(学习笔记)

在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选择学习策略模式. 策略模式:定义了一系列家族算法,并对每一种算法单独封装起来,让算法之间可以相互替换,独立于使用算法的客户. 通常我并不会记得“牛顿第一定律”的具体内容,所以我也难保证我会对这个定义记得多久……用FE经常见到的东西来举个例子说明一下: $("div").animation(