策略模式相关知识
-
策略模式策略模式 > 定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换,就叫做策略模式。 > 策略模式与状态模式非常相似,都是为了避免大量堆砌条件语句,但在使用意图上却迥然不同:策略模式中的各个策略对象是没有任何关联的平行语句,使用者可以随心所欲选择某一种或某几种来达到不同的效果。 应用场景 > 比如我们现在需要编写一个表单校验的功能,以往的代码可能是下面这样: 例子: 价格: > 上面这种比较常见的代码编写方式有几个缺点,首先是堆砌了过多的条件语句,其
-
策略模式一 简介1.定义策略模式属于对象的行为模式.策略模式能在运行时改变软件的算法行为.如何实现策略模式根据情况而定,但其主要思想是定义一个通用的问题,使用不同的算法来实现,然后将这些算法都封装在一个统一接口的背后.2.使用场景针对一个对象,其行为有些是固定的不变的,有些是容易变化的,针对不同情况有不同的表现形式。那么对于这些容易变化的行为,我们不希望将其实现绑定在对象中,而是希望以动态的形式,针对不同情况产生不同的应对策略。那么这个时候就要用到策略模式了。简言之,策略模式就是为了应对对象中复杂多变的行为而产生的。二 策略模式的结构图2.1三 lambda实例下面以文件压缩算法为例我们提供各种压缩文件的方式,实现一个通用的Compressor 类,能以任何一种算法压缩文件.首先,为我们的策略定义API(图3.1),称之为CompressionStrategy,每一种文件压缩算法都要实现该接口.该接口有一个compress 方法,接受并返回一个OutputStream对象,返回的就是压缩后的Output
-
理解javascript中的策略模式策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。 使用策略模式的优点如下: 优点: 策略模式利用组合,委托等技术和思想,有效的避免很多if条件语句。 策略模式提供了开放-封闭原则,使代码更容易理解和扩展。 策略模式中的代码可以复用。 使用策略模式计算奖金 下面的demo是
-
每天一个设计模式·策略模式策略模式原文地址 更多《设计模式系列教程》 更多免费教程 0. 项目地址 作者按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascript(靠这吃饭)和python(纯粹喜欢)两种语言实现。诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) 本节课代码 《每天一个设计模式》地址 1. 什么是策略模式? 策略模式定义:就是能够把一系列“可互换的”算法封装起来,并根据用户需求来选择其中一种。 策略模式实现的核心就是:将算法的使用和算法的
策略模式相关课程
策略模式相关教程
- 策略模式 大家一定都使用过电子地图。在地图中输入出发地和目的地,然后再选取你的出行方式,就可以计算出最优线路以及预估的时长。出行方式有驾车、公交、步行、骑行等。出行方式不同,计算的线路和时间当然也不同。其实出行方式换个词就是出行策略。而策略模式就是针对此类问题的设计模式。生活中这种例子太多了,比如购物促销打折的策略、计算税费的策略等等。相应的策略模式也是一种常用的设计模式。本节我们会以电子地图为例,比较工厂模式和策略模式,讲解策略模式的原理。最后结合工厂模式改造策略模式的代码实现,以达到更高的设计目标。
- 2. 策略模式 策略模式是软件运行时,根据实际情况改变软件的算法行为。常见的策略模式就是文件压缩软件,通常一个压缩软件可以支持多种压缩算法如 zip 、gzip、rar 等,通过策略模式可以让压缩软件根据我们具体的操作来实现不同的压缩算法。我们来看一个压缩数据的策略模式的例子://定义压缩策略接口 public interface CompressionStrategy{ public OutputStream compress(OutputStream data) throws IOException; } //gzip压缩策略 public class GzipStrategy implements CompressionStrategy{ @Override public OutputStream compress(OutputStream data) throws IOException { return new GZIPOutputStream(data); } } //zip压缩策略 public class ZipStrategy implements CompressionStrategy{ @Override public OutputStream compress(OutputStream data) throws IOException { return new ZipOutputStream(data); } } //在构造类时提供压缩策略 public class Compressor{ private final CompressionStrategy strategy; public Compressor(CompressionStrategy strategy){ this.strategy = strategy; } public void compress(Path inFiles, File outputFile) throws IOException{ try(OutputStream outputStream = new FileOutputStream(outputFile)){ Files.copy(inFiles,strategy.compress(outputStream)); } } } //使用具体的策略初始化压缩策略 //gzip策略 Compressor gzipCompressor = new Compressor(new GzipStrategy()); //zip策略 Compressor zipCompressor = new Compressor(new ZipStrategy());以上就是一个完整的 zip 和 gzip 的压缩策略。现在我们用 Lambda 表达式来优化初始化压缩策略//使用构造器引用优化初始化压缩策略 //gzip策略 Compressor gzipCompressor = new Compressor(GzipStrategy::new); //zip策略 Compressor zipCompressor = new Compressor(ZipStrategy::new);
- 4. 策略模式适用场景 当存在多种逻辑不同,但属于同一类型的行为或者算法时,可以考虑使用策略模式。以此来消除你算法代码中的条件判断。同时让你的代码满足多种设计原则。很多时候,工厂模式和策略模式都可以为你解决同类问题。但你要想清楚,你想要的是一个对象,还是仅仅想要一个计算结果。如果你需要的是一个对象,并且想用它做很多事情。那么请使用工厂模式。而你仅仅想要一个特定算法的计算结果,那么请使用策略模式。策略模式属于对象行为模式,而工厂属于创建型模式。策略模式和工厂模式对比如下:
- 1. 实现策略模式 接下来我们就以电子地图为例,讲解如何用策略模式实现。不过先别着急,上一节我们学习了工厂模式,看起来电子地图也可以用工厂模式来实现。所以我们先来看看用工厂模式如何实现。下面的例子为了方便展示,接口入参只有出行方式,省略了出发地和目的地。计算结果是预估时长。
- 1.2 策略模式实现电子地图 使用策略模式,需要增加一个策略上下文类(Context)。Context类持有策略实现的引用,并且对外提供计算方法。Context类根据持有策略的不同,实现不同的计算逻辑。客户端代码只需要调用 Context 类的计算方法即可。如果想切换策略实现,那么只需要改变Context类持有的策略实现即可。TravelStrategy 接口和实现的代码不变,请参照上面工厂模式中给出的代码。其他代码如下:StrategyContext 类:public class StrategyContext { private TravelStrategy strategy; public StrategyContext(TravelStrategy strategy) { this.strategy = strategy; } public int calculateMinCost(){ return strategy.calculateMinCost(); }StrategyContext 持有某种 TravelStrategy 的实现,它对外提供的calculateMinCost 方法,实际是对 TravelStrategy 做了一层代理。想切换不同算法的时候,只需更改 StrategyContext 持有的 TravelStrategy 实现。TravelService 对外提供计算方法,代码如下:public class TravelService { private StrategyContext strategyContext; public int calculateMinCost(String travelWay){ if ("selfDriving".equals(travelWay)) { strategyContext = new StrategyContext(new SelfDrivingStrategy()); } if ("bicycle".equals(travelWay)) { strategyContext = new StrategyContext(new BicycleStrategy()); } else { strategyContext = new StrategyContext(new PublicTransportStrategy()); } return strategyContext.calculateMinCost(); }}可以看到 TravelService 中只会和 Context 打交道,初始化 Context 时,根据不同的出行方式,设置不同的策略。看到这里你是不是会有疑问,使用工厂模式消除了客户端代码的条件语句。怎么使用策略模式,条件语句又回来了?别急,我们继续向下看。最后我们看一下策略模式的类图:
- 3. 策略模式与工厂模式结合使用 针对第一个缺点。我们可以通过策略模式与工厂模式结合使用来改进。通过进一步封装,消除客户端代码的条件选择。我们修改一下StrategyContext类,代码如下:public class StrategyContext { private TravelStrategy strategy; public StrategyContext(String travelWay) { if ("selfDriving".equals(travelWay)) { strategy = new SelfDrivingStrategy(); } if ("bicycle".equals(travelWay)) { strategy = new BicycleStrategy(); } else { strategy = new PublicTransportStrategy(); } } public int calculateMinCost(){ return strategy.calculateMinCost(); }}可以看到我们初始化的逻辑和工厂的逻辑很相似。这样条件判断就提炼到 Context 类中了。而客户端代码将会简洁很多,只需要在初始化 StrategyContext 时,传入相应的出行方式即可。代码如下:public class TravelService { private StrategyContext strategyContext; public int calculateMinCost(String travelWay){ strategyContext = new StrategyContext(travelWay); return strategyContext.calculateMinCost(); }}改进后,客户端代码现在已经完全不知道策略对象的存在了。条件判断也被消除了。其实很多时候我们都是通过搭配不同设计模式来达到我们的设计目标的。策略+工厂模式类图如下:
策略模式相关搜索
-
c 正则表达式
c string
c 编程
c 程序设计
c 程序设计教程
c 多线程编程
c 教程
c 数组
c 委托
c 下载
c 线程
c 语言
caidan
cakephp
call
calloc
calu
camera
caption
case语句