`
zhangwei_david
  • 浏览: 474742 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java 设计模式-策略模式(Strategy Pattern)

 
阅读更多

       策略模式(Strategy Pattern)属于对象行为模式。其作用是针对一组算法,将每个算法封装到具有共同接口的独立类中,从而使它们可以相互替换。

        策略模式的意图是将可以互换的方法封装在各自的对立类中并且让每个方法都实现一个共同的接口。

       策略模式(Strategy pattern)中涉及到三个角色:

  • 环境(Context)角色:持有一个Strategy类的引用的类
  • 抽象策略(Abstract Strategy)角色:这是一个抽象角色,通常由一个接口或者抽象类实现,此角色定义了所有具体策略对象所需要的接口。
  • 具体策略(Concrete Strategy)角色:包装了相关算法的或行为的具体实现类。

     有这样一个需要,在一个项目中,如果用户的认证情况不符合要求需要发送消息提醒用户需要在多长时间内完成认证。在最后今天需要每天发送一次提醒,而有的消息不是那么紧急值需要每周发送一次。还有一些特殊场景需要个性化定制。
这样我们可以通过策略模式实现。

      

/**
 *
 * @author zhangwei_david
 * @version $Id: SendStrategy.java, v 0.1 2014年11月6日 下午8:49:09 zhangwei_david Exp $
 */
public interface SendStrategy {

    public boolean send(Message msg);

}

/**
 *
 * @author zhangwei_david
 * @version $Id: OnceAweek.java, v 0.1 2014年11月6日 下午9:04:59 zhangwei_david Exp $
 */
public class OnceAweek implements SendStrategy {

    /**
     * @see com.cathy.demo.pattern.strategy.SendStrategy#send(com.cathy.demo.pattern.strategy.Message)
     */
    public boolean send(Message msg) {
        System.out.println("每周一次");
        return true;
    }

}

/**
 * 每天一次
 * @author zhangwei_david
 * @version $Id: OnceADay.java, v 0.1 2014年11月6日 下午8:53:07 zhangwei_david Exp $
 */
public class OnceADay implements SendStrategy {

    /**
     * @see com.cathy.demo.pattern.strategy.SendStrategy#send(com.cathy.demo.pattern.strategy.Message)
     */
    public boolean send(Message msg) {
        System.out.println("每天一次");
        return true;
    }

}

/**
 *
 * @author zhangwei_david
 * @version $Id: Message.java, v 0.1 2014年11月6日 下午8:50:45 zhangwei_david Exp $
 */
public class Message {

}
/**
 *
 * @author zhangwei_david
 * @version $Id: SmsSender.java, v 0.1 2014年11月6日 下午8:55:18 zhangwei_david Exp $
 */
public class SmsSender {
    private SendStrategy sendStrategy;

    public SmsSender(SendStrategy sendStrategy) {
        super();
        this.sendStrategy = sendStrategy;
    }

    /**
     * 发送消息
     *
     * @param msg
     */
    public void sendSMS(Message msg) {
        sendStrategy.send(msg);
    }
}
/**
 *
 * @author zhangwei_david
 * @version $Id: Clinet.java, v 0.1 2014年11月6日 下午9:05:36 zhangwei_david Exp $
 */
public class Clinet {

    /**
     *
     * @param args
     */
    public static void main(String[] args) {
        new SmsSender(new OnceADay()).sendSMS(new Message());
        new SmsSender(new OnceAweek()).sendSMS(new Message());
        new SmsSender(new SendStrategy() {

            public boolean send(Message msg) {
                System.out.println("一天两次");
                //
                return true;
            }
        }).sendSMS(new Message());
    }

}


 策略模式有很多优点同样也有缺点。

优点有:

  • 策略模式提供了管理相关算法簇的办法。策略的等级结构定义了一个算法或行为族。恰当的使用集成可可以把公共的代码移动到父类里,从而避免代码的重复。
  • 策略模式提供了可怀疑替换继承关系的办法。继承可以处理多种算法或行为。
  • 使用策略模式可以避免使用多重条件转移语句。

缺点:

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略。
  • 策略模式造成了很多策略类。

 策略模式(Strategy Pattern)和 状态模式(State Pattern)的比较:

       策略模式(Stategy Pattern)和状态模式(State Pattern)的结构几乎一摸一样。但是策略模式和状态模式却是完全不同的两种思想。 状态模式注重的是状态的迁移,而策略模式不是这样;策略模式允许客户端定制策略,而状态模式却很少这样设计,因为状态一般是固定的。

策略模式(Strategy Pattern)和模板方法(Template Method Pattern)比较:

     从结构上讲策略模式(Strategy Pattern)的抽象策略通常是定义为接口,而模板方法模式(Template Method Pattern)则通常定义为抽象类。虽然二者都可以看做是对算法或者策略的抽象,但是模板方法模式(Template Method Pattern)通常定义后一个策略的框架,子类实现的通常都是策略的一部分;而策略模式(Strategy Pattern)则是对算法整体进行抽象。

 

 

 

0
0
分享到:
评论

相关推荐

    JAVA设计模式-chm版

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

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

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

    JAVA design pattern-java设计模式

    总结来说,"JAVA design pattern-java设计模式"的CHM文件是深入学习和理解Java设计模式的宝贵资源,通过学习和应用这些模式,开发者可以提高其代码质量,优化系统架构,从而更好地应对复杂的软件开发挑战。

    design-pattern-java.pdf

    处理对象的多种状态及其相互转换——状态模式(五) 处理对象的多种状态及其相互转换——状态模式(六) 策略模式-Strategy Pattern 算法的封装与切换——策略模式(一) 算法的封装与切换——策略模式(二) 算法的...

    设计模式--策略模式StrategyPattern

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或场景来执行不同算法的情况。策略模式提供了一种将算法族封装到各自独立的类中,并在运行时选择具体...

    设计模式之策略模式(Strategy Pattern)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件设计中,我们经常遇到需要在不同时间或根据不同条件使用不同算法的情况。策略模式允许我们将算法封装到独立的可互换的策略类中,从而使它们可以...

    java-design-patterns-master_JAVAdesignpattens_java_design_

    《Java设计模式实战详解》 在Java编程领域,设计模式是一种通用、可重用的解决方案,用于解决在软件设计中常见的问题。这个压缩包“java-design-patterns-master”显然是一个专注于Java设计模式的学习资源,旨在...

    design-pattern-Java设计模式

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决常见问题的经验总结和标准解决方案。设计模式并不直接提供代码实现,而是提供了一种通用的语言,让开发者能够更好地理解和交流复杂的系统架构。这些...

    Java设计模式(第二版)中文版

    ### Java设计模式(第二版)中文版 #### 思维框架的培养;对新手与码农均适用 在软件开发领域,设计模式是一种被广泛采用的解决方案,它可以帮助开发者更好地组织代码、解决常见问题,并提高软件的整体质量和可维护...

    设计模式java源码-design-pattern:java设计模式源代码

    这个名为"design-pattern:java设计模式源代码"的压缩包文件很可能是包含了多种Java实现的设计模式示例。 首先,我们来看看主要的设计模式分类: 1. 创建型模式:这类模式涉及到对象的创建,如单例模式(Singleton...

    设计模式整理代码-pattern.zip

    这里我们关注的是一个名为"pattern.zip"的压缩包文件,它包含了23种经典的设计模式,这些模式在实践中被广泛使用,提高了代码的可读性、可维护性和可扩展性。这篇文章将详细探讨这些设计模式及其应用。 首先,23种...

    sprintboot-strategy-pattern-demo-master.zip

    【标题】"sprintboot-strategy-pattern-demo-master.zip" 是一个使用Spring Boot技术实现的策略模式示例项目,它提供了一种快速理解并应用策略模式的开箱即用的体验。 【描述】"基于springboot做了一个策略模式的...

    Java高手真经 - Java Web系统设计与架构 源代码(一)设计模式

    Java高手真经 - Java Web系统设计与架构 源代码(一)设计模式 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1...

    Java与模式-我修改过的源代码

    "Java与模式-我修改过的源代码"这个项目可能是基于经典的《设计模式:可复用面向对象软件的基础》一书,该书由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师合著,被称为“GOF”设计模式。...

    设计模式-java

    根据提供的文件信息,本书《设计模式 For Dummies》是一本介绍设计模式的通俗易懂的指南,适合初学者以及希望深入了解面向对象编程中设计模式应用的开发者。下面将基于此书的内容来概述几种常见的设计模式及其应用...

    JAVA 23种设计模式(全).Design Pattern_Java模式

    总结来说,"JAVA 23种设计模式(全).Design Pattern_Java模式"这份资源是学习和掌握Java设计模式的重要工具。通过深入学习并熟练应用这些模式,开发者可以写出更高效、更易于维护的代码,同时提升个人的编程技能和...

    策略模式 Strategy Pattern

    策略模式是一种行为设计模式,它使得算法可以在运行时被更改。这种模式允许一个类的行为或其算法在运行时根据需要进行改变,通过这种方式,我们可以轻松地扩展不同的算法而不修改现有代码。 #### 主要问题 在软件...

    java开发设计模式

    在Java开发中,设计模式尤为重要,因为它们能够帮助开发者构建出结构清晰、可维护和可扩展的代码。 首先,设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。 1. 创建型模式主要用于对象的创建,它...

Global site tag (gtag.js) - Google Analytics