`
youyu4
  • 浏览: 440511 次
社区版块
存档分类
最新评论

Java设计模式十三: 策略模式(Strategy)

 
阅读更多

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们还可以相互替换。策略模式让算法独立于是用它的客户而独立变化。

应用场景:
多个类只区别在表现行为不同,可以使用strategy模式,在运行时动态选择具体要执行的行为。
需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其他方式来实现。
对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

在网上看到一个鸭子为例的策略模式的文章,说明的是定义了一个鸭子的基类(其中有游泳,叫声和游戏方法),然后有野鸭、红头鸭及橡皮鸭继承这个基类,新的需求是设置鸭子会飞,但是橡皮鸭是不能飞的。解决方案一:基类中加入fly方法,子类都重写,但是这样使得不能飞的鸭子也可以飞了。解决方案二:加入2个接口Fly和Quack,子类来实现他们,但是这样所有需要他们的方法都必须去实现他们。最终解决方案三,用了策略模式,将Fly和Quack单独出来分别设其接口及一系列需要的实现方法,然后在原本的基类中去除quack和fly方法,加入两个新接口的对象及getter/setter, 并加入两个方法分别为performFly和performQuack.(文章见:http://www.cnblogs.com/justinw/archive/2007/02/06/641414.html )

类图:



策略模式的组成:
抽象策略角色:策略类,通常由一个接口或者抽象类实现。
具体策略角色:包装了相关的算法和行为。
环境角色:持有一个策略类的引用,最终给客户端调用。

实例:一网站对所有高级会员提供30%的折扣,对中级会员提供20%的折扣,初级会员10%的折扣,非会员没有折扣
public interface MemberStrategy
{
    public double discount();
}

public class PrimaryMember implements MemberStrategy
{
    @Override
    public double discount()
    {
        return 0.1;
    }
}

public class IntermediateMember implements MemberStrategy
{
    @Override
    public double discount()
    {
        return 0.2;
    }
}

public class AdvancedMember implements MemberStrategy
{
    @Override
    public double discount()
    {
        return 0.3;
    }
}

public class MemberContext
{
    private MemberStrategy memberStrategy = null;

    public MemberContext(final MemberStrategy memberStrategy)
    {
        this.memberStrategy = memberStrategy;
    }

    public double discount()
    {
        return this.memberStrategy.discount();
    }
}

public class Client
{
    public static void main(final String[] args)
    {
        final MemberStrategy strategy = new PrimaryMember();
        final MemberContext memberContext = new MemberContext(strategy);
        System.out.println("primary member discount:" + memberContext.discount());

        final MemberStrategy strategy1 = new IntermediateMember();
        final MemberContext memberContext1 = new MemberContext(strategy1);
        System.out.println("intermediate member discount:" + memberContext1.discount());

        final MemberStrategy strategy2 = new AdvancedMember();
        final MemberContext memberContext2 = new MemberContext(strategy2);
        System.out.println("advanced member discount:" + memberContext2.discount());
    }
}

结果:
primary member discount:0.1
intermediate member discount:0.2
advanced member discount:0.3

优点:
提供了一种替代继承的方法,而且既保持了继承的优点(代码重用),还比继承更灵活(算法独立,可以任意扩展)。
避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。
遵守大部分Grasp原则和常用设计原则,高内聚、低耦合。

缺点:
因为每个具体策略类都会产生一个新类,会增加类的数量。
客户端需要知道所有的策略类,并自行决定用哪一个策略类。

分享到:
评论

相关推荐

    【Java设计模式】(2)策略模式Strategy

    策略模式(Strategy)是软件设计模式中的一种行为模式,它使你能在运行时改变对象的行为。在Java中,策略模式通常涉及定义一系列算法,并将每个算法封装起来,使得它们可以相互替换,同时使得算法的变化独立于使用它...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    Java设计模式是软件工程中的一种最佳实践,它总结了在特定场景下解决常见问题的经验,为程序员提供了可重用的解决方案。本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与...

    Java 设计模式 策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式主要通过定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户而变化。 首先,策略模式的...

    23种java设计模式.pdf

    JAVA 设计模式可以分为三种:创建模式、结构模式和行为模式。 1. 创建模式 创建模式是指在创建对象时使用的模式,包括 Factory(工厂模式)、Singleton(单例模式)、Builder(建造者模式)、Prototype(原型模式...

    java设计模式程序源代码

    Java设计模式是软件工程中的一种最佳实践,它提供了一种在特定情况下解决常见问题的模板。这些模式在软件开发中被广泛使用,因为它们能够使代码更可读、可维护和可扩展。在这个名为"java设计模式程序源代码"的压缩包...

    JAVA设计模式例程-策略模式

    在这个“JAVA设计模式例程-策略模式”的压缩包中,我们可以深入探讨策略模式的原理及其应用。 策略模式的核心思想是定义一系列算法,并将每一个算法封装起来,使它们可以相互替换。策略对象的使用让算法的变化独立...

    JAVA设计模式-chm版

    Java设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时程序员们经常采用的有效方法。这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的...

    JAVA设计模式(十三种)

    在Java中,总共包括十三种设计模式,这些模式可以被划分为三大类:创建模式、结构模式和行为模式。 1. 创建模式: - 工厂模式(Factory):工厂模式是一种最基础的创建型模式,它提供了一种创建对象的最佳方式,...

    JAVA设计模式chm文档

    创建模式: 设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) ...设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor

    Java设计模式 设计模式介绍

    2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之Observer 9、设计模式之Strategy(策略) 10、设计模式之...

    java 策略模式

    策略模式是设计模式的一种,它在Java编程中广泛应用于处理算法的封装和选择。策略模式的核心思想是将算法封装到不同的类中,使得算法的变化独立于使用它的客户端。这种模式可以提供更多的灵活性,使得程序在运行时...

    《Java设计模式》课后答案-刘伟.rar

    《Java设计模式》是刘伟教授的一本关于设计模式的教材,主要面向高等学校的学生和对Java编程有深入兴趣的开发者。设计模式是软件工程中的一种重要思想,它封装了在特定场景下的问题解决方案,可以提高代码的可读性、...

    Java 设计模式-策略模式(Strategy)Android讲解

    首先,策略模式由三个主要组成部分构成:上下文(Context)、策略(Strategy)接口和具体策略(Concrete Strategy)。上下文是使用策略的对象,它维护一个对策略的引用,并调用策略的接口来执行算法。策略接口定义了一组...

    java设计模式期末考试选择题100道

    适合Java设计模式期末考试选择题复习,形式如下: 10.(单选题)Facade(外观)模式的意图是 正确答案: A A.希望简化现有系统的使用方法,你需要定义自己的接口 B.将一个无法控制的现有对象与一个特定借口相匹配。 C....

    java23种设计模式详解+源码(绝对详解)

    在Java编程中,有23种经典的GoF(Gang of Four)设计模式,它们被分为三大类:创建型、结构型和行为型。本资源集合了这些模式的详细解释与源码分析,旨在帮助开发者深入理解和应用设计模式。 1. 创建型模式...

    策略(strategy)模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。 在策略模式中,我们创建表示各种策略的对象和一个行为根据...

    java设计模式PPT

    Java设计模式是软件工程中的一种最佳实践,它是一种在特定情境下解决常见问题的经验总结。这份"java设计模式PPT"资源提供了系统化的学习材料,旨在帮助开发者提升编程思维,理解如何有效地组织代码,提高软件的可...

    java设计模式之策略模式与模板模式

    在Java编程领域,设计模式是解决常见问题的可重用解决方案,它们代表了软件设计的最佳实践。本篇文章将深入探讨两种重要的设计模式:策略模式和模板模式。通过理解这两种模式,开发者可以更好地组织代码,提高代码的...

    Java二十三种设计模式

    ### Java二十三种设计模式详解 #### 引言:设计模式的重要性 设计模式是软件工程领域的一种重要概念,它提供了一系列解决常见问题的模板。在Java编程中,掌握设计模式可以提升代码的质量、可读性和可维护性。下面...

Global site tag (gtag.js) - Google Analytics