本文实例为大家分享了Java策略模式,供大家参考,具体内容如下

1、策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern)。

定义如下:

Define a family of algorithms,encapsulate each one,and make them interchangeable.

(定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。)

策略模式的通用类图如下所示:

策略模式的三个角色:

● Context                        封装角色

它也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。

● Strategy                      抽象策略角色

策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性、

● Concrete Strategy      具体策略角色

实现抽象策略中的操作,该类含有具体的算法。

策略模式即在封装角色的构造函数中将某个具体策略传入,然后执行这个策略。

策略模式通用源码如下:

public class Test3 {

public static void main(String[] args) {

//声明一个具体的策略

Strategy strategy = new ConcreteStrategy1();

//声明上下文对象

Context context = new Context(strategy);

//执行封装后的方法

context.doAnythinig();

}

}

interface Strategy {

//策略模式的运算法则

public void doSomething();

}

class ConcreteStrategy1 implements Strategy {

public void doSomething() {

System.out.println("具体策略1的运算法则");

}

}

class ConcreteStrategy2 implements Strategy {

public void doSomething() {

System.out.println("具体策略2的运算法则");

}

}

class Context {

//抽象策略

private Strategy strategy;

//构造函数设置具体策略

public Context(Strategy _strategy){

this.strategy = _strategy;

}

//封装后的策略方法

public void doAnythinig(){

this.strategy.doSomething();

}

}

策略模式的优点:

● 算法可以自由切换

这是策略模式本身定义的,只要实现抽象策略,它就成为策略家族的一个成员,通过封装角色对其进行封装,保证对外提供“可自由切换”的策略。

● 避免使用多重条件判断

如果没有策略模式,我们想想看会是什么样子?一个策略家族有5个策略算法,一会要使用A策略,一会要使用

B策略,怎么设计呢?使用多重的条件语句?多重条件语句不易维护,而且出错的概率大大增强。使用策略模式后,可以由其他模块决定采用何种策略,策略家族对外提供的访问接口就是封装类,简化了操作,同时避免了条件语句判断。

● 扩展性良好

这甚至都不用说是它的优点,因为它太明显了。在现有的系统中增加一个策略太容易了,只要实现接口就可以了,其他都不用修改,类似于一个可反复拆卸的插件,这大大地符合了OCP原则。

策略模式的缺点:

● 策略类数量增多    每一个策略都是一个类,复用的可能性很小,类数量增多。

● 所有的策略类都需要对外暴露

策略模式的使用场景:

● 多个类只有在算法或行为上稍有不同的场景。

● 算法需要自由切换的场景。

● 需要屏蔽算法规则的场景。

2、策略模式的扩展—策略枚举

策略枚举定义如下:

● 它是一个枚举。

● 它是一个浓缩了的策略模式的枚举。

示例如下:

题目:输入3个参数,进行加减法运算,参数中两个是int型的,剩下的一个参数是String型的,只有“+”、“-”两个符号可以选择,不要考虑什么复杂的校验,我们做的是白箱测试,输入的就是标准的int类型和合规的String类型。

import java.util.Arrays;

public class Test3 {

public static void main(String[] args) {

//输入的两个参数是数字

int a = Integer.parseInt(args[0]);

String symbol = args[1]; //符号

int b = Integer.parseInt(args[2]);

System.out.println("输入的参数为:"+Arrays.toString(args));

System.out.println("运行结果为:"+a+symbol+b+"="+Calculator.ADD.exec(a,b));

}

}

enum Calculator {

//加法运算

ADD("+"){

public int exec(int a,int b){

return a+b;

}

},

//减法运算

SUB("-"){

public int exec(int a,int b){

return a - b;

}

};

String value = "";

//定义成员值类型

private Calculator(String _value){

this.value = _value;

}

//获得枚举成员的值

public String getValue(){

return this.value;

}

//声明一个抽象函数

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

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java策略模式_Java设计模式之策略模式详解相关推荐

  1. java web简单工厂模式_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  2. java解耦的模板模式_Java 设计模式(9) —— 模板模式

    一.模板模式 封装了一个算法步骤,并允许子类为一个或多个步骤方法提供实现.模板模式可以使子类在不改变算法结构的情况下,重新定义算法中的某些步骤. 模板模式 二.示例 泡咖啡与泡茶: 泡咖啡的步骤: 水 ...

  3. Java创新型模式_java设计模式--创建型模式(一)

    2016-04-24 10:10:34 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 注意:工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂 ...

  4. 格力电器Java面试题_JAVA设计模式学习--工厂模式

    今天谈一下对工厂模式学习的总结. 看完视频和文章之后要自己表述工厂模式,总是感觉无从说起,不知道怎么去定义工厂模式,反复看了几遍之后终于理解一点. 自己理解工厂模式是通过这两种模式的特点来理解和定义的 ...

  5. java 工厂方法_java设计模式-工厂方法模式

    1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的"创建与使用相分离" ...

  6. java抽象工厂模式_JAVA设计模式-抽象工厂模式

    定义 抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构. 抽象工厂模 ...

  7. java bridge 模式_Java设计模式之桥模式(Bridge模式)介绍

    Bridge定义:将抽象和行为划分开来,各自独立,但能动态的结合. 为什么使用桥模式 通常,当一个抽象类或接口有多个具体实现(concrete subclass),这些concrete之间关系可能有以 ...

  8. java observer模式_Java观察者模式(Observer)详解及应用

    Java观察者模式(Observer)详解及应用 (2011-12-15 14:03:30) 标签: 杂谈 Java观察者模式(Observer)详解及应用 由于网站带有弱sns功能,因此需要设计关注 ...

  9. java多线程教程_java 基础教程之多线程详解及简单实例

    java 多线程详解 在这篇文章里,我们关注多线程.多线程是一个复杂的话题,包含了很多内容,这篇文章主要关注线程的基本属性.如何创建线程.线程的状态切换以及线程通信. 线程是操作系统运行的基本单位,它 ...

最新文章

  1. 导师推荐的学术前沿号
  2. 【Android 插件化】恶意软件判定规则 | 恶意软件的范围定义
  3. 修改远程桌面端口号3389
  4. 五分钟创建一个自己的NPM包
  5. 操作系统(二十)进程互斥的硬件实现方法
  6. [Material Design] 教你做一个Material风格、动画的button(MaterialButton)
  7. JVM 调优系列之监控工具
  8. linux标准I/O——按行输入和输出
  9. Apache服务器的下载与安装
  10. JAVA垃圾回收机制
  11. 函数day_of_year 和month_day
  12. can not be named yunan because its located directly under the workspace root
  13. 物料主数据的维护状态
  14. 【180622】VC++不规则窗体编程跳棋游戏实例
  15. html十六进制和RGB颜色表
  16. 程序员的算法课(6)-最长公共子序列(LCS)
  17. 四书《孟子》《论语》《中庸》《大学》五经《风》《雅》《颂》全文
  18. 获得Bert预训练好的中文词向量
  19. 误删除DAMENG01.log怎么办/ 日志文件出现问题咋办?
  20. php 银行支付通道_接口--php对接农行网上支付平台-b2b

热门文章

  1. exp与expdp全库导出数据对表空间、用户处理的测试
  2. Django常见数据库错误代码及原因
  3. Dokcer 桥接模式原理解析
  4. 删除链表中的重复出现的结点,留下只出现一次的结点
  5. 亚马逊卖家转战独立站如何做
  6. 亚马逊卖家如何提升review留评率和转化率
  7. leetcode 605. 种花问题(python)
  8. 如何把ppt格式转换成pdf格式
  9. CentOS系统打包ISO镜像
  10. 关于AndroidStudio中提示cannot resolve symble R,但程序可以正常build和run的问题