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

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

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

  1. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...

  2. 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...

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

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

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

    策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...

  5. HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)

    策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...

  6. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  7. 反馈法学习设计模式(一)——策略模式Strategy Pattern

    简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...

  8. 策略模式 Strategy 政策Policy 行为型 设计模式(二十五)

    策略模式 Strategy   与策略相关的常见词汇有:营销策略.折扣策略.教学策略.记忆策略.学习策略.... “策略”意味着分情况讨论,而不是一概而论 面对不同年龄段的人,面对不同的商品,必然将会 ...

  9. 策略模式-Strategy(Java实现)

    策略模式-Strategy 在策略模式中,一个类(策略使用者)可以更改自己的执行策略. 比如以排序算法为例子, 多种排序算法都归属于排序算法, 但是实现的算法细节不同, 使用者可以很轻松地替换策略, ...

随机推荐

  1. gem5 设定checkpiont以及从checkpoint开始运行

    同spec2006中间bzip2一个例子,如何设置checkpoint .以及从checkpoint继续以启动运行.这样做的目的是为了,采纳automic运行N指令,然后detailed运行M指令. ...

  2. 调用WCF的异步方法

    原文:调用WCF的异步方法 AsyncCallback aLoginCallback = delegate(IAsyncResult result) { var aSystemUser = WcfCl ...

  3. IIS总提示输入用户名和密码

    解决办法: 第一步,在"运行"中输入"gpedit.msc"调出组策略设置. 找到计算机配置-管理模块-windows 组件-internet控制面板-安全页- ...

  4. linux下mysql数据的导出和导入

    导出整个数据库中的全部数据 1.在linux命令行下输入: mysqldump -u userName -p dabaseName > fileName.sql fileName.sql最好加上 ...

  5. js创建下载文件

    function downloadFile(fileName, content){ var aLink = document.createElement('a'); var blob = new Bl ...

  6. jQuery获取url参数值

    $.extend({ getUrlVars: function () { var vars = [], hash; var hashes = window.location.href.slice(wi ...

  7. spring4.1+springmvc4.1+mybatis3.2.8+spring-security3.2.5集成环境建设

    在最近使用的项目ssi+spring-security 结构体.建立你自己的家,这是什么环境. 只有记录的目的. 项目结构: 类文件:                                  ...

  8. swift学习一:介绍,开发文档下载

    在今天wwdc2014公布会上.苹果今天公布了全新的编程语言Swift以及新版Xcode.对于开发人员来说,Swift包括了非常多开发人员喜欢的功能,能够与Objective-C和C语言共同工作.Sw ...

  9. 小米2S TWRP 3.0.2-0 最新版Recovery

    主界面 使用了我最新修改的内核 下载地址: 链接: http://pan.baidu.com/s/1i5xwddb 密码: 7dyb 验证信息: md5sum: dca410f33020eb87986 ...

  10. Word001

    C# Word 类库 2009-08-06 22:10 13470人阅读 评论(10) 收藏 举报 c#objectstring文档microsoftexcel using System;using ...