`
zhangwei_david
  • 浏览: 469611 次
  • 性别: 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设计模式---诙谐易懂版

    第 1 章 策略模式【Strategy Pattern】 刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题, 嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看...

    design-pattern-java.pdf

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

    33种JAVA设计模式DEMO

    策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4 J2EE 模式 这些设计模式特别关注表示层。这些模式是由 Sun Java Center 鉴定的。 MVC 模式(MVC Pattern) 业务代表...

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

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

    用Java实现23种设计模式

    用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...

    《JAVA与模式》之策略模式

    javase 设计模式的strategy pattern《JAVA与模式》之策略模式详解

    设计模式_策略模式.zip

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 策略模式java-demo 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    1、策略模式STRATEGY PATTERN 2、代理模式PROXY PATTERN 3、单例模式SINGLETON PATTERN 4、多例模式MULTITION PATTERN 5、工厂方法模式FACTORY METHOD PATTERN 6、抽象工厂模式ABSTRACT FACTORY PATTERN 7、门面模式...

    Java设计模式,并加上个人理解

    1. 设计模式 1.1 含义 1.2 作用 1.3 设计原则 1.4 分类 2. 简单工厂模式 (SimpleFactoryPattern) 3. 工厂方法模式 (Factory Method) 4. 单例模式 (Singleton) 5. 抽象工厂模式 (Abstract Factory) 6. ...

    JAVA设计模式.rar

    策略模式【STRATEGY PATTERN】 代理模式【PROXY PATTERN】 单例模式【SINGLETON PATTERN】  多例模式【MULTITION PATTERN】  工厂方法模式【FACTORY METHOD PATTERN】 抽象工厂模式【ABSTRACT FACTORY...

    单例模式源码java-DesignPattern:在个人自学阶段的23种设计模式代码的全部实现,全部使用Java编写,其中还包括各个设计模式在

    在个人自学阶段的23种设计模式代码的全部实现,全部使用Java编写,其中还包括各个设计模式在源码中的使用,每种设计模式都举了一个简单的小例子来进行实现,并加以注释 包名解释 一、DesignPattern 1.1 创建型模式 ...

    JAVA23种设计模式代码学习.zip

    获取到【文件夹】名称: abstract_factory_pattern 获取到【文件夹】名称: adapter...获取到【文件夹】名称: strategy_pattern 获取到【文件夹】名称: templet_pattern 获取到【文件夹】名称: visitor_pattern

    java设计模式

    第 1 章 策略模式【Strategy Pattern】 刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题, 嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个...

    java版中国象棋源码-hello-design-pattern:设计模式学习笔记

    设计模式学习笔记,此项目参考《大话设计模式》,只能作为入门级设计模式学习 设计原则 职责单一原则 开放-封闭原则 依赖倒转原则 高层模块不依赖底层模块,两个模块都应该依赖抽象。抽象不依赖细节,细节依赖抽象。...

    java源码解读-DesignPattern:Android源码设计模式解析与实战读书笔记源代码

    包名strategy_pattern表示的是策略模式的简单例子 包名adapter_pattern表示的是适配器模式的简单例子 包名command_pattern表示的是命令模式的简单例子 包名decorator_pattern.example_one表示的是装饰模式的简单例子...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷6

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    aula-design-pattern-strategy

    设计模式策略在免费的视频课程中使用了这些项目,以举例说明“设计模式装饰器”的使用。 观看视频课程: :

    java 设计模式资料

    附件中是java实现全部的设计模式,包含代码和工程(jbuilder工程),值得收藏. 此目录里包括了一书中所有23种设计模式的实现(Java 版)源码 关于代码的几点说明: 1. 代码为根据个人对Design Pattern的学习理解写...

    Object-Oriented-Analysis-Design:面向对象的分析和设计(JAVA语言)设计模式,Java GUI

    面向对象的分析与设计 这些代码是我为Gebze技术大学的CSE443-面向对象的分析和设计课程提交的内容。 家庭作业的主题: HW01: PART1->策略设计模式PART2->观察者设计模式... 复合设计模式策略设计模式中介者设计模式

    java高手真经 (UML建模+设计模式+面向服务架构) 卷8

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

Global site tag (gtag.js) - Google Analytics