策略模式的定义:

定义了算法族,分别封装起来,让它们之间可以互相替换 ,此模式让算法的变化独立于使用算法的客户 

  策略模式的意义:

   策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之间是低耦合的关系。

    低耦合的特性使软件具有更强的可扩展性,易于维护;更重要的是,它大大提高了软件的可重用性。

    策略模式中有三个对象:
      环境对象(Context):该类中实现了对抽象策略中定义的接口或者抽象类的引用。
      抽象策略对象(Strategy):它可由接口或抽象类来实现。
      具体策略对象(ConcreteStrategy):它封装了实现同不功能的不同算法。

  三者之间的关系可以用下图来表示:

            

策略模式的实现:

  1.对策略对象定义一个公共接口。

  2.编写策略类,该类实现了上面的公共接口。

  3.在使用策略对象的类中保存一个对策略对象的引用。

  4.在使用策略对象的类中,实现对策略对象的set和get方法或者使用构造方法完成赋值。

具体代码实现:

定义一个接口( 抽象策略),定义一个方法用于对两个整数进行运算

public interface Strategy {

    public abstract int calculate(int a,int b);

 }

定义具体的算法类,实现两个整数的加减乘除运算,但是外部调用形式需要符合接口的定义

实现加法运算

public class AddStrategy implements Strategy{

    @Override
public int calculate(int a, int b) { return a+b;
} }

实现减法运算

public class SubstractStrategy implements Strategy{

     @Override
public int calculate(int a, int b) { return a-b;
} }

实现乘法运算

 public class MultiplyStrategy implements Strategy {

     @Override
public int calculate(int a, int b) { return a*b;
} }

实现除法运算

 public class DivisionStrategy  implements Strategy{

      @Override
public int calculate(int a, int b) {
if(b!=0){ return a/b;
}
else {
throw new RuntimeException("除数不能为零");
}
} }

定义具体的环境角色,持有Strategy接口的引用,并且有get和set方法可以完成策略更换。在环境角色中调用接口的方法完成动作。

public class Context {

    private Strategy strategy;

    public Context(Strategy strategy) {
super();
this.strategy = strategy;
} public Strategy getStrategy() {
return strategy;
} public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public int calculate(int a,int b){
return strategy.calculate(a, b);
}
}

这样在客户端在调用时,只需向环境角色设置相应的算法类,然后就可以得到相应的结果。

public class StrategyTest {

    /**
* @param args
*/
public static void main(String[] args) { //加法
Context context=new Context(new AddStrategy());
System.out.println(context.calculate(10, 5));
//减法
Context context2=new Context(new SubstractStrategy());
System.out.println(context2.calculate(3, 2));
//乘法
Context context3=new Context(new MultiplyStrategy());
System.out.println(context3.calculate(6, 8));
//除法
Context context4=new Context(new DivisionStrategy());
System.out.println(context4.calculate(90, 9));
} }

策略模式的缺点:

1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。
2、策略模式造成很多的策略类,每个具体策略类都会产生一个新类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。

Java设计模式系列之策略模式的更多相关文章

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

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

  2. Java设计模式系列-工厂方法模式

    原创文章,转载请标注出处:<Java设计模式系列-工厂方法模式> 一.概述 工厂,就是生产产品的地方. 在Java设计模式中使用工厂的概念,那就是生成对象的地方了. 本来直接就能创建的对象 ...

  3. Java设计模式系列-装饰器模式

    原创文章,转载请标注出处:<Java设计模式系列-装饰器模式> 一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是 ...

  4. Java设计模式系列之状态模式

    状态模式(State)的定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它 ...

  5. Java设计模式之十一 ---- 策略模式和模板方法模式

    前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...

  6. 《JAVA设计模式》之策略模式(Strategy)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述策略(Strategy)模式的: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它 ...

  7. Java设计模式6:策略模式

    策略模式 策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 策略模式的结构 策略模式是对算法的包 ...

  8. 设计模式系列之策略模式(Strategy Pattern)

    意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护. 何时使用:一个系统有许多许多类,而区分它 ...

  9. JAVA设计模式之【策略模式】

    策略模式 定义一些独立的类来封装不同的算法 类似于common方法或者引用类 角色 环境类Context 抽象策略Strategy 具体策略ConcreteStrategy 重构伴随着设计模式 重构类 ...

随机推荐

  1. bash: ./device/nexell/tools/build.sh: 权限不够

    /bin/bash: build/tools/diff_package_overlays.py: 鏉冮檺涓嶅 i686-linux-gcc: error trying to exec 'cc1': ...

  2. 在XML里的XSD和DTD以及standalone的使用3----具体使用详解

    本人亲自写的一个简单的测试例子 1.xsd定义 <?xml version="1.0" encoding="utf-8"?><xs:schem ...

  3. CentOS5.5 正式开始安装 Oracle 11g r2(图形界面安装)

    一.下载oracle 官方网站, 可以下载最新版本 Oracle Database 11g Release http://www.oracle.com/index.html CentOS5. i386 ...

  4. poj3307

    可以证明,每个符合的数都由2,3,5,7相乘得到. 依据猜想:下一个出现的数是由前面某个数乘上这几个数之一得到的新的数. 假设之前的数均满足序列,则因为下一个数必有2,3,5,7相乘得到,而这个数之前 ...

  5. 宏buf_pool_struct

    typedef struct buf_pool_struct buf_pool_t; /** @brief The buffer pool structure. NOTE! The definitio ...

  6. socket编程---一个简单例子

    服务器端代码(单线程): import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamRe ...

  7. asp.net正则表达式过滤标签和数据提取

    无论什么语言,正则表达式的处理方法都是非常灵活.高效的,尤其是对某些字符串的抓取.过滤方面,更显其优势. 正则表达式的写法通常比较简单,几行短代码便能轻松完成看似很复杂的事情,更值得称赞的是,它的执行 ...

  8. Thread.sleep() & SystemClock.sleep()

    Thread.sleep()是java提供的函数.在调用该函数的过程中可能会发生InterruptedException异常. SystemClock.sleep()是android提供的函数.在调用 ...

  9. ubuntu下安装mysql及外网访问设置

    这么多年一直是mssql或者Oracle,mysql基本没用过,借着.net即将跨平台之际,也mysql一把.windows安装基本没啥难度,然后就是试了把linux下...结果坑不少,由于linux ...

  10. HDU 1150 Machine Schedule (最小覆盖,匈牙利算法)

    题意: 有两台不同机器A和B,他们分别拥有各种运行模式1~n和1~m.现有一些job,需要在某模式下才能完成,job1在A和B上需要的工作模式又可能会不一样.两台机器一开始处于0模式,可以切换模式,但 ...