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

本文实例讲述了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设计模式之装饰模式(Decorator模式)介绍
  • Java设计模式之代理模式与装饰模式实例详解
  • java设计模式学习之装饰模式
  • Javasript设计模式之链式调用详解
  • Java设计模式之动态代理模式实例分析
  • Java设计模式之静态代理模式实例分析
  • Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】
  • Java设计模式之装饰者模式详解和代码实例
  • Java设计模式之装饰模式原理与用法实例详解
时间: 2018-04-26

Java设计模式之代理模式与装饰模式实例详解

本文实例讲述了Java设计模式之代理模式与装饰模式.分享给大家供大家参考,具体如下: 之所以把这两种模式放在一起说,是因为我发现这了两种模式几乎一模一样! 从网上也搜了一些资料,发现两者还是有一些区别的.我们在学习的同时也把这种困惑搞清楚. 定义: 代理模式,为其他对象提供一种代理以控制对这个对象的访问. 装饰模式,动态地给一个对象添加一些额外的职责. 代理模式,很好理解,就是把一个对象再次封装,以后就对封装的对象访问就可以了. 因为代理对象已经取代了被代理对象. 装饰模式,给一个对象增加功能,

Java设计模式之装饰者模式详解和代码实例

装饰者模式可以给已经存在的对象动态的添加能力.下面,我将会用一个简单的例子来演示一下如何在程序当中使用装饰者模式. 1.装饰者模式 让我们来假设一下,你正在寻找一个女朋友.有很多来自不同国家的女孩,比如:美国,中国,日本,法国等等,他们每个人都有不一样的个性和兴趣爱好,如果需要在程序当中模拟这么一种情况的话,假设每一个女孩就是一个Java类的话,那么就会有成千上万的类,这样子就会造成类的膨胀,而且这样的设计的可扩展性会比较差.因为如果我们需要一个新的女孩,就需要创建一个新的Java类,这实际上也

Java设计模式之装饰模式(Decorator模式)介绍

Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这两种实体在Decorator模式中是必须的. Decorator定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活. 为什么使用Decorator 我们通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生

Java设计模式之装饰模式原理与用法实例详解

本文实例讲述了Java设计模式之装饰模式原理与用法.分享给大家供大家参考,具体如下: 装饰模式能在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.JDK中IO的设计就用到了装饰模式,通过过滤流对节点流进行包装来实现功能的扩展. 装饰模式的角色的组成: ① 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加工功能的对象.(InputStream.OutputStream) ② 具体构件(Concrete Co

Javasript设计模式之链式调用详解

本文实例为大家分享了js设计模式之链式调用的具体代码,供大家参考,具体内容如下 写过jquery的可能都知道,jquery里面可以很方便的使用以下代码: // 不使用链式调用 const element = $(ele); element.addClass('red'); element.removeClass('green'); element.show(); // 链式调用 $(ele) .addClass('red') .removeClass('green') .show(); 而jqu

Java设计模式之动态代理模式实例分析

本文实例讲述了Java设计模式之动态代理模式.分享给大家供大家参考,具体如下: 前面介绍了静态代理模式,动态代理比静态代理模式更加强大.它能在程序运行时动态的生成代理对象.所谓动态代理类是在运行时生成的class,在生成它时,你必须提供一组interface给它,则动态代理类就宣称它实现了这些interface.当然,动态代理类就充当一个代理,你不要企图它会帮你干实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作. 动态代理的角色和静态代理的角色一样: ① 抽象角色:

java设计模式学习之装饰模式

装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活. 优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能. 缺点:多层装饰比较复杂. 实例:给一个人配置穿衣 1:代码结构图 2:创建一个person类(  ConcreteComponent) package DecoratorModel; /** * 2017-10-9 10:39:09 * 装饰器设计模式 * Person 类 Concre

Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】

本文实例讲述了Java设计模式之工厂模式.分享给大家供大家参考,具体如下: 一. 简单工厂 先来思考一个问题.我们平时写程序时,会有这种情况,A对象里面需要调用B对象的方法,这时我们使用的一般是new关键字来创建一个B实例,然后调用B实例的方法.这种做法的坏处在于:A类的方法实现直接调用了B类的类名(这种方式也被称为硬编码耦合),一旦系统需要重构:需要使用C类来代替B类时,程序就不得不修改A类代码,如果应用中有100个或者10000个类以硬编码方式耦合了B类,则需要修改100个.10000个地方

Java设计模式之静态代理模式实例分析

本文实例讲述了Java设计模式之静态代理模式.分享给大家供大家参考,具体如下: 代理模式,可以通过代理可以在原来的基础上附加一些其他的操作.静态代理模式相对比较简单无需再程序运行时动态的进行代理. 静态代理模式的角色: ① 抽象角色:真实对象和代理对象的共同接口.其中声明真实对象和代理对象需要做的事. ② 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用. ③ 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作. 下面提

java设计模式之装饰模式详细介绍

1.    装饰模式(Decorator)的定义:又名包装(Wrapper)模式,装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 2.    装饰模式以对客户端透明的方式动态的给一个对象附加上更多的责任.换言之客户端并不会觉的对象在装饰前和装饰后有什么区别. 3.    装饰模式可以在不创造更多的子类的模式下,将对象的功能加以扩展. 4.    装饰模式与类继承的区别: 1)    装饰模式是一种动态行为,对已经存在类进行随意组合,而类的继承是一种静态的行为,一个类定义成

java并发之ArrayBlockingQueue详细介绍

java并发之ArrayBlockingQueue详细介绍 ArrayBlockingQueue是常用的线程集合,在线程池中也常常被当做任务队列来使用.使用频率特别高.他是维护的是一个循环队列(基于数组实现),循环结构在数据结构中比较常见,但是在源码实现中还是比较少见的. 线程安全的实现 线程安全队列,基本是离不开锁的.ArrayBlockingQueue使用的是ReentrantLock,配合两种Condition,实现了集合的线程安全操作.这里稍微说一个好习惯,下面是成员变量的声明. pri

java数据类型与二进制详细介绍

java数据类型与二进制详细介绍 在java中 Int 类型的变量占 4个字节 Long 类型的变量占8个字节 一个程序就是一个世界,变量是这个程序的基本单位. Java基本数据类型 1.        整数类型 2.        小数(浮点数)类型 3.        布尔类型 4.        字符类型 整数类型 整数类型可以表示一个整数,常用的整数类型有:byte,short,int,long Byte  一个字节  -128到127 注:0有两个表示0000 0000正零  1000

Java类加载基本过程详细介绍

Java类加载基本过程详细介绍 基本过程: 根据类的全限定名称加载定义类的二进制字节流. 将字节流代表的静态存储结构转化为方法区的运行时数据结构 内存中生成一个代表这个类的java.lang.Class对象,作为方法去这个类的各种数据访问入口 数组类本身不通过类加载器创建,由java虚拟机直接创建,数组类的元素类型由类加载器加载. 数组类的元素类型:数组去掉所有维度后的类型, 文件格式验证: 0xCAFEBABY 魔数开头: 主次版本号当前虚拟机可处理: 常量类型: 索引执行类型: utf8编码

java 注解的基础详细介绍

java 注解的基础详细介绍 前言 注解是Java引入的一项非常受欢迎的补充,它提供了一种结构化的,并且具有类型检查能力的新途径,从而使得程序员能够为代码加入元数据,而不会导致代码杂乱且难以阅读.使用注解能够帮助我们避免编写累赘的部署描述文件,以及其他生成的文件. 注解的语法比较简单,除了@符号的使用之外,它基本与java固有的语法一致.但由于java源码中提供的内置注解很少,所以大部分同学对注解都不是很了解,虽然我们都接触过,比如java内置的几种注解: @Override,表示当前的方法定义

Java多线程的用法详细介绍

Java多线程的用法详细介绍 最全面的Java多线程用法解析,如果你对Java的多线程机制并没有深入的研究,那么本文可以帮助你更透彻地理解Java多线程的原理以及使用方法. 1.创建线程 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread构造函数: public Thread( ); publi

Java中ArrayList类详细介绍

Java中ArrayList类详细介绍 ArrayList是一个可变长度数组,它实现了List接口,因此它也可以包含重复元素和Null元素,也可以任意的访问和修改元素,随着向 ArrayList 中不断添加元素,其容量也自动增长.不过ArrayList是非同步(同步的意思是如果多个线程同时访问一个实例,任何一个线程对实例做了修改之后,其他线程所访问到的实例应该是修改过的最新的实例)的, 我们经常使用List list = Collections.synchronizedList(new Arra

Java classloader和namespace详细介绍

Java classloader和namespace详细介绍 Java虚拟机通过装载.连接和初始化一个JAVA类型,使该类型可以被正在运行的JAVA程序所使用.其中,装载就是把二进制形式的JAVA类型读入JAVA虚拟机中.连接就是把这种已经读入虚拟机的二进制形式的类型数据合并到虚拟机的运行时状态中去.连接阶段分为三个步骤-验证.准备和解析.验证确保了JAVA类型数据格式正确并适于JAVA虚拟机使用.准备负责为该类分配它所需的内存,比如为它的类变量分配内存.解析把常量池中的符号引用转换为直接引用,

JAVA中Context的详细介绍和实例分析

最熟悉的陌生人--Context 刚刚学android或者js等,都会看见这个频繁的字眼--Context. 意为"上下文". 本文主要记述,Context到底是什么.如何理解Context.一个APP可以有几个Context.Context能干啥.Context的作用域.获取Context.全局获取Context技巧. 思考: Java:万物皆对象.Flutter:万物皆组件. 俗语:"没对象吗?自己new一个啊~" 既然大多数情况可以new一个实例,那么,我们在