zoukankan      html  css  js  c++  java
  • 策略模式——读书随笔

          菜鸟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希望这篇笔记对您有所帮助。
  • 相关阅读:
    企业架构-发布【企业架构框架-TOGAF v0.1.pdf】
    dropbox连接不上解决方法
    信息系统开发平台OpenExpressApp - 框架待完善工作事项
    微软全球Web Camps大会5月着落中国,免费报名参加2天原汁原味的活动,赶快报名
    BABOK - 企业分析(Enterprise Analysis)概要
    DNN(DotNetNuke)研究手札系列3-框架(概述)
    DNN(DotNetNuke)研究手札系列5之DNN的未来(蓝图)
    我乐意为博客园贡献一份力量:请签名
    DNN(DotNetNuke)研究手札系列4-框架(硬伤) 1
    感慨 20 之开源的前途/钱图?(1数据库)
  • 原文地址:https://www.cnblogs.com/cnDqf/p/4152720.html
Copyright © 2011-2022 走看看