设计模式之策略模式

xiaojimanman xiaojimanman     2022-12-03     414

关键词:

目录

 

策略模式介绍

鸭子事例

简单的鸭子

会飞的鸭子

橡皮鸭登场

噩梦开始

策略模式鸭子


策略模式介绍

策略模式就是将功能定义为算法簇,分别封装起来,让他们之间可以替换,此模式可以让算法的变化独立于使用算法的客户。

 

鸭子事例

我们通过一个事例的发展来理解策略模式的好处(该事例来源于《Head First》)

简单的鸭子

对于鸭子,最初只定义一个鸭子的超类,所有的鸭子都会呱呱叫(quack),也会游泳(swim),对于鸭子的外观分别有其子类去实现,类图如下:

 

会飞的鸭子

随着业务的发展,需要给鸭子加上飞行的技能,因此需要给超类添加飞行(fly)技能,类图如下:

 

橡皮鸭登场

突然有一天,需要添加一个橡皮鸭,,但是橡皮鸭不会呱呱叫(quack),也不会飞(fly),因此我们需要对其进行覆盖,类图如下:

 

噩梦开始

对于这种继承的形式,每当有一种新鸭子出现时,就需要被迫检查超类中的方法,确认是否需要将其进行覆盖,无穷无尽的噩梦。

对于这种,是否可以将呱呱叫(quack)和飞行(fly)定义为接口,每种鸭子去实现对应的接口呢,基于这种思考,设计如下类图:

 

策略模式鸭子

对于上述用接口实现的鸭子好像解决了类继承的噩梦,但是接口不具有实现代码,所有继承接口无法达到代码的复用,也就意味着你修改某个行为,要将所有子类中的行为都做相关的修改,这又是另一个噩梦的开始,而策略模式就很好的解决了这两个噩梦。

首先我们将鸭子变化的行为呱呱叫(quack)和飞行(fly)抽取出来,组成一个算法簇,然后为不同的鸭子赋予不同的行为能力,具体类图如下:

 

对于performFly和performQuack的实现如下:

public void performFly() 
  flyBehavior.fly();


public void performQuack() 
  quackBehavior.quack();

对于每种鸭子,我们可以在其构造方法中给其指定默认的呱呱叫(QuackBehavior)和飞行(FlyBehavior)能力,如果需要对其能力进行变更,通过setQuackBehavior(QuackBehavior quackBehavior)对其呱呱叫或setFlyBehavior(FlyBehavior flyBehavior)对其飞行能力进行变更,如果后续又有新的呱呱叫(QuackBehavior)或飞行(FlyBehavior)能力,在新添加一个呱呱叫(QuackBehavior)或飞行(FlyBehavior)能力,需要该能力的鸭子直接通过构造方法或setQuackBehavior(QuackBehavior quackBehavior)、setFlyBehavior(FlyBehavior flyBehavior)添加新的能力。

设计模式之策略模式

策略模式属于对象行为型的设计模式定义:封装了一些列算法,它们之前可以相互替换,此模式使得算法的改变,不会影响到使用它们的客户端  策略模式有以下3个角色组成抽象策略类:所有策略类的父类,为所支持的... 查看详情

《设计模式之禅》之策略模式

一、策略模式的定义策略模式是一种比较简单的模式,也叫做政策模式,其定义如下:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式使用的是面向对象的继承和多态机制,我们看看策略模式的三个... 查看详情

设计模式之策略模式

1、定义  策略模式属于对象的行为模式。其用意是针对一组算法,将每一组算法封装到具有共同接口的独立子类中,从而可以使得他们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。2、策略模式... 查看详情

设计模式之策略模式

...,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。策略对象改变context对象的执行算法。介绍意图... 查看详情

015设计模式之策略模式

抽象策略角色:策略类,通常由一个接口或者抽象类实现。-具体策略角色:包装了相关的算法和行为。-环境角色:持有一个策略类的引用,最终给客户端调用。 #pragmaonce//策略接口(纯虚函数)classIStrategypublic: IStrategy() virtual~IStrate... 查看详情

大话设计模式之策略模式

策略模式  定义了一系列的算法,分别封装起来,让他们之间可以互相替换。此模式让算法的改变不会影响到使用算法的客户。  在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对... 查看详情

设计模式之策略模式

  软件工程师都会学习设计模式,设计模式可以说是前人智慧与经验的结晶,虽然不是哪里都用得到,但是在合适的地方使用合适的设计模式,能够带来巨大的收益。我通过学习《headfirst设计模式》,逐渐掌握这些设计方法,... 查看详情

java设计模式之策略模式

    策略模式属于对象的行为模式,策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,策略模式让算法独立于使用它的客户而独立变化。策略模式使这些算法在客户端调用它们... 查看详情

java设计模式之策略模式

...此模式让算法的变化,不会影响到使用算法的客户(大话设计模式)。策略模式UML图      策略模式代码   古代的各种计谋都是一种策略,这次我们的例子就拿其中一种离间计来写的,理解起来非常容易,代码... 查看详情

设计模式之策略模式20170720

行为型设计模式之策略模式:一、含义策略模式是一种比较简单的模式,也叫做政策模式,其定义如下:定义一组算法(可抽象出接口),将每个算法都封装起来,并且使它们之间可以互换(定义一个类实现封装与算法切换) 二、... 查看详情

设计模式之-策略模式(strategypattern)(代码片段)

...,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。策略对象改变context对象的执行算法。 C++实... 查看详情

设计模式之策略模式(代码片段)

设计模式之策略模式  策略模式(StraregyPattern)是一种比较简单的模式,也叫政策模式(PolicyPattern),定义如下:Defineafamilyofalgorithms,encapsulateeachone,andmaketheminterchangeable.(定义一组算法,将每个算法都封装起来,并... 查看详情

设计模式之策略模式

目录 策略模式介绍鸭子事例简单的鸭子会飞的鸭子橡皮鸭登场噩梦开始策略模式鸭子策略模式介绍策略模式就是将功能定义为算法簇,分别封装起来,让他们之间可以替换,此模式可以让算法的变化独立于使用算法... 查看详情

设计模式之策略模式

设计模式之策略模式Jul23,2015策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。正文在理解策略模式之前,我们先来一个例子,一般情况下,如果我们要做数... 查看详情

java设计模式之策略模式

1.策略模式的介绍  策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。简单的... 查看详情

设计模式:helloworld之策略模式

一.概述策略模式定义了算法族,分别封装起来,让他们可以互相替换,此模式让算法的变化独立于使用算法的客户。策略模式的三要素:抽象策略角色:策略类,通常由一个接口或者抽象类实现。具体策略角色:包装了相关的... 查看详情

《设计模式之禅》--策略扩展:策略枚举

接上篇《设计模式之禅》--代理扩展:动态代理需求:加减法计算publicenumCalculator{//加法运算ADD("+"){publicintexec(inta,intb){returna+b;}},//减法运算SUB("-"){publicintexec(inta,intb){returna-b;}};Stringvalue="";//定义成员值类型privateCalculator(S 查看详情

设计模式之桥梁模式和策略模式的差别

桥接(Bridge)模式是结构型模式的一种,而策略(strategy)模式则属于行为模式。下面是它们的UML结构图。桥梁模式:策略模式:在桥接模式中,Abstraction通过聚合的方式引用Implementor。举一个样例:策略模式:我要画圆。要实心圆,... 查看详情