Java经典设计模式之策略模式原理与用法详解

 更新时间:2017年08月07日 09:03:54   作者:迟做总比不做强  
这篇文章主要介绍了Java经典设计模式之策略模式,简单说明了策略模式的概念、原理并结合实例形式分析了java策略模式的具有用法与相关注意事项,需要的朋友可以参考下

本文实例讲述了Java经典设计模式之策略模式。分享给大家供大家参考,具体如下:

策略模式指:策略模式指将程序中可变部分抽象分离成一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

策略模式一般由下面三部分组成:

1. 抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
2. 具体策略角色:包装了相关的算法和行为。
3. 环境角色:持有某一个策略类的引用,客户端调用。

策略模式设计原则:

1. 把程序中需要变化的部分抽离出来,独立于不变的部分
2. 面向接口编程,而不是面向实现编程,多作组合 ,少用继承。(组合 :在类中增加一个私有域,引用另外一个已经有的类的实例,通过调用实例的方法从而获得新的功能)

应用举例,以银行为例,可能有点不恰当

比如我们应用要接入银行支付功能。我们都知道,银行都有支付功能,随着技术的发展,银行具有了开通网络支付的功能。现在我们遇到的问题是,我们要增加支付的银行,但是有的银行还没有开通网络银行,有的已经开通了,而且也要把原有接入 的银行添加上网络银行功能(如果已经开通的话)。

//银行基类,为了适应变化,增加了网络支付处理的策略处理接口BankStrategy
public abstract class Bank {
private BankStrategy mBankStrategy;
public void setmStrategy(BankStrategy mStrategy) {
this.mBankStrategy = mStrategy;
}
public void payMoney() {
System.out.println("我具有支付功能");// 所有银行共同的特征
}
public abstract void serviceStyle();// 但每个银行有不同的服务方法(比的就是服务),具体的子类实现
public void netBank(){//开通网上银行
mBankStrategy.netPay();
}
}
//———-银行策略接口———————————
public interface BankStrategy {
void netPay();// 添加网络支付功能
}
//————–增加开通网络支付的策略实现类————
public class CanNetBank implements BankStrategy {
@Override
public void netPay() {
System.out.println("我已经开通网络支付功能");
}
}
//————–也有不开通网络支付的银行—————
public class NoNetBank implements BankStrategy {
@Override
public void netPay() {
System.out.println("我不开通网络银行,咋的!");
}
}
//——-地球银行:现在开通网络支付——————
public class EarthBank extends Bank {
public EarthBank(){
super();
super.setmStrategy(new CanNetBank());//这里就实现了网络支付
}
@Override
public void serviceStyle() {
System.out.println("我的服务在事个地球上是最好的!");
}
}
//——–太阳银行,说离我们太远了,不开通网络银行——————-
public class SunBank extends Bank {
public SunBank(){
super();
super.setmStrategy(new NoNetBank());//这里就不开通了(当然可不调用 ,只是告诉下实现方法)
}
@Override
public void serviceStyle() {
System.out.println("我的服务像金子一样发光!");
}
}
//———测试类———————————–
public class Test {
public static void main(String[] args) {
System.out.println("———测试———–");
Bank duck=null;
duck=new EarthBank();
duck.serviceStyle();
duck.payMoney();
duck.netBank();
System.out.println("———测试———–");
duck=new SunBank();
duck.serviceStyle();
duck.payMoney();
duck.netBank();
}
}

结果打印

策略模式的优点:

1、 提供了管理相关的算法策略类,恰当使用继承可以把公共的代码转移到父类里面,避免重复的代码,使得架构也更加灵活。
2、 提供了可以替换继承关系的办法(组合)。继承也可以处理多种算法或行为,但算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。这样一来算法或行为的使用者就和算法或行为本身混在一起。使得动态改变算法变得复杂甚至不可行,也不符合开闭原则。
3、 相对于继承代码更好地得到复用,同时可以避免使用多重条件转移语句。

策略模式的缺点:

1、客户代码需要了解个策略实现的细节,只适用于客户端知道所有的算法或行为的情况。
2、 策略模式造成很多的策略类,每个具体策略类都会产生一个新类,增加了对象的数目。

更多java相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • Java操作Redis2种方法代码详解

    Java操作Redis2种方法代码详解

    这篇文章主要介绍了Java操作Redis2种方法代码详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 详解Spring容器的使用流程

    详解Spring容器的使用流程

    今天给大家带来的是关于Java的相关知识,文章围绕着Spring容器的使用流程展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Java通过正则表达式获取字符串中数字的方法示例

    Java通过正则表达式获取字符串中数字的方法示例

    最近工作中遇到了一个需求,需要利用java获取字符串中的数字,尝试几种方法后发现利用正则表达式实现最为方法,下面这篇文章就主要介绍了Java通过正则表达式获取字符串中数字的方法,文中给出了详细的示例代码,需要的朋友可以参考下。
    2017-03-03
  • java实现文件的上传功能

    java实现文件的上传功能

    这篇文章主要为大家详细介绍了java实现文件的上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • SpringBoot基于AbstractRoutingDataSource实现多数据源动态切换

    SpringBoot基于AbstractRoutingDataSource实现多数据源动态切换

    本文主要介绍了SpringBoot基于AbstractRoutingDataSource实现多数据源动态切换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Java 实战项目锤炼之仿天猫网上商城的实现流程

    Java 实战项目锤炼之仿天猫网上商城的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+jsp+servlet+mysql+ajax实现一个仿天猫网上商城项目,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • Java ConcurrentHashMap的源码分析详解

    Java ConcurrentHashMap的源码分析详解

    ConcurrentHashMap(CHM)是日常开发中使用频率非常高的一种数据结构,想对于普通的HashMap,CHM提供了线程安全的读写,CHM里面使用了许多比较精妙的优化&操作。本文主要对CHM的整体结构、初始化,查找,插入等做分析
    2023-03-03
  • java实现简单的五子棋游戏

    java实现简单的五子棋游戏

    这篇文章主要为大家详细介绍了java实现简单的五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Java深入浅出掌握SpringBoot之MVC自动配置原理篇

    Java深入浅出掌握SpringBoot之MVC自动配置原理篇

    在进行项目编写前,我们还需要知道一个东西,就是SpringBoot对我们的SpringMVC还做了哪些配置,包括如何扩展,如何定制,只有把这些都搞清楚了,我们在之后使用才会更加得心应手
    2021-10-10
  • Java多线程编程之Lock用法实例

    Java多线程编程之Lock用法实例

    这篇文章主要介绍了Java多线程编程之Lock用法实例,本文直接给出代码实例,需要的朋友可以参考下
    2015-05-05

最新评论