策略模式简介
最近在学习java设计模式,在看head first 设计模式。相对于网络上的一些讲解用词比较专业的博客来说,这本书从小例子出发一步一步的将程序设计的思路生动灵活的讲解,比较适合初级开发程序员。
这本书讲的第一个设计模式就是策略模式。
java经典设计模式包括了3大类:1、创建型模式。2、结构型模式。3、行为型模式。策略模式属于行为型模式。
策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
在此类图中就是策略模式中的关系(图是偷来的)
在策略模式中我们需要有
抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
环境(Context)角色:持有一个Strategy的引用。
由于环境角色有很多,它们都需要用到了抽象策略角色(Strategy)中的方法,而这些方法由于角色不同而有着不同的具体的策略(ConcreteStrategy)。 将这些不同的具体策略单独分出来,增加来可复用性。
在我的例子中设计来一个flybehaviour接口(抽象策略角色),
//抽象策略类 public interface FlyBehaviour { public void fly(); }
实现该接口的有两个方法(也就是具体策略角色),分别是飞的高的(flyhigh)和飞的低的(flylow),
//具体策略类 public class FlyHigh implements FlyBehaviour{ //在fly中实现FlyHigh的策略,如果是比较复杂算法,复用起来比较方便 @Override public void fly() { System.out.println(" fly high fly high"); } }
//具体策略类 //根据不同的策略类,实现不同的业务 public class FlyLow implements FlyBehaviour { @Override public void fly() { System.out.println("fly low fly low"); } }而我们的环境角色有小鸟、老鹰、甚至还可以有秃鹫。那么我们知道老鹰和秃鹫就飞的很高我们就可以在老鹰和秃鹫对象中实例飞的高的的类(flyhigh),在小鸟角色中实例化飞的低的类(flylow)。
//环境角色类 public class Bird extends Animal{ //在构造函数 实例化飞行飞的低的行为 public Bird(){ flyBehaviour=new FlyLow(); } //将飞行飞的行为委托给dis public void disPlay(){ flyBehaviour.fly(); } }
public class Eagle extends Animal { //构造函数中实例飞行飞的高的行为 public Eagle(){ flyBehaviour=new FlyHigh(); } //将老鹰的飞行的行为委托给display方法 public void display(){ flyBehaviour.fly(); } }
我们使用调用具体的实体的时候,我们就可以直接调用display方法,来调用不同的具体的策略方法。
我觉得策略模式的使用,主要是在多个具体的环境角色都包含某个共同方法(例如这里的鸟类都要飞),而这些方法的具体内容不同(有的飞的高、有的飞的低),如果哪天飞的高的方法中的策略有调整,我们只需修改策略类中的方法就行,不需要一个个到实体类中修改,便于我们对系统的维护与拓展。
而且我们可以发现这些类的具体行为都是唯一的,只有飞的高或者飞的低。这就是运行时策略的唯一性。
策略模式的优点
(1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
(2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。
策略模式的缺点
(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法 的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
(2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。
参考书籍:Head First设计模式。
参考博客:http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html
相关推荐
**策略模式**是Java设计模式中的行为模式之一,它的核心思想是定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换。这种模式让算法的变化独立于使用算法的客户。在Java编程中,策略模式常用于处理那些...
Java 设计模式之策略模式与状态模式 策略模式是 Java 中的一种设计模式,它主要用于解决系统与第三方接口进行数据交互的问题。当系统需要与多种格式的数据进行交互时,使用策略模式可以很好地解决这个问题。例如,...
在Java编程领域,设计模式是解决常见问题的可重用解决方案,它们代表了软件设计的最佳实践。本篇文章将深入探讨两种重要的设计模式:策略模式和模板模式。通过理解这两种模式,开发者可以更好地组织代码,提高代码的...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式主要通过定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户而变化。 首先,策略模式的...
策略模式是一种设计模式,它允许在运行时动态选择和切换不同的算法或策略,而不影响到使用这些算法的客户端代码。这种模式将策略的定义和使用分开,使得算法的变化不会影响到调用者,同时提供了更好的可扩展性。 在...
Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式主要通过定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户而变化。 首先,策略模式的...
在这个“java设计模式-策略模式”的示例中,我们将深入探讨如何使用策略模式来实现一个简单的超市促销系统。 策略模式的核心思想是定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换。这使得算法的...
Java设计模式之策略模式定义与用法详解 策略模式是一种行为设计模式,它定义了一系列算法,把他们一个一个封装起来,并且使他们可以相互替换。策略模式的主要优点是实现了上下文和具体策略的松耦合关系,使得上下文...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式通常涉及定义一系列算法,将每个算法封装到具有共同接口的独立类中,使得它们可以相互替换。这样做的主要好处是算法的变化不会影响...
Java设计模式是面向对象编程领域中的重要概念,它是一套被广泛接受并实践的解决软件设计问题的经验总结。设计模式并非具体的代码或库,而是一种在特定情境下为了解决常见问题而制定的通用解决方案的描述。它们描述了...
Java设计模式之策略模式 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换。策略模式的定义是:定义一组算法,将每个算法都封装起来,并且使他们之间可以...
策略模式是Java设计模式中的一种非常重要的模式,它可以让算法独立于使用它的客户而独立变化。策略模式定义了一系列的算法,并将每一个算法封装起来,使它们还可以相互替换。 策略模式的组成部分: 1. 抽象策略...
《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...
在这个“JAVA设计模式例程-策略模式”的压缩包中,我们可以深入探讨策略模式的原理及其应用。 策略模式的核心思想是定义一系列算法,并将每一个算法封装起来,使它们可以相互替换。策略对象的使用让算法的变化独立...