策略模式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:策踩小幅模式算法不是一个简单的计算指标学习,但相当的方式来实现该方法的功能。

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • css初始[通俗易懂]

    css概念及作用css即层叠样式表的英文缩写作用:1渲染页面2页面布局css语法CSS规则由两个主要的部分构成:选择器,以及一条或多条声明。示例及详解h1{color:red;

  • Qt 之自定义搜索框

    Qt 之自定义搜索框简述关于搜索框,大家都经常接触。例如:浏览器搜索、Windows资源管理器搜索等。当然,这些对于Qt实现来说毫无压力,只要思路清晰,分分钟搞定。方案一:调用QLineEdit现有接口voidaddAction(QAction*action,ActionPositionposition)在QLineEdit的前/后添加部件,ActionPosition表示部件所在方位。QAction

  • malloc函数实现过程

    malloc函数实现过程在C语言中,要进行动态内存的开辟就需要使用到malloc函数,在C++中使用的new关键字的基层也是调用了malloc函数,可见malloc函数的重要性,这个就浅析一下malloc的实现过程。本文的测试环境是win10+vs2015。首先先看看malloc函数怎么去调用//malloc函数原型//void*malloc(size_tsize);//(MSDN中的定义)type

  • 计算机网络体系结构

    计算机网络体系结构计算机网络体系结构认识一下什么是计算机网络体系结构计算机网络是一个非常复杂、庞大的系统,涉及到很多组成部分。包括主机、路由器、各种链路、应用、协议、硬件、软件……等。那么是否存在一种体系结构可以

  • oracle dml语句_oracle数据库导入dmp语句

    oracle dml语句_oracle数据库导入dmp语句/*DML语句对表中数据做增删改1.插入数据1)insertinto表名values(….)2)insertinto(字段…)values(…)3)创建表的同时拷贝表的数据createtableempasselect*fromscott…

    2022年10月21日
  • cocos creator编写2048小游戏,发微信小游戏

    cocos creator编写2048小游戏,发微信小游戏

发表回复

您的电子邮箱地址不会被公开。

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