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

发布时间 - 2026-01-11 02:40:21    点击率:

本文实例讲述了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  # 设计模式  # 策略模式  # Java设计模式之策略模式原理与用法实例详解  # Java设计模式之策略模式定义与用法详解  # 23种设计模式(11)java策略模式  # java设计模式学习之策略模式  # Java设计模式之策略模式_动力节点Java学院整理  # Java设计模式之策略模式详解  # 对比Java设计模式编程中的状态模式和策略模式  # 详解Java设计模式编程中的策略模式  # Java设计模式之策略模式(Strategy模式)介绍  # Java通俗易懂系列设计模式之策略模式  # 子类  # 客户端  # 增加了  # 操作技巧  # 也不  # 都有  # 还没有  # 也有  # 我不  # 相关内容  # 还可以  # 就不  # 开通了  # 适用于  # 感兴趣  # 要把  # 数据结构  # 给大家  # 并将  # 问题是 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 零基础网站服务器架设实战:轻量应用与域名解析配置指南  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  Linux后台任务运行方法_nohup与&使用技巧【技巧】  使用C语言编写圣诞表白程序  非常酷的网站设计制作软件,酷培ai教育官方网站?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  php结合redis实现高并发下的抢购、秒杀功能的实例  如何生成腾讯云建站专用兑换码?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  济南网站建设制作公司,室内设计网站一般都有哪些功能?  Linux安全能力提升路径_长期防护思维说明【指导】  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  什么是javascript作用域_全局和局部作用域有什么区别?  如何在Windows虚拟主机上快速搭建网站?  如何挑选优质建站一级代理提升网站排名?  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  Laravel如何使用Livewire构建动态组件?(入门代码)  如何在阿里云香港服务器快速搭建网站?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  微信公众帐号开发教程之图文消息全攻略  如何快速生成可下载的建站源码工具?  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  如何用PHP快速搭建CMS系统?  Laravel如何发送系统通知?(Notification渠道示例)  Laravel模型事件有哪些_Laravel Model Event生命周期详解  如何获取免费开源的自助建站系统源码?  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  jQuery validate插件功能与用法详解  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  网站建设保证美观性,需要考虑的几点问题!  清除minerd进程的简单方法  EditPlus中的正则表达式 实战(2)  Python并发异常传播_错误处理解析【教程】  如何快速上传自定义模板至建站之星?  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  如何快速搭建安全的FTP站点?  javascript日期怎么处理_如何格式化输出  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  如何实现建站之星域名转发设置?  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册