1.策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法可以独立于使用它的客户而变化。

(1)Context(环境类):环境类是使用算法角色,它在解决某个问题(即实现某个功能)时可以采用多种策略。在环境类中维持一个对抽象策略类的引用实例,用于定义所采用的策略。

(2)Strategy(抽象策略类):抽象策略类所支持的算法声明了抽象方法,是所有策略类的父类,它可以是抽象类也可以是具体类,也可以是接口。环境类通过抽象策略类中申明的方法在运行时调用具体策略类中实现的算法。

(3)ConcreateStrategy(具体策略类):具体策略类实现了在抽象策略类中生命的算法,在运行时具体策略类将覆盖在环境类中定义的抽象策略类对象,使用一种具体的算法实现某个业务功能

/**抽象策略类,在使用策略模式时,需要将算法从环境类中提取出来*/
public abstract class AbstractStrategy{public abstract void algorithm();//声明抽象算法
}
/**具体策略类*/
public class ConcreteStrategyA extends AbstractStrategy{//算法的具体实现public void algorithm(){//算法A}
}
/**环境类*/
public class Context{private AbstractStrategy strategy;//维持一个对抽象策略类的引用public void setStrategy(AbstractStrategy strategy){this.strategy = strategy;}//调用策略类中的方法public void algorithm(){strategy.algorithm();}
}
/**客户端测试类的片段*/
···
Context context = new Context();
AbstractStrategy strategy;
strategy = new ConcreateStrategyA();//可以在运行时指定类型,通过配置文件和反射机制实现
context.setStrategy(strategy);
context.algorithm();
···

2.代码实例介绍:小明要从北京出发到武汉,现在有飞机、火车、大巴三种公共交通以供选择,小明要看乘坐这三种交通方式所需的时间。因此计算乘坐这三种交通所需要的时间就是三种算法。然后小明再从这三种算法中选一种交通方式。代码如下:

/**速度类,充当抽象策略类*/
public interface Speed {public double needtime(double distance);
}
/**火车类,充当具体策略类*/
public class Train implements Speed {private double SPEED = 100.0;//公里每小时private double time;public double needtime(double distance){System.out.println("学生票");return time = distance/SPEED;}
}
/**公共汽车类,充当具体策略类*/
public class Bus implements Speed {private final double SPEED = 60.0;//公里每小时private double time;public double needtime(double distance){System.out.println("公共汽车");return time=distance / SPEED;}
}
/**飞机类。充当具体策略类*/
public class Airplane implements Speed {private double SPEED=800.0;//公里每小时private double time;public double needtime(double distance){System.out.println("飞机");return time = distance/SPEED;}
}
/**两地距离类,充当环境类*/
public class Apart{private double distance;private Speed speed;//维持一个对抽象折扣类的引用public void setDistance(double distance){this.distance = distance;}//注入了一个折扣类对象public void setSpeed(Speed speed){this.speed = speed;}public double getSpeed(){//调用折扣类的折扣价计算方法return speed.needtime(this.distance);}
}
/**客户端测试类*/
public class Client{public static void main(String args[]){Apart at = new Apart();double originalDistance = 1000.0;//两地的距离,单位公里double time;//需要用的时间at.setDistance(originalDistance);System.out.println("两地距离为:"+originalDistance);System.out.println("--------------------------");//discount = (Discount)XMLUtil.getBean();//可以用反射机制得到所用交通的对象,反射机制之前已经有介绍Speed speed = new Train();at.setSpeed(speed);//注入折扣对象time= at.getSpeed();System.out.println("需要时间为:"+time);}
}

3.代码运行结果

Java设计模式策略模式(附实例代码)每天一学设计模式相关推荐

  1. 设计模式-策略模式(Strategy)-Java

    设计模式-策略模式(Strategy)-Java 目录 文章目录 1.前言 2.示例案例-电影票打折方案 3.策略模式概述 3.1.策略模式定义 3.2.策略模式结构 3.3.策略模式结构图中角色 3 ...

  2. [设计模式] ------ 策略模式实战:java中替代if-else的大段逻辑

    java中用策略模式替代if-else的大段逻辑 问题: java本来是一门以面向对象为主的语言,但很多人嘴上说着java面向对象,然后除了表映射实体之外,其他的还是面向过程的思路. 就比如今天要说的 ...

  3. java 策略模式 促销_java设计模式——策略模式

    一. 定义与类型 定义:针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换.策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能.当代码中 ...

  4. Java设计模式-策略模式作业

    Java设计模式-策略模式作业,所有类和接口均在一个package内 文章目录 前言 一.作业内容 二.具体实现 1.类图 2.Strategy接口 3.PreCopyStrategy类 4.Post ...

  5. 关于设计模式——策略模式-Strategy Pattern

    文章目录 1 策略模式 1.1 模拟鸭子 1.2 设计原则 1.3 整合行为 1.4 模拟鸭子代码的代码 1.5 动态设定行为 1.6 重新查看整体 1.7 继承和组合 1.8 总结 1.9 优劣期间 ...

  6. 设计模式 – 策略模式(Strategy)

    2019独角兽企业重金招聘Python工程师标准>>> 实例:商店促销 (1)首先考虑用简单工厂模式进行设计 Ø  客户端代码Main.java package com.yilong ...

  7. Springboot 使用设计模式- 策略模式

    前言 直白点,什么场景我们需要使用到设计模式- 策略模式. 在平常的springboot项目里面做CRUD,我们的习惯性基本是 一个mapper,一个service,一个serviceImpl. 但是 ...

  8. 李建忠设计模式——策略模式Strategy

    目录 1.策略模式定义 1.动机 2.模式定义 3.结构 2.实现例子 1.问题描述 2.代码实现 3.要点总结 4.参考 1.策略模式定义 1.动机 软件构建过程中,某些对象使用的算法可能多种多样, ...

  9. 设计模式-策略模式(Go语言描述)

    好久没有更新博客了,最近也是在忙着充电,今天这篇博客开始,我们来了解一下设计模式. 设计模式 那什么是设计模式呢?首先来看看我从百科上copy下来的概念吧. 设计模式/软件设计模式(Design pa ...

  10. 设计模式-策略模式替换if else

    设计模式-刚来的大神彻底干掉了代码中的if else- 转载声明 本文大量内容系转载自以下文章,有删改,并参考其他文档资料加入了一些内容: 刚来的大神彻底干掉了代码中的if else- 作者:漫话编程 ...

最新文章

  1. WPF学习笔记(二):初学者避坑实录
  2. oracle dbfile数,通过案例学调优之--Oracle参数(db_file_multiblock_read_count)
  3. VMM2012应用指南之12- 创建自助服务用户并分配云
  4. Spark内核解析之五:Spark Shuffle解析
  5. 最大数组全局还是局部的问题
  6. 选项菜单-上下文菜单
  7. 移远ec20型号区别_移远EC20CEFDKG PCIE 全网通4G模块 增加B5频段 性价更高
  8. python学习笔记7-读取pdf并输出到excel
  9. java实现modbus rtu协议与 modscan等工具(3)物理连接
  10. 百钱买百鸡问题,Python编程解决
  11. 音乐计算机锦鲤抄,十首古风歌曲,锦鲤抄上榜,哪一首是你心目中的古风“神曲”?...
  12. SURF(Speeded Up Robust Features)算法原理
  13. 计算机寻址的最低单元,80c51单片机指令系统的7种寻址方式
  14. 基于知识图谱+机器学习,搭建风控模型的项目落地
  15. 帝国时代3如何快速实现低成本训练领事馆其它兵种
  16. 软件工程——(1)软件与软件工程 思维导图
  17. 计算机在中药材的应用,计算机在中医药中的应用
  18. Android 上面的定位和Poi检索
  19. 冯小刚:对“伪民族化”的拨乱反正
  20. 微信小程序(2)入门初识小程序

热门文章

  1. java 多阶矩阵求逆_求N阶矩阵的逆矩阵 java
  2. Ubuntu 16.04 + cuda-8.0 + cudnn-6.0 + Tensorflow1.4和Caffe(极其简单)
  3. 初中计算机考试wps文字,初中信息技术WPS表格测试题.docx
  4. SQL中的in、not in语句遇到null时的坑点
  5. 告别百度网盘,安装自己的专属网盘——Cloudreve,不限制下载速度!
  6. 微信怎样将图片上的文字变成文档
  7. oracle数据库数据备份
  8. 手机写python工具_GitHub - littleningmeng/pyphone: Python实现的安卓手机投屏工具
  9. HTTPS证书过期|SSL证书过期 |华硕路由器| NAS|Certtificate is not valid
  10. WSUS客户端更新补丁失败(1)