zoukankan      html  css  js  c++  java
  • 设计模式之策略模式(行为型模式)

    初学设计模式,将学习心得与众博友分享,如有不正之处还请大家批评指正。

       王尼玛自称是一个上知天文下知地理的学霸,有天心血来潮报名参加了CCAV的《开心闯关》。到他上场了,主持人王二丫开始了第一题:吴敬梓是哪本名著的作者?王尼玛脱口而出:儒林外史。OYEAH,学霸果然是学霸,答对。请听第二题:最早的血压计用于测量谁的血压?马,王尼玛也顺利答出。后面几道题王尼玛也都顺利通过,主持人一看这势头分明是要拿走万元大奖的节奏啊,最后一题了赶紧翻出极难的:请问世上最苦逼的职业是什么?王尼玛一听即傻眼了,数以万计的职业到底哪个才是呀?急的直冒汗。正当二丫得意的时候,王尼玛决定求助亲友,眼看到手的奖金怎么能泡汤呢。随即拨通了挚友王尼美的电话,一听这题王尼美直接飞出六个字:程序猿不解释。最终王尼玛用了王尼美的答案使得全部通过,抱得万元大奖。王尼玛的机智打动了在场的所有人,掌声经久不息。
    楼主自娱自乐编了这个段子,难道你没发现这不就是策略模式的例子吗?请呵呵~

    概念:

     策略模式(Strategy Pattern)定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

    组成:

    • 抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
    • 具体策略角色:包装了相关的算法和行为。
    • 环境角色:(Context类)持有一个策略类的引用,最终给客户端调用。

    UML结构图:

     

    适用场景:

     1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
     2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
     3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
     
    那么现在我们将上面的小段子用程序简单的来表示一下

    类关系图:

     

    代码:(很简单就不做注释了,Sorry~)

     1     /// <summary>
     2     /// Strategy类
     3     /// </summary>
     4     abstract class Answer
     5     {
     6         public abstract void GetAnswer();
     7     }
     8 
     9     class Computer : Answer
    10     {
    11         public override void GetAnswer()
    12         {
    13             Console.WriteLine("使用计算机可以获知正确答案");
    14         }
    15     }
    16     class Friend : Answer
    17     {
    18         public override void GetAnswer()
    19         {
    20             Console.WriteLine("求助朋友可以获知正确答案");
    21         }
    22     }
    23     class Himself : Answer
    24     {
    25         public override void GetAnswer()
    26         {
    27             Console.WriteLine("凭借他自己的记忆可以获知正确答案");
    28         }
    29     }
    30     /// <summary>
    31     /// Context类
    32     /// </summary>
    33     class Player
    34     {
    35         private Answer answer;
    36         public Player(Answer answer)
    37         {
    38             this.answer = answer;
    39         }
    40         public void Operation()
    41         {
    42             answer.GetAnswer();
    43         }
    44     }
    45 
    46     /// <summary>
    47     /// 客户端调用
    48     /// </summary>
    49     class 策略模式
    50     {
    51         public static void Main()
    52         {
    53             Player player = new Player(new Friend());
    54             player.Operation();
    55             Console.ReadLine();
    56         }
    57     }

    参考资料:

    • 百度百科:策略模式
    • C#设计模式(李建忠)
     
  • 相关阅读:
    fastjson的@JSONField注解
    Java 日期比较大小
    linux 查看文件显示行号
    Java double 加、减、乘、除
    Java 身份证判断性别获取年龄
    linux 查看端口被占用
    Unable to complete the scan for annotations for web application [/wrs] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies.
    nginx 返回数据不完整
    linux redis 启动 overcommit_memory
    IntelliJ IDEA 常用设置
  • 原文地址:https://www.cnblogs.com/sanduo8899/p/3728288.html
Copyright © 2011-2022 走看看