下面是一个有关于策略模式的故事。假设Mike在开车的时候,会很频繁的加速,有一天因为超速他被一个警察拦下来了。有可能这个警察会比较友好,没开任何罚单就让Mike把车开走了。(我们把这类型的警察称之为“NicePolice”)。也有可能Mike遇到了一个不太友好的警察,然后这个警察给Mike出具了一张罚单。(我们把这类型的警察称之为“HardPolice”)。

Mike其实并不知道他会遇到什么类型的警察,直到他因为超速而被警察要求停车下来,实际上这就是一种程序当中“运行时”的概念,只有在运行的时候,才知道,到底会遇到什么类型的警察,实际上这就是“策略模式”。

先来定义一个策略的接口:Strategy

public interface Strategy {

public void processSpeeding(int speed);

}

再来定义两种不同类型的Strategy:

public class NicePolice implements Strategy {

@Override

public void processSpeeding(int speed) {

System.out

.println("This is your first time, be sure don't do it again!");

}

}

public class HardPolice implements Strategy {

@Override

public void processSpeeding(int speed) {

System.out.println("Your speed is " + speed

+ ", and should get a ticket!");

}

}

定义一个需要依赖警察来处理超速问题的场景:

public class Situation {

private Strategy strategy;

public Situation(Strategy strategy){

this.strategy = strategy;

}

public void handleByPolice(int speed){

this.strategy.processSpeeding(speed);

}

}

最后,进行测试:

public class Main {

public static void main(String[] args) {

HardPolice hp = new HardPolice();

NicePolice ep = new NicePolice();

// In situation 1, a hard officer is met

// In situation 2, a nice officer is met

Situation s1 = new Situation(hp);

Situation s2 = new Situation(ep);

// the result based on the kind of police officer.

s1.handleByPolice(10);

s2.handleByPolice(10);

}

}

策略模式,实际上就是定义了一些算法,并把他们都封装起来,使得他们之间可以互相替代。实际上对应上面程序,就是定义了两种算法(NicePolice以及HardPolice),由于他们都实现了Strategy这个接口,那么对于依赖于这个接口的实例对象来说,可以动态的对这个依赖进行注入,从而达到运行时确定具体使用哪一种算法的目的。

策略模式java8_Java设计模式:策略模式相关推荐

  1. 代理模式 委派模式 策略模式_设计模式 - 委派模式

    理解 首先委派模式不属于23种设计模式. 所谓委派,个人理解是:将为达到最终结果的事情交给其他人或中间人来干,我只要最终结果,其他的事情,由我委派的人来安排. 更直白的表达就是,比如,我们想要盖一栋楼 ...

  2. java 行为模式_java设计模式--行为模式

    前言 行为模式是描述多个类与对象之间通过协作共同完成单个对象无法单独完成的任务. 行为模式分为: 类行为模式通过集成在类之间分派行为 对象行为模式通过组合或聚合在对象之间分配行为 行为模式: 模板方法 ...

  3. java filter 模式,Java设计模式----过滤器模式(挑三拣四)

    过滤器模式 描述 拦截过滤器模式(Intercepting Filter Pattern)用于对应用程序的请求或响应做一些预处理/后处理.定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上.过 ...

  4. 组合模式_Java设计模式-组合模式

    在现实生活中,存在很多"部分-整体"的关系,例如,大学中的部门与学院.总公司中的部门与分公司.学习用品中的书与书包.生活用品中的衣月艮与衣柜以及厨房中的锅碗瓢盆等.在软件开发中也是 ...

  5. java模板方法模式_JAVA 设计模式 模板方法模式

    定义 模板方法模式 (Template Method) 定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成. 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模 ...

  6. java原始模型模式_java设计模式--原始模型模式

    简介 原始模型模式属于对象的创建模式.通过一个原型对象来指明要创建对象的类型,然后用复制原型对象的方法来创建出更多同类型的对象. Java所有的类都是从java.lang.Object类继承来的,Ob ...

  7. python 设计模式 原型模式_python设计模式–原型模式

    套用书里的一个例子,两年前你写了一本书,现在你要在此书 的基础上修订一版,你会在新版本中加入一些最新的元素,但是与之前的书相比你有很多的地方其实是不用修改的,但是你又不想直接把上一版拿过来改,万一改的 ...

  8. php委托模式,PHP设计模式 - 委托模式

    [一]模式定义 委托是对一个类的功能进行扩展和复用的方法.它的做法是:写一个附加的类提供附加的功能,并使用原来的类的实例提供原有的功能. 假设我们有一个 TeamLead 类,将其既定任务委托给一个关 ...

  9. java 备忘录模式_java设计模式--备忘录模式

    备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象外保存这个状态,这样以后可将此对象恢复成原来的状态. 就拿单机游戏举例,玩游戏打boss前我们通常都会存档,避免打boss时失误死 ...

  10. Python设计模式-策略模式

    Python设计模式-策略模式 代码基于3.5.2,代码如下; #coding:utf-8 #策略模式class sendInterface():def send(self,value):raise ...

最新文章

  1. NCBI中SRA数据库简介
  2. master-worker常驻型程序代码修改哪些需要重启master或者worker
  3. 你真的会停止线程吗?
  4. 【存储知识学习】第八章-Fibre Channel协议-8.1 FC网络和8.2FC协议中七种端口类型-《大话存储》阅读笔记
  5. 《UNIX网络编程 卷1:套接字联网API(第3版)》——第2章 传输层:TCP、UDP和SCTP 2.1概述...
  6. ctf镜子里面的世界_帮大爷干活,他送了我一只鞋子和一手套,又不能穿拿来做什么?哈哈哈|叶子|镜子|虫子|鞋子|棺材...
  7. Iframe 高度自适应的问题
  8. 对Spring Boot还陌生吗?
  9. JQuery——实现Ajax应用
  10. Linux环境下安装Hadoop(完全分布式)
  11. 跟我一起数据挖掘(22)——spark入门
  12. web安全测试--基础篇
  13. java映射和反射的理解
  14. container-coding-codec
  15. eigen一维向量_Eigen中的矩阵及向量运算
  16. cmd命令检查电脑配置情况
  17. angularjs防抖
  18. SAP CDS UI 常用注解用法
  19. Vultr VPS添加额外的IPv4地址
  20. html制作古诗带图画大全,春天的古诗配图画大全

热门文章

  1. 分析robin的“seo培训”网站
  2. 用WPF实现屏幕文字提示,徐汇区网站设计
  3. Linux 如何打开pyo文件,Python的文件类型
  4. Unity UGUI基础之Image格式讲解
  5. python访问服务器注册表,使用Python的Windows注册表访问(Winreg)
  6. android push php,Android_android push推送相关基本问答总结,通知和消息有什么区别?通 - phpStudy...
  7. @Value 注入 map、List,yaml 格式
  8. springboot前台页面写Java代码,接收后台数据,SpringBoot整合Thymeleaf的使用,实现非ajax请求后台的数据实现和遍历效果,以及数据的页面展示
  9. python web工资怎么样_月薪21170的Python Web岗,学到什么程度能找到工作?
  10. 如何找到网站服务器的源代码_企业网站如何选择服务器?