策略模式Strategy——坐什么车回家?

策略模式Strategy——坐什么车回家?

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

1.存在的问题和模型

:2014年6月       学校:廊坊师范        家:石家庄       人物:学生

       又快到期末考试了。回家的节奏也奔上日程,无聊之余就想想这次回家的事儿。

对我来说回家主要有两种交通方式:1.汽车。2.火车。像飞机、高铁了什么的咱就不考虑了一个是资金匮乏、条件不同意(廊坊没飞机场吧?)外,廊坊到石家庄这么近搞那么多花样也太伤神经了(尤其对一路痴来说)。

如今来一一分析下这两种方式:

       1.汽车  方便省事。不用在学生大部队回家的时候操心抢不到火车票而郁闷,可是对于晕车的人来说4h的车程还是蛮煎熬的,或者来个快速紧急事件把你放快速上几个小时还是有可能的。不得不提的一点就是从大一到如今廊坊~石家庄的汽车票价已经涨三次了,第四次貌似也正在筹备中。

。。

       2.火车  “回家之难,难于一票解千愁”,学生的优点就是出去玩啦寒暑假回家的时候手里有一张踏踏实实的学生证,能半价的半价不半价也能来个七五折,比坐汽车回家划算多了。

可是我们也不能忽略这廉价背后隐藏的真相,各种抢票各种半夜蹲点,整得有时候回家就得像个夜猫子一样。

       相比較而言,对于学生的我来说,回家的方式莫过于火车为主、汽车为辅,火车行不通了再买张汽车票吧。假设哪一天手上有了大把的闲钱,科技再发达点,没准儿我就乘UFO回家了。

呃。想多了,那会儿应该人就不在廊坊了

2.结构:UML图策略模式Strategy——坐什么车回家?

3.模式组成

     1)环境角色(Context):持有一个对Strategy的引用。终于给client调用。

用一个ConcreteStrategy对象来配置,可定义一个接口来让Strategy訪问它的数据。

     2)抽象策略角色(Strategy):策略类。通常由一个接口或者抽象类实现。定义了一个公共接口。各种不同的算法以不同的方式实现这个接口。

Context使用这个接口来调用某ConcreteStrategy定义的算法。

     3)详细策略角色(ConcreteStrategy):包装了相关的算法和行为,实现了Strategy定义的接口,提供详细算法的实现。

4.应用

     1)多个类仅仅差别在表现行为的不同,在执行时动态选择详细要执行的行为。

     2)须要在不同情况下使用不同的策略。或者策略还可能在未来用其他方式实现。

     3)对客户隐藏详细策略的实现细节。以避免暴露复杂的、与算法相关的数据结构。

     4)一个类定义了多种行为,而且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以取代这些条件语句。

5.长处

     1)算法系列:Strategy类层次为Context定义了一系列的可供重用的算法或行为。

继承有助于析取出这些算法中的公共功能。

     2)简化了单元測试:每一个算法都有自己的类。能够通过自己的接口单独測试。每一个算法可保证它没有错误,改动当中任一个时也不会影响其它的算法。

     3)消除了一些条件语句:当不同的行为堆砌在一个类中时。就非常难避免使用条件语句来选择合适的行为。将这些行为封装在一个个独立的Strategy类中,能够在使用这些行为的类中消除条件语句。

     4)提供了能够替换继承关系的办法:继承能够处理多重算法或行为,但它也使得动态改变算法或行为变得不可能。

   缺点

     1)client必须知道全部的策略类,并自行决定使用哪一个策略类。

     2)造成非常多策略类的产生,能够通过使用享元模式在一定程度上降低对象的数量。

6.模式实现

    UML图

策略模式Strategy——坐什么车回家?

代码实现

    //client代码
    static void Main(string[] args)
    {
        PersonContext person;
        //实例化不同的交通工具,终于得到的回家方式不同
        person = new PersonContext(new TrainStrategy());
        person.PersonInterface();

        person = new PersonContext(new AutomobileStrategy());
        person.PersonInterface();

        Console.Read();
    }
    //PersonContext类
    class PersonContext
    {
        //声明一个GoHomeStrategy对象
        private GoHomeStrategy gh;

        //通过构造方法,传入详细的回家交通策略
        public PersonContext(GoHomeStrategy gh)
        {
            this.gh = gh;
        }
        public void PersonInterface()
        {
            gh.transportation();
        }
    }
    //抽象算法类,定义全部回家的交通方式
    abstract class GoHomeStrategy
    {
        //算法方法
        public abstract void transportation();
    }
    //详细交通方式。火车类
    class TrainStrategy:GoHomeStrategy 
    {
        public override void transportation()
        {
            Console.WriteLine("乘火车回家");
        }
    }
    //详细交通方式,汽车类
    class AutomobileStrategy:GoHomeStrategy
    {
        public override void transportation()
        {
            Console.WriteLine("乘汽车回家");
        }
    }

7.其他相关模式

     状态模式、简单工厂模式

8.总结

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

     在这个模式的运用中。非常多时候採用与简单工厂模式和反射方法结合的方式,从而更好的实现OCP原则。

 

PS:策踩小幅模式算法不是一个简单的计算指标学习,但相当的方式来实现该方法的功能。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117496.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • javascript百炼成仙 第一章 掌握JavaScript基础 1.2直接量

    javascript百炼成仙 第一章 掌握JavaScript基础 1.2直接量叶小凡的住处被安排在青山院西北角的一个房间里,虽不宽敞,倒也干净。叶小凡两眼露出振奋的眼神,随便吃了点乡亲们准备的干粮后,就立刻开始打坐修行。编程之修,重在积累,而非资质。资质虽然一样重要,可是后天的努力一样必不可少。这些道理,叶小凡还未上山之前,就已经熟知!因此,即便是资质平凡,只要肯下苦功,一样可以修得正果!叶小凡虽然甲等资质,可依然不骄不躁,开始从“JavaScript基础修炼要诀”第一页开始看起。修炼要诀第一章,直接量。编程世界,所谓直接量,就是明面上可以见到的数据值。常见的直接量有数字,小数,

    2022年6月11日
    44
  • mysql安装,mysql环境变量配置「建议收藏」

    mysql安装,mysql环境变量配置「建议收藏」mysql绿色版安装,mysql环境变量配置。小白都能学会的教程

    2025年5月23日
    1
  • Java之单例模式

    Java之单例模式

    2021年7月21日
    54
  • 遗传算法的优化算法_粒子群算法和遗传算法的区别

    遗传算法的优化算法_粒子群算法和遗传算法的区别与遗传算法的第一次接触遗传算法的基本概念基本定义遗传算法的基本流程遗传算法过程中的具体操作参数的编码二进制编码Gray编码实数编码有序编码初始群体的设定适应度函数的计算遗传操作设计选择selection交叉crossover变异mutation控制参数的设定求解优化问题的实例问题描述问题分析算法设计个体编码适应值函数选择策略杂交算子变异算子参数设置

    2025年9月16日
    5
  • TestNg显示器(一个)—–监听器,类型和配置使用—另外META-INF详细解释

    TestNg显示器(一个)—–监听器,类型和配置使用—另外META-INF详细解释

    2022年1月4日
    47
  • MySQL使用SQL语句修改表名

    MySQL使用SQL语句修改表名MySQL中可以使用renametable这个SQL语句来修改表名。renametable这个SQL语句来修改表名的基本语法是:RENAMETABLE<旧表名>TO<新表名>;我们来把test表修改为test1表。1、首先查看一下当前数据库中有哪些表。mysql>showtables;+——————-+…

    2022年5月6日
    56

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号