策略模式也是我们经常使用的模式,它的定义如下:将可变的部分从程序中抽象分离出来成为算法接口,在该部分下分别封装一系列算法实现并使它们可以相互替换。

  举个例子,我们现在有三种支付方式:支付宝支付,微信支付,银行App支付。假设我们要做一个软件,每个软件都有各自对应的支付方式,在这种情况下,我们就可以把支付方式这个策略分离出来,就可以很方便的在写软件类时使用使用想使用的策略方式。

  把策略做成一个接口,然后把软件做成抽象类,就可以通过继承来很方便的对各个具体软件类和具体策略类进行编写。实现代码如下:

  1. PayStrategy.java
  2. //支付策略接口
  3. public interface PayStrategy {
  4. void pay();
  5. }
  6.  
  7. WeiXin.java
  8. public class WeiXin implements PayStrategy {
  9. //微信支付类
  10. @Override
  11. public void pay() {
  12. // TODO Auto-generated method stub
  13. System.out.println("---请使用微信支付---");
  14. }
  15.  
  16. }
  17.  
  18. Zhifubao.java
  19. public class Zhifubao implements PayStrategy {
  20. //支付宝支付类
  21. @Override
  22. public void pay() {
  23. // TODO Auto-generated method stub
  24. System.out.println("---请使用支付宝支付---");
  25.  
  26. }
  27.  
  28. }

  29. BanApp.java
  30. public class BankApp implements PayStrategy {
  31. //银行App支付类
  32. @Override
  33. public void pay() {
  34. // TODO Auto-generated method stub
  35. System.out.println("---请使用银行app支付---");
  36. }
  37.  
  38. }

  再使用一个软件抽象类,和需要的具体软件类。

  1. PaySoftware.java
  2. //软件抽象类
  3. public abstract class Paysoftware {
  4. //使用组合的方式来实现策略模式
  5. private PayStrategy strategy;
  6.  
  7. public void setStrategy(PayStrategy strategy) {
  8. this.strategy = strategy;
  9. }
  10.  
  11. public void payInterface() {
  12. strategy.pay();
  13. }
  14.  
  15. //没有使用策略模式的方法
  16. public abstract void sofwareStatement();
  17. }
  18.  
  19. SoftwareA.java
  20. public class SoftwareA extends Paysoftware {
  21. public SoftwareA() {
  22. // TODO Auto-generated constructor stub
  23. super();
  24. super.setStrategy(new Zhifubao());
  25. }
  26. public void sofwareStatement() {
  27. System.out.println("我是软件A");
  28. }
  29.  
  30. }
  31.  
  32. SoftwareB.java
  33. public class SoftWareB extends Paysoftware {
  34.  
  35. public SoftWareB() {
  36. // TODO Auto-generated constructor stub
  37. super();
  38. super.setStrategy(new BankApp());
  39. }
  40. public void sofwareStatement() {
  41. System.out.println("我是软件B");
  42. }
  43.  
  44. }
  1.  

  再定义一个测试类

  1. TestDrive.java
  2. public class TestDrive {
  3.  
  4. public static void main(String[] args) {
  5. // TODO Auto-generated method stub
  6. Paysoftware softwarea=new SoftwareA();
  7. softwarea.sofwareStatement();
  8. softwarea.payInterface();
  9.  
  10. }
  11.  
  12. }

  结果如下:

我是软件A
---请使用支付宝支付---

  这样我们就实现了策略模式。

Java的策略模式的更多相关文章

  1. java设计模式 策略模式Strategy

    本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...

  2. JAVA 设计模式 策略模式

    用途 Title 它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 策略模式是一种行为型模式. 结构

  3. 我的Java设计模式-策略模式

    今天给大家说说田忌赛马的故事.如有雷同,纯属巧合!话说在战国时期,群雄割据,硝烟四起,茶余饭后还是少不了娱乐活动的,其中赛马是最火爆的.一天,孙膑看到田忌像个死鸡似的就知道肯定赛马又输给了齐威王,立马 ...

  4. Java设计模式—策略模式

    1.策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern). 定义如下:     Define a family of algorithms,e ...

  5. Java设计模式-策略模式详解

    前言 在软件领域中,设计模式作为一种经典的开发实践常常需要我们去深入的理解,而策略模式作为设计模式的一种,使用频率也是相对来说比较高的,在Java中,当我们学习TreeSet集合的时候,就采用了经典的 ...

  6. java使用策略模式代替if/else

    平时在开发中避免不了使用大量的if else语句,但过多层的if else对于性能有很大的开销,类似如下代码 public class MainStart { public static void m ...

  7. Java 关于策略模式+简单工厂模式下的思考

    导读 最近在做公司一个消息网关的服务,包括:短信.微信.邮件等,所有请求通过一个入口,方便接口的管理(记录日志.接口限流白名单啥的).如何写这个接口呢,还有为了以后扩展,对接过短信.微信.公众号的童鞋 ...

  8. Java 设计模式--策略模式,枚举+工厂方法实现

    如果项目中的一个页面跳转功能存在10个以上的if else判断,想要做一下整改 一.什么是策略模式 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,最终可以实现解决 ...

  9. java设计模式--策略模式

    策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 本文地址:http:// ...

随机推荐

  1. 关于C++中字符串与数字的互相转换

    方法搬自博客:  Qt数据类型转换  侵删 1. 把QString转换为double类型 //法一: QString str="123.45"; double val=str.to ...

  2. Linux高级文件系统管理(8)

    如果您的 Linux 服务器有多个用户经常存取数据时,为了维护所有使用者在硬盘容量的公平使用,磁碟配额 (Quota) 就是一项非常有用的工具,另外,如果你的用户常常抱怨磁盘容量不够用,那么更进阶的文 ...

  3. 不同的最小割(cqoi2016,bzoj4519)(最小割树)

    学过图论的同学都知道最小割的概念:对于一个图,某个对图中结点的划分将图中所有结点分成 两个部分,如果结点\(s,t\)不在同一个部分中,则称这个划分是关于\(s,t\)的割.对于带权图来说,将 所有顶 ...

  4. Android常用布局属性解析 -- Layout_weight

    Layout_weight是Android开发中一个比较常用的布局属性,在面试中也经常被问到.下面通过实例彻底搞懂Layout_weight的用法. 先看下面的布局代码: <?xml versi ...

  5. Shell - 简明Shell入门03 - 字符串(String)

    示例脚本及注释 #!/bin/bash str="Shell" str2="Hello $str !" str3="Hello ${str} !&qu ...

  6. SQL面试题之行转列

    典型的课程表: mysql> select * from course; +----+------------+----------+------------+ | id | teacher_i ...

  7. Python-doc rst文件打开

    Python rst文件打开 RST与Python类似Javadoc与Java. 如果下载了别人的Python源码,里面有rst文件夹,我们可以转为html后用浏览器打开 某个开源项目的index.r ...

  8. 解决ubuntu安装系统默认没有创建root用户

    安装ubuntu操作系统的时候,默认没有设置root账户的步骤!!! 这样在操作系统安装完成之后,就没有root用户, 一般,当前的普通用户,如果需要执行一些命令的时候,只要在命令前边加上sudo就行 ...

  9. idea 没有智能提示

    开发工具要对源码产生提示,现在比较流行的是使用 .d.ts 文件 来编写提示消息 以下的解决办法不是根本之道,估计是开发工具有什么地方可以设置 自动下载 .d.ts 文件,知道的读者还请留言赐教~ 使 ...

  10. opencv实现正交匹配追踪算法OMP

    //dic: 字典矩阵: //signal :待重构信号(一次只能重构一个信号,即一个向量) //min_residual: 最小残差 //sparsity:稀疏度 //coe:重构系数 //atom ...