策略模式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:策略模式中的算法并非单纯的指数学上一个计算的步骤。而是指实现某项功能的一种方式方法。
策略模式Strategy——回家乘什么车?的更多相关文章
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...
- 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...
- 设计模式 - 策略模式(Strategy Pattern) 具体解释
策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...
- HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)
策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...
- 反馈法学习设计模式(一)——策略模式Strategy Pattern
简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...
- 策略模式 Strategy 政策Policy 行为型 设计模式(二十五)
策略模式 Strategy 与策略相关的常见词汇有:营销策略.折扣策略.教学策略.记忆策略.学习策略.... “策略”意味着分情况讨论,而不是一概而论 面对不同年龄段的人,面对不同的商品,必然将会 ...
- 策略模式-Strategy(Java实现)
策略模式-Strategy 在策略模式中,一个类(策略使用者)可以更改自己的执行策略. 比如以排序算法为例子, 多种排序算法都归属于排序算法, 但是实现的算法细节不同, 使用者可以很轻松地替换策略, ...
随机推荐
- fastdfs5.11+centos7.2 按照部署(一)【转载】
1.绪论 最近要用到fastDFS,所以自己研究了一下,在搭建FastDFS的过程中遇到过很多的问题,为了能帮忙到以后搭建FastDFS的同学,少走弯路,与大家分享一下.FastDFS的作者淘宝资深架 ...
- SGU 205. Quantization Problem
205. Quantization Problem time limit per test: 0.25 sec. memory limit per test: 65536 KB input: stan ...
- Rookey.Frame v1.0快速开发平台-用户登录
上一次介绍的了Rookey.Frame v1.0快速开发平台的整体功能,接下来会对各个功能点进行解析说明,今天给大家介绍下系统登录功能. 用户登录 系统中基本上所有功能页面都是从后台代码拼接后返回的, ...
- chrome浏览器使用HTML5预览图片
chrome浏览器对HTML5支持的较好,使用HTML5的File相关的api,可以实现前台页面在选定图片后,不上传即可预览.代码如下: 1.前台代码,使用<input type="f ...
- lr11_Run-time Settings选项介绍:
lr11_Run-time Settings选项介绍: ●Run Logic ●Pacing ●Log 下面对每个
- 15、Spark Streaming源码解读之No Receivers彻底思考
在前几期文章里讲了带Receiver的Spark Streaming 应用的相关源码解读,但是现在开发Spark Streaming的应用越来越多的采用No Receivers(Direct Appr ...
- 在linux下安装sbt
1.到官方网站下载deb包,下载地址:https://dl.bintray.com/sbt/debian/sbt-1.0.3.deb 2.点击下载的deb包进行安装 3.安装完成后,在terminal ...
- HDU 6031 Innumerable Ancestors
树状数组,倍增,枚举,$dfs$序. 对于每一次的询问,可以枚举$B$集合中的所有点,对于每一个点,在树上二分$LCA$,找到最低的更新答案. 判断是否是$LCA$可以搞个$dfs$序,将$A$集合中 ...
- shell sh bash 概念
在shell脚本的开头往往有一句话来定义使用哪种sh解释器来解释脚本.目前研发送测的shell脚本中主要有以下两种方式:(1) #!/bin/sh(2) #!/bin/bash以上两种方式有什么区别? ...
- Maven的安装及修改为阿里云下载依赖
使用JAVA工程管理越来越多的jar包,担心导错了,多导了,漏导了怎么办? 换一个IDE项目后项目会不会出一堆BUG,看的头皮发麻? 自己写的代码放在别人的机器上运行会不会出问题? Maven的强大毋 ...