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

1.存在的问题和模型

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

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

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

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

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

。。

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

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

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

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

2.结构:UML图

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图

代码实现

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

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

时间: 2024-10-15 13:53:51

策略模式Strategy——坐什么车回家?的相关文章

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

1.问题与模式 时间:2014年6月       学校:廊坊师范        家:石家庄       人物:学生 又快到期末考试了,回家的节奏也奔上日程,无聊之余就想想这次回家的事儿.对我来说回家主要有两种交通方式:1.汽车,2.火车.像飞机.高铁了什么的咱就不考虑了一个是资金匮乏.条件不允许(廊坊没飞机场吧?)外,廊坊到石家庄这么近搞那么多花样也太伤神经了(尤其对一路痴来说).现在来一一分析下这两种方式: 1.汽车  方便省事,不用在学生大部队回家的时候担心抢不到火车票而郁闷,但是对于晕车的

设计模式之策略模式(Strategy)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

策略模式(Strategy Pattern)

策略模式(Strategy Pattern) 抛开晦涩的定义,首先看一个例子: 我们想要创建一个模拟鸭子的游戏,在这个游戏中,会有各种类型的鸭子,比如mallard duck,red head duck,rubber duck(除了rubber duck(橡皮鸭),看见这其余两种鸭子很好奇,于是查找相关图片,发现mallard duck是绿头鸭,red head duck是红头鸭,自己生活中还没有见过,有趣,哈哈!三种鸭子图片如下所示). 回归话题,在这个模拟鸭子的游戏中,各种鸭子均有两种能力,

设计模式 - 策略模式(Strategy Pattern) 具体解释

策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全部, 禁止转载, 如有须要, 请站内联系. 策略模式: 定义了算法族, 分别封装起来, 让它们之间能够相互替换, 此模式让算法的变化独立于使用算法的客户. 对于父类的子类族须要常常扩展新的功能, 为了使用父类比較灵活的加入子类, 把父类的行为写成接口(interface)的形式; 使用set()方法

设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕该功能.如查找.排序等,一种经常使用的方法是硬编码(Hard Coding)在一个类中,如须要提供多种查找算法,能够将这些算法写到一个类中,在该类中提供多个方法,每个方法相应一个详细的查找算法:当然也能够将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件推断语句来进行选择.

设计模式 - 策略模式(Strategy Pattern) 详解

策略模式(Strategy Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权所有, 禁止转载, 如有需要, 请站内联系. 策略模式: 定义了算法族, 分别封装起来, 让它们之间可以相互替换, 此模式让算法的变化独立于使用算法的客户. 对于父类的子类族需要经常扩展新的功能, 为了使用父类比较灵活的添加子类, 把父类的行为写成接口(interface)的形式; 使用set()方法,

设计模式实现C++ --策略模式Strategy(对象行为型)

1.问题 出行旅游:我们可以有几个策略可以考虑:可以骑自行车,汽车,做火车,飞机.每个策略都可以得到相同的结果,但是它们使用了不同的资源.选择策略的依据 是费用,时间,使用工具还有每种方式的方便程度. 2.解决方案 策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 策略模式把对象本身和运算规则区分开来,其功能非常强大,因为这个设计模式本身的核心思想就是面向对象编程的多形性的思想. strategy模式类图: 3.应用场景 1. 

设计模式---策略模式Strategy(对象行为型)

1. 概述 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理. 2. 应用场景 (1)多个类只区别在表现行为不同,在运行时动态选择具体要执行的行为. (2)需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现. (3)对客户隐藏具体策略(算法)的实现细节,彼此完全独立. 3. 示例 出行旅游:我们可以有几个策略可以考虑:可

如何让孩子爱上设计模式 ——14.策略模式(Strategy Pattern)

如何让孩子爱上设计模式 --14.策略模式(Strategy Pattern) 描述性文字 本节讲解的是行为型设计模式中的第一个模式: 策略模式, 这个模式非常简单,也很好理解. 定义一系列的算法,把每个算法封装起来,并使得他们可以相互替换, 让算法独立于使用它的客户而变化. 一般用来替换if-else,个人感觉是面向过程与面向对象思想的 过渡,这里举个简易计算器的栗子,帮助理解~ 普通的if-else/switch计算器 普通的面向过程if-else简易计算器代码如下: 运行结果如下: 这里我