策略模式——读书随笔

菜鸟D依然在缓慢的学习着设计模式,毕竟才只是学习的第一阶段。(设计模式的三阶段:第一阶段,完全不知道模式;第二阶段,模糊的知道模式了,万物皆模式;第三阶段,不知道这是什么模式,能解决问题就是好模式)

有人叫我不要执着于模式,谨记设计模式的六大原则:单一原则、开闭原则、依赖倒置原则、接口隔离原则、里氏替换原则和迪米特法则,并且将这些原则运用到代码中,就足够了。菜鸟D在努力践行着,虽然几乎没有成果。言归正传——

参考资料:《大话设计模式》 第二章

《Head_First设计模式》(又译作《深入浅出设计模式》)  第一章

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

结构图:

简要介绍一下结构图:

Context上下文类在项目中间充当一个调用者的角色,上下文类中包含一个策略类接口,调用某一具体策略。

Strategy策略类定义策略接口(算法类接口),也可以用抽象类和虚方法,此处以多态的形式实现。由于提倡“多用组合,少用继承”的oo原则,建议使用接口。

A、B、C具体策略类(具体算法类),根据不同的需求提供具体的策略算法。

具体事例:

1.《大话设计模式》中采用商场打折的例子,不同的打折方案就是不同的策略,结账时选择一个具体的打折方案。

2.《Head_First设计模式》中采用的是鸭子的例子,不同的鸭子有不同的飞行方法和叫声,不同的飞行方法、不同的叫声也是不同的策略,定义了两个策略族(算法族),具体的鸭子有其飞行方法和叫声。

3.《Head_First设计模式》的思考题是一个游戏的例子,角色装备不同的武器,不同的武器也是同一个策略族的。

代码实现:

简单实现了第三个例子,其他的例子书上有源码。

 1     public interface IWeapon
 2     {
 3         string Name { get; set; }
 4
 5         void Use();
 6     }
 7
 8     public abstract class Person
 9     {
10         public string Name { get; set; }
11
12         protected IWeapon Weapon;
13
14         public void SetWeapon(IWeapon weapon)
15         {
16             Weapon = weapon;
17         }
18
19         public abstract void UseWeapon();
20
21     }
22
23     public class Gun : IWeapon
24     {
25         public string Name { get; set; }
26
27         public void Use()
28         {
29             Name = "95步枪";
30             Console.WriteLine("装备+15的{0}", Name);
31         }
32     }
33
34     public class Stone : IWeapon
35     {
36         public string Name { get; set; }
37
38         public void Use()
39         {
40             Name = "疯狂的石头";
41             Console.WriteLine("装备+12{0}", Name);
42         }
43     }
44
45     public class Troch : IWeapon
46     {
47         public string Name { get; set; }
48
49         public void Use()
50         {
51             Name = "折断的电棒";
52             Console.WriteLine("装备+15{0}", Name);
53         }
54     }
55
56     public class HorseMan : Person
57     {
58         public override void UseWeapon()
59         {
60             Console.WriteLine("圣骑士{0}:", Name);
61             Weapon.Use();
62             Console.WriteLine("哈哈,圣骑士{1}用{0}秒杀了你!!", Weapon.Name, Name);
63         }
64     }
65
66     public class Lancer : Person
67     {
68         public override void UseWeapon()
69         {
70             Console.WriteLine("枪兵{0}:", Name);
71             Weapon.Use();
72             Console.WriteLine("哈哈,枪兵{1}用{0}爆了你的菊花!!", Weapon.Name, Name);
73         }
74     }
75 //调用
76     Person p=new HorseMan();
77     p.Name = "李二狗";
78     p.SetWeapon(new Gun());
79     p.UseWeapon();

注意:代码在实现的过程中也发生了细微的变化,比如使用抽象方法,让子类来重写具体的调用(通常情况下这是不必要的,此处只是了恶趣味)。当然有些复杂的逻辑也可以这样写(多态就是让这么用的,注意多态造成的耦合也是相当高的),此处不能穷举。

策略模式很容易和简单工厂模式结合,根据实际的情况选择具体的策略来应对程序的复杂逻辑。关于解耦的问题就需要具体分析具体处理了。

扩展:当你看到new关键字的时候,就说明你的代码已经发生了耦合,但是这些耦合不一定都需要解耦。(个人看法:零耦合是一种可望而不可及的理想状态,就如同高中物理的小滑块一样的理想)

菜鸟D希望这篇笔记对您有所帮助。

时间: 2024-10-28 11:27:51

策略模式——读书随笔的相关文章

Head First Design Pattern 读书笔记(1) 策略模式

Head First Design Pattern 读书笔记(1) Strategy Pattern 策略模式 这几天为了锻炼看英语文档的能力,开着有道硬着头皮看 <Head First Desgin Pattern>的原版书,顺便做下笔记,把里面提到的每个模式通过回忆的方式画出来复习并记下来总结下学习成果=.= 关于设计模式 使用设计模式是为了增强程序的复用性,拓展性,易维护性. 设计模式会增加程序代码的复杂度,并不是所有情况都必须使用设计模式,需要根据需求以及经验评估使用场景. 学习并掌握

大话设计模式读书笔记2——策略模式

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类直接的耦合. UML 图: 根据<大话设计模式>——第二章 商场促销这个案例代码来简单的记录一下策略模式的使用方式: /// <summary> /// 现金收费抽象类 /// </summary> public abstract class CashSuper { /// <summary> ///

JavaScript设计模式与开发实践---读书笔记(5) 策略模式

策略模式的定义是:定义一系列的算法,把它们一个个封转起来,并且使它们可以相互替换. JavaScript版本的策略模式: 奖金系统: var strategies = { "S": function(salary){ return salary*4; }, "A": function(salary){ return salary*3; }, "B": function(salary){ return salary*2; } }; var calc

head first 设计模式读书笔记 之 策略模式

作为一个php开发者,深知曾经很多程序员都鄙视php,为什么呢?因为他们认为php的语法是dirty的,并且由于开发者水平参差不齐导致php的代码更加乱上加乱,维护起来简直一坨shit一样.随着php加入了面向对象的阵型之后,很多开发者开始使用了oop思想来写代码,php也变得越来越标准,越来越规范.而其中,设计模式起到了不小的作用.最近老大找我谈话,说php这边的开发模块耦合度过高,代码感觉质量不高,想来一次代码重构行动.我对代码重构也是一知半解,而代码重构的基础就是去了解设计模式,于是我翻起

大话设计模式读书笔记--2.策略模式

面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类 定义 它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户 模式结构 Strategy: 定义所有支持算法的公共接口 ConcreteStrategy: 封装了具体的算法或行为,也就是具体的策略 Context:是算法对象工厂, 维护一个Strategy对象的引用, 产生具体算法对象 模式实现 场景:模拟商城收银软件,营业员根据客户所

关于模板方法和策略模式的一点思考

该随笔的思想原点,应该算是在两三年前了.当时和一前同事聊天.不知怎得就聊到了Http访问. 一.我记得他和我说过的第一句话,大概是:有没有已经封装好的.比较强大的HttpUtil.也可能是受业务的影响(接口对内).我当时接触到的Http访问,大多比较“规范”,至少有一个接口约束在约定着某些东西,不至于一会传递json,返回json, 一会又要传递xml,返回xml,甚至更奇葩的是,上传个文件.返回0或者1.如果真出现这样的状态,HttpUtil依然能够方便.灵活的适应着各种情况.我想这个Util

从桥接模式与策略模式谈起(转载)

原文地址:http://www.blogjava.net/wangle/archive/2007/04/25/113545.html 从桥接模式与策略模式谈起 桥接(Bridge)模式是结构型模式的一种,而策略(strategy)模式则属于行为模式.以下是它们的UML结构图. 在桥接模式中,Abstraction通过聚合的方式引用Implementor. 在策略模式中,Context也使用聚合的方式引用Startegy抽象接口. 从他们的结构图可知,在这两种模式中,都存在一个对象使用聚合的方式引

源码学习之设计模式(策略模式)

今天要给大家说的是策略模式.先不做解释,先看代码,体会一下策略模式的神奇. 修改前的代码 public class Main { public static void main(String[] args) { String payType = "wxPay"; if(payType.equals("alipay")){ System.out.println("支付包支付"); }else if(payType.equals("cred

springboot 下策略模式的简单使用

1.灵魂三问 接手前人(已跑路)项目快乐否? 前人项目不写注释懵逼否? 一个方法中一堆if/else,且业务判断条件用简单数字(或英文字母),不带注释,想打人否? ????所以,对于上述三个问题,我写了此随笔,然而----然并卵 ????这篇文章并不能让你不接手前人项目,并不能让你看懂没有注释的业务代码,也并不能让你以后不碰到if/else轰击波,但是--系尬系 ????鲁迅先生曾倡导过,如果你觉得政府腐败,那么你就应该努力考取公务员从政,去内部解决腐败:如果你觉得你的家乡建设不够美丽,那么你应