C#学习笔记-策略模式】的更多相关文章

策略模式,与模板模式一样,都是为了将接口和算法实现解耦,但策略模式更主要是整体算法的替换,而模板模式主要是流程一致,部分算法的替换. 个人理解为,一般算法替换,使用策略模式,当算法流程一致,可以提取为模板模式.实际中,策略模式,使用组合方式,将算法实现脱离上下文,上下文可以依据需要,使用不同的算法实现子类,效果比继承更好.…
策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换(相互替换:表现为它们具有相同的目标和意图). 策略模式的目的是讲算法的使用与算法的实现分离开来. 一个基于策略模式的程序至少由两部分组成.第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程.第二个部分是环境类Context,Context接受客户的请求,随后把请求委托给某一个策略类.要做到这点,说明Context中要维持对某个策略对象的引用. JavaScript版本的策略模式: 例子:根据绩效等…
续上一篇  <Java 模拟 Comparable接口> 一.Teacher类及Student类的比较大小方式是不固定的,比如老师除了比较职称外,还可比较工龄大小,年龄大小等.则定义Comparator接口,不同比较方法去定义为一个xxComparator类,去实现Comparator接口,Teacher类及Student类引用具体的xxComparator比较器,则可实现灵活的比较方式切换.此则为策略模式的一个例子:当我要比较大小的时候,先定义一个比较器Comparator,但具体的比较由具…
题目:做一个商场收银的小程序,可能会出现的情况包括:正常收费,九折优惠,七折优惠,满300减50等各种不同随时会变化的优惠活动. 界面如下: 分析: 首先我们对于收钱写一个父类CashSuper.这个父类是用来包含其他的各种收费方式的:正常收费.七折优惠.八折优惠.九折优惠.满300减50.满400减70.满500减100等情况,其中折扣优惠虽然不同,但是类型相似,满减优惠同理,故此我们可以将正常收费.折扣优惠与满减优惠分别划分为三个不同的类:CashNormal.CashRebate.Cash…
一.情况 1.目标:要在专门用于排序数据的DataSorter.java中实现对所有A类,B类,C类,D类等等的排序 2.初步想法:DataSorter.java的代码如下 public class DataSorter { public static void sort(A a){ } public static void sort(B a){ } public static void sort(C c){ } //................... } 3.这样会造成DataSorter…
<Head first设计模式>学习笔记 – 迭代器模式 代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个好消息!现在我们可以在同一个地方,享用煎饼屋美味的煎饼早餐,和好吃的餐厅午餐了.但是,好像有一点小麻烦:新的餐厅想用煎饼屋菜单当作早餐的菜单,使用餐厅的菜单当做午餐的菜单,大家都同意了这样实现菜单项.但是大家无法同意菜单的实现.煎饼屋使用ArrayList记录他的菜单项,而餐厅使用的是数组.他们两个都不愿意改…
转载地址:http://www.cnblogs.com/zhili/p/StragetyPattern.html 一.引言 本文要介绍的策略模式也就是对策略进行抽象,策略的意思就是方法,所以也就是对方法的抽象,下面具体分享下我对策略模式的理解. 二.策略者模式介绍 2.1 策略模式的定义 在现实生活中,策略模式的例子也非常常见,例如,中国的所得税,分为企业所得税.外商投资企业或外商企业所得税和个人所得税,针对于这3种所得税,针对每种,所计算的方式不同,个人所得税有个人所得税的计算方式,而企业所得…
策略模式: --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3884781.html "谢谢-- 为什么使用:策略模式主要用于有很多不同的方式来解决同一个问题的情景.如:文件的保存:可保存成txt,也可保存成xml.另外压缩文件.商场的促销策略等是类似的 如何使用:需要定义一个接口或者抽象类来表示各种策略的抽象,由于在选择适当的策略上有些不方便,需要不断地判断需要的类型,因此需要用简单工厂方法来实现判断过程 例子: 用策略模式实现图…
一.策略模式定义: 定义一些列的算法/规则,将它们封装起来,使得它们可以互相替换/组合使用.其目的在于将算法/规则封装起来,将算法/规则的使用与实现分离出来. 通过策略模式,可以减少算法计算过程中大量的if-else分支,并提高复用性. 一个策略模式的程序至少由两部分组成,一个是一组策略类,策略类封装了具体算法,并负责具体的实现过程:第二个部分是环境类context,context接受客户的请求,随后将请求委托给具体的某一个策略类.context中需要有一个变量来保存对对象的引用. 二.java…
在软件开发过程中.应用程序可能会依据不同的情况作出不同的处理. 最直接的解决方式是将这些全部可能发生的情况全都考虑到.然后使用if... ellse语句来做状态推断来进行不同情况的处理. 可是对复杂状态的推断就显得"力不从心了". 随着添加新的状态或者改动一个状体(if else(或switch case)语句的增多或者改动)可能会引起非常大的改动,而程序的可读性,扩展性也会变得非常弱.维护也会非常麻烦. 那么我就考虑仅仅改动自身状态的模式.----题记 设计模式 状态模式:同意对象在…
模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以详细方法以及详细构造函数的形式实现.然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类能够以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意. 设计模式 模板方法模式:在一个方法中定义一个算法的框架,而将一些步骤延迟到子类中.模板方法使得子类能够在不改变算法结果的情况下,又一次定义算法中的某些步骤. 模板就是一个方法.这种方法将算法定义成一组步骤.当中的不论什么步骤都能够是抽象的,由子类负责实现.这样…
访问者模式,通过Visitor的注入,为Element扩展了方法实现.虽然避免了Element不用修改即可修改,但却破坏了类的封装性,同时,一旦变更就需要增加子类,在子类方法中调用基类方法,然后再使用Visitor的方法来扩展. 个人理解,Visitor有点类似于策略模式中的算法,都是通过组合的方法变换原有实现.但访问者的变换粒度是具体函数内部要实现扩展,而策略模式主要是算法实现的替换.…
桥接模式的目的是在设计初,就将实现与接口分离,在以后实现发生变化时,只需要改变传递的实现对象,在保持接口一致的情况,达到实现的变更. 在OperationInterface中就调用实现的方法imp.Operation() PS: 桥接模式与策略模式(Strategy)类图上很相似,区别在于: 1.桥接模式接口与实现都可以变化,互不影响,外部关心接口以及采用的实现.比如接口类统一是绘图操作,实现类分为桌面A和手机B,二者的实现是不同的:当A增加方法时,同时可以为接口类的子类“A接口类”增加相应接口…
策略模式 策略模式的定义是:定义了一系列的算法,把它们一个个的封装起来,并且使它们可相互替换,让算法可以独立于使用它的客户而变化. 设计原则是:把一个类中经常改变或者将来可能会经常改变的部分提取出来作为一个接口,然后在使用类中包含这个接口的实例,这样使用类的对象就可以随意调用实现了这个接口的类行为. 在策略模式中有如下几个角色: 环境角色(Context): 此角色中实现了对策略角色的引用和使用. 抽象策略角色:此角色通常由抽象类或接口来实现,定义了,所以具体策略角色的行为. 具体策略角色:此角…
//---------------------------15/04/28---------------------------- //Strategy 策略模式----对象行为型模式 /* 1:意图: 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.使算法可独立于使用它的客户而变化. 2:别名: 政策(Policy) 3:动机: 4:适用性: 1>许多相关的类仅仅是行为有异.策略提供了一种用多个行为中的一个行为来配置一个类的方法. 2>需要使用一个算法的不同变体. 3>算…
模型-视图-控制器(MVC模式)是一种很经典的软件架构模式.在UI框架和UI设计思路中扮演着很重要的角色.从设计模式的角度来看,MVC模式是一种复合模式.它将多个设计模式在一种解决方式中结合起来,用来解决很多设计问题.MVC模式把用户界面交互分拆到不同的三种角色中,使应用程序被分成三个核心部件:Model(模型).View(视图).Control(控制器).----题记 设计模式 复合模式:结合两个或以上的模式,组成一个解决方式,解决一再发生的一般性问题.如MVC和Model 2 模型-视图-控…
解释器模式,其实就是编译原理中的语法解释器,如果用在项目中,可以用于实现动态脚本的解析,也就是说项目可以支持用户脚本扩展. 但实际上,这种运行时解释,效率很慢,如果不是很需要的话,不建议使用. 一种简单实现: Context是上下文场景,比如做一个计算器,那这个Context可以作为一个Calculator类,可以在构造函数中用于接受待解析的表达式(如 a+b-c),以及执行相应的解释. Expression代表不同的symbol的操作,比如: 1.+对应的Expression,操作是:将+的左…
什么是归档模式 Oracle数据库有联机重做日志,这个日志是记录对数据库所做的修改,比如插入,删除,更新数据等,对这些操作都会记录在联机重做日志里.一般数据库至少要有2个联机重做日志组.当一个联机重做日志组被写满的时候,就会发生日志切换,这时联机重做日志组2成为当前使用的日志,当联机重做日志组2写满的时候,又会发生日志切换,去写联机重做日志组1,就这样反复进行.如果数据库处于非归档模式,联机日志在切换时就会丢弃.而在归档模式下,当发生日志切换的时候,被切换的日志会进行归档.比如,当前在使用联机重…
Dispose模式是.NET中很基础也很重要的一个模式,今天重新复习一下相关的东西并记录下来. 什么是Dispose模式? 什么时候我们该为一个类型实现Dispose模式 使用Dispose模式时应该注意什么? 怎样实现一个Dispose模式? Dispose模式的例子 什么是Dispose模式? 要知道什么是Dispose模式必须先了解两个概念:资源和GC的基本原理.资源指的是一些类似于Windows句柄,数据库连接的非内存的一些本地资源,这些资源无法被运行时本身管理,需要程序员自己去申请和释…
JQuery插件开发http://www.cnblogs.com/damonlan/archive/2012/04/06/2434460.html github教程:https://github.com/i5ting/How-to-write-jQuery-plugin jQuery插件开发 一般来说,jQuery插件的开发分为两种:一种是挂在jQuery命名空间下的全局函数,也可称为静态方法:另一种是jQuery对象级别的方法,即挂在jQuery原型下的方法,这样通过选择器获取的jQuery对…
一.概述 命令模式 二.代码 1.Client.java public class Client { public void request(Server server){ server.addCommand(new TextCommand()); server.addCommand(new ImageCommand()); server.doSomething(); } } 2.Server.java public class Server { private List<Command> c…
一.概述 1.桥接模式的应用情况:(1)两个维度扩展(2)排列组合 二.代码 1.Gift.java public class Gift { protected GiftImpl giftImpl; } 2.GiftImpl.java public class GiftImpl { } 3.WarmGift.java public class WarmGift extends Gift { public WarmGift(GiftImpl giftImpl) { //调用父类的giftImpl…
设计模式 工厂模式:定义一个创建对象的接口,但由子类决定要实例化的是哪一个.工厂方法让类把实例化推迟到子类. 所谓的"决定",并非指模式同意子类本身在执行时做决定,而是指在编写创建者类时.不须要知道实际创建的产品是哪一个. 选择了使用这个子类,就自然的决定了实际创建的产品是什么. 抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族.而不须要指定详细类. 抽象工厂的任务时定义一个负责创建一组产品的接口.这个接口内的每一个产品都负责创建一个详细产品.使用工厂方法. 设计原则 (1)多…
迭代模式设置共生死亡,一般来说.我们只是想实现一个集,我们需要的同时提供这个集合的迭代器,喜欢java中间Collection.List.Set.Map等,这些集合都有自己的迭代器.假如我们要实现一个这种新的容器,当然也须要引入迭代器模式.给我们的容器实现一个迭代器.----题记 设计模式 迭代器模式:提供一种方法顺序訪问一个聚合对象中的各个元素,而不暴露其内部的表示. 把游走的任务放在迭代器上.而不是聚合上. 这样简化了聚合的接口和实现.也让责任各得其所. 组合模式:同意你将对象组合成树形结构…
迭代器模式,使用很多,但是很少实现.常用的集合都支持迭代器. 集合中的CreateIterator()可用于创建自己的迭代器,在里面通过调用迭代器的构造函数Iterator(Aggregate)来绑定自己到迭代器中,如果不使用此方法,也可以在场景中直接new Iterator(Aggregate)来得到一个迭代器.迭代器中的接口First()等其实本质都是操作引用的Aggregate对象实现的.好处在于不用集合自己来写迭代方法,一是可以复用迭代器,减少每种集合都去造轮子,二是看起减少了集合的接口…
命令模式,将具体操作Receiver封在Command中,调用类只需要知道Command即可.…
备忘录模式,可以将当前状态保存,并随时恢复. Originator存在状态state,当需要保存此状态时,通过CreateMemento创建一个备忘录对象Memento保存此状态:而需要恢复相应状态时,使用RestoreMemento(memento)将相应的状态恢复回来.…
状态模式,主要是用于存在大量case判断的操作执行,同时这些case依赖于对象的状态,那么就可以将大量的case判断封装为独立的类. Context: -state,当前状态对象. ChangeState(state),切换state对象. OperationInterface(),调用State->OperationInterface. OperationChangeState(),调用State->OperationChangeState(Context). State: ChangeSt…
模板模式,主要是利用多态来实现具体算法和父类逻辑的松耦合.父类中TemplateMethod内部定义了相应的算法操作顺序,子类负责实现相应的具体实现. 举例: 项目中曾遇到过一个需求,叫做高级价格体系.它对外的调用接口一致,只是在不同的应用场景下(比如普通消费和会员卡消费)计算方法有差异,简化计算流程: 1.初始化相应数据A() 2.执行价格计算B() 3.计算完成后的提示C() 等. 父类中的接口函数Run()将此顺序固定为: Run() { A(); B(); C(); } 不同场景下的子类…
代理模式,主要是逻辑和实现解耦.具体逻辑如何,由代理Proxy自己来设计,我们只需要把逻辑Subject交给代理即可. 主要应用场景,包括创建大开销对象时,使用代理来慢慢创建:远程代理,如网络不确定时,创建一个本地代理来操作网络,完成时通知本地其他操作(有点回调的意思):控制访问,通过代理增加一些逻辑来进行相应的校验操作等.…