Java设计模式之策略模式原理与用法实例详解

所属分类: 软件编程 / java 阅读数: 20
收藏 0 赞 0 分享

本文实例讲述了Java设计模式之策略模式原理与用法。分享给大家供大家参考,具体如下:

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。其中JDK里面的TreeSet类和TreeMap类就用到了策略模式。这两个类是带排序的集合类,其中排序的规则就相当于策略模式里定义的一系列算法,而集合类就相当于是策略模式里的环境类,供用户使用,用只知道TreeSet和TreeMap是带排序的,至于怎么排序的,是由排序的算法决定的。

策略模式由三部分组成:抽象策略角色,具体策略角色,环境角色。

抽象策略角色:策略类,通常由一个接口或者抽象类实现。

具体策略角色:实现了抽象策略类,并包装了相关的算法和行为。

环境角色:持有一个策略类的引用,最终给客户端调用。

下面提供一个简单的策略模式的代码实例:

1.抽象策略角色:定义一个接口Strategy。

package com.test;
/**
 * 策略模式抽象角色
 * @author zhouwen
 *
 */
public interface Strategy {
  public int calculate(int a, int b);
}

2.具体策略角色:实现Strategy接口。例子中是实现加减乘除的运算。

package com.test;
/**
 * 策略模式具体策略类
 * 实现加法运算
 * @author zhouwen
 *
 */
public class AddStrategy implements Strategy {
  @Override
  public int calculate(int a, int b) {
    return a + b;
  }
}

package com.test;
/**
 * 策略模式具体策略类
 * 实现减法运算
 * @author zhouwen
 *
 */
public class SubtractStrategy implements Strategy {
  @Override
  public int calculate(int a, int b) {
    return a - b;
  }
}

package com.test;
/**
 * 策略模式具体策略类
 * 实现乘法运算
 * @author zhouwen
 *
 */
public class MultiplyStragety implements Strategy {
  @Override
  public int calculate(int a, int b) {
    return a * b;
  }
}

package com.test;
/**
 * 策略模式具体策略类
 * 实现除法运算
 * @author zhouwen
 *
 */
public class DivideStrategy implements Strategy {
  @Override
  public int calculate(int a, int b) {
    return a / b;
  }
}

3.环境角色:在环境角色中定义一个抽象角色的引用,并暴露出计算的方法,供客户端调用。

package com.test;
/**
 * 策略模式环境类
 * @author zhouwen
 *
 */
public class Environment {
  private Strategy strategy;
  public Environment(Strategy strategy){
    this.strategy = strategy;
  }
  //用以改变策略
  public void setStrategy(Strategy strategy){
    this.strategy = strategy;
  }
  public Strategy getStrategy(){
    return strategy;
  }
  //暴露计算的接口,供客户端调用
  public int calculate(int a, int b){
    return strategy.calculate(a, b);
  }
}

4.最后编写客户端的代码:

package com.test;
public class Client {
  public static void main(String[] args) {
    AddStrategy addStrategy = new AddStrategy();
    Environment environment = new Environment(addStrategy);
    System.out.println(environment.calculate(3, 4));
    SubtractStrategy subStrategy = new SubtractStrategy();
    environment.setStrategy(subStrategy);
    System.out.println(environment.calculate(3, 4));
    MultiplyStragety multiplyStrategy = new MultiplyStragety();
    environment.setStrategy(multiplyStrategy);
    System.out.println(environment.calculate(3, 4));
    DivideStrategy divideStrategy = new DivideStrategy();
    environment.setStrategy(divideStrategy);
    System.out.println(environment.calculate(3, 4));
  }
}

总结:

由客户端的System.out.println(environment.calculate(3, 4));这句代码,我们并不知道具体调用的是哪个实现类,只有知道了传给环境角色的具体策略类我们才知道调用哪个类,这样就能实现客户端和具体策略算法的分离,使程序易于切换、易于理解、易于扩展。

策略模式的优缺点:

优点:

1.策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得他们可以相互替换。如提供的例子中通过set方法对策略进行替换。

2.策略模式使得算法可以在不影响客户端的情况下发生变化。使用策略模式可以把行为和环境分隔开。

3.环境类负责维持和查询行为类,各类算法则在具体策略中提供。由于算法和环境独立开来,算法的修改不会影响环境和客户端。

缺点:

1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。

2.会造成很多的策略类。

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

更多精彩内容其他人还在看

Java数据类型的规则

这篇文章主要介绍了Java数据类型的规则的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Spring整合TimerTask实现定时任务调度

这篇文章主要介绍了Spring整合TimerTask实现定时任务调度的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

详解SpringMVC使用MultipartFile实现文件的上传

本篇文章主要介绍了SpringMVC使用MultipartFile实现文件的上传,本地的文件上传到资源服务器上,比较好的办法就是通过ftp上传。这里是结合SpringMVC+ftp的形式上传的,有兴趣的可以了解一下。
收藏 0 赞 0 分享

SpringMVC上传文件的三种实现方式

本篇文章主要介绍了SpringMVC上传文件的三种实现方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

微信公众帐号开发-自定义菜单的创建及菜单事件响应的实例

本篇文章主要介绍了微信公众帐号开发-自定义菜单的创建及菜单事件响应的实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
收藏 0 赞 0 分享

浅析Java中的继承与组合

本文将介绍组合和继承的概念及区别,并从多方面分析在写代码时如何进行选择。文中通过示例代码介绍的很详细,有需要的朋友可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享

利用反射获取Java类中的静态变量名及变量值的简单实例

下面小编就为大家带来一篇利用反射获取Java类中的静态变量名及变量值的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

java启动线程的3种方式对比分析

这篇文章主要为大家对比分析了java启动线程的3种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

SpringMVC上传和解析Excel方法

这篇文章主要介绍了SpringMVC上传和解析Excel方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

JAVA中String类与StringBuffer类的区别

这篇文章主要为大家详细介绍了JAVA中String类与StringBuffer类的区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多