概念
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独
立变化。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes
them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)
Context(应用场景):
  1、需要使用ConcreteStrategy提供的算法。
  2、内部维护一个Strategy的实例。
  3、负责动态设置运行时Strategy具体的实现算法。
  4、负责跟Strategy之间的交互和数据传递。
Strategy(抽象策略类):
  1、 定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,
一般使用接口或抽象类实现。
  ConcreteStrategy(具体策略类):
  2、 实现了Strategy定义的接口,提供具体的算法实现。
应用场景:
  1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
  2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
  3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
优点:
  1、 提供了一种替代继承的方法,而且既保持了继承的优点(代码重用)还比继承更灵活(算法独立,可以任意扩展)。
  2、 避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。
  3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。
缺点:
  1、 因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。

如图 :

举例:
[java] 
package design.strategy; 
/**
 * 文件名称:design.strategy.IDiscount.java
 * 说明:打折算法基类
 * */ 
public interface IDiscount { 
    void discount() ;  

 
 
 
 
package design.strategy; 
/**
 * 文件名称:design.strategy.DiscountHalf.java
 * 说明:打折种类算法
 * */ 
public class DiscountHalf implements IDiscount { 
 
    @Override 
    public void discount() { 
        System.out.println( "---半价---" );  
    } 
     

 
 
 
 
package design.strategy; 
/**
 * 文件名称:design.strategy.DiscountEight.java
 * 说明:打折种类算法
 * */ 
public class DiscountEight implements IDiscount { 
 
    @Override 
    public void discount() { 
        System.out.println( "---八折---" );  
    } 
     

 
 
 
 
package design.strategy; 
 
/**
 * 说明:用于选择策略
 */ 
public class StrategyFactory { 
    IDiscount dis; 
     
    public StrategyFactory(int i) { 
        switch (i) { 
        case 0: 
            dis = new DiscountHalf(); 
            break; 
        case 1: 
            dis = new DiscountEight(); 
            break; 
        default: 
            dis = new DiscountEight(); 
            break; 
        } 
    } 
     
     public void showMessage() 
     { 
         dis.discount() ;  
     } 

 
 
 
 
package design.strategy; 
/**

* 说明:测试类
 * */ 
public class Main { 
 
    public static void main(String[] args) { 
        StrategyFactory factory = new StrategyFactory( 0 ) ; 
        factory.showMessage() ;  
    } 
     
}

JAVA设计模式--strategy(策略者模式)的更多相关文章

  1. Java设计模式---Strategy策略模式

    参考于 : 大话设计模式 马士兵设计模式视频 1.场景介绍 购物网站上有一个产品,有三个字段,档次,价格,重量. 有些同学喜欢轻的,有些手头紧,想要便宜的,有些喜欢档次高的. 那么我们为了提高网站用户 ...

  2. Java设计模式 - - 单例模式 装饰者模式

    Java设计模式 单例模式 装饰者模式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/1 ...

  3. Java 设计模式泛谈&装饰者模式和单例模式

    设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...

  4. java设计模式之Proxy(代理模式)

    java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...

  5. Java设计模式之《桥接模式》及应用场景

    摘要: 原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6497919.html 这里摘抄一份他处的概念,你可以不必理会,先看下面得讲解与实例, ...

  6. Java设计模式之接口型模式总结

    摘要: 原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6508967.html 之前认真学习了Java设计模式中的四大接口型模式,分别为:适 ...

  7. Java设计模式之《外观模式》及应用场景

    原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6484128.html 1.外观模式简介 外观模式,一般用在子系统与访问之间,用于对访问屏蔽复 ...

  8. Java设计模式之《代理模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...

  9. Java设计模式系列-抽象工厂模式

    原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...

随机推荐

  1. Javascript函数声明与函数表达式

    在定义函数时,我们一般使用下面这两种方法: 使用函数声明定义: function sum (a, b) { return a + b; } 使用函数表达式定义: var sum = function ...

  2. 转-Android微信支付

    http://blog.fangjie.info/android微信支付/ Android微信支付 2014-08-09 一.使用微信官方的提供的demo里的appid等 1.微信接口上手指南:(从“ ...

  3. js鼠标事件、键盘事件实例代码

    讲述了:鼠标的哪个按键被点击.当前鼠标的光标坐标是多少.被按下键的unicode码是多少.当前鼠标的光标相对于屏幕的坐标是多少.当前鼠标的光标坐标是多少.shift键是否按下.当前被点击的是哪一个元素 ...

  4. RPC介绍

    转载http://blog.csdn.net/mindfloating/article/details/39474123/ 近几年的项目中,服务化和微服务化渐渐成为中大型分布式系统架构的主流方式,而 ...

  5. 通过位运算生成ID

    public static void main(String[] args) { long serverId = 65535; System.out.println("ServerId:&q ...

  6. android github

    Action Bars ActionBarSherlock Extended ActionBar FadingActionBar GlassActionBar v7 appcompat library ...

  7. Regex.Replace的基本用法

    Regex构造函数Regex(string pattern)Regex(string pattern,RegexOptions options)参数说明pattern:要匹配的正则表达式模式optio ...

  8. 生成ldf数据库文件

    .在我的电脑中删除LOG文件 c.附加数据库: 企业管理器--服务器--数据库--右键--附加数据库 此法将生成新的LOG,大小只有500多K

  9. JavaScript对象的创建之外部属性定义方式(基于已有对象扩充其属性和方法)

    var person = new Object(); person.name = "luogk"; person.age = 33; person.say = function() ...

  10. DDDD

    if (list != null && list.Count > 0)            {                result =                  ...