当前位置: 首页 > news >正文

《java与模式》学习系列——策略模式

 

一、策略(Strategy)模式的结构图

策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使他们可以互相替换,策略模式使得算法可以在不影响到客户端的情况下发生变化。

其结构图如下:

其中如果所有的具体策略类都有一些共有的行为,应当把这些公有的行为放到共同的抽象策略角色Strategy类里面。这时候抽象策略角色必须要用java抽象类实现。

二、策略模式在java中的应用

       使用策略模式的例子主要在Java.awtSwing库中看到。

       AWT中的LayoutManager

       Java.awt类库需要在运行期间动态的由客户端决定一个Container对象怎样排列它所有的GUI构件。Java语言提供了几种不同的排列方式,包装在不同的类里:BorderLayoutFlowLayoutGridLayoutGridBagLayoutCardLayout。其类图如下:

Swing中的Border

在任何一个Swing构件上都可以画上边框(Border),比如panelbutton等,而Swing库提供了很多的边框类型,包括bevellinetitled以及CompoundBorder类等,Swing构件的基类是JComponent类,而这个类负责为Swing构件画上边框。

JComponent类实现了paintBorder()方法,并且保持一个私有的对边框对象的引用。由于Border是一个接口而不是具体类,因此,这个引用可以指向任何实现了Border借口的边框对象。其类图如下:

三、在什么情况下使用策略模式

1、如果在一个系统里面有许多类,他们之间的区别仅仅在于他们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

2、一个系统需要动态的在几种算法中选择一种。那么这些算法可以包装到一个个的具体算法里面,而这些具体算法类都是一个抽象算法类的子类。换言之,这些具体算法类均有统一的接口,由于多态性原则,客户端可以选择使用任何一个具体算法类,并只持有一个数据类型是抽象算法类的对象。

3、一个系统的算法使用的数据不可以让客户端知道。策略模式可以避免让客户端涉及到不必要接触到的复杂的和只与算法有关的数据。

4、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。使用策略模式可以避免使用难以维护的多重条件选择语句。

 

相关文章:

  • mysql:字符串转换为日期类型
  • 《java与模式》学习系列——模版方法模式
  • 《java与模式》学习系列——备忘录模式
  • 向量加减法运算及其几何意义
  • 关于 Java 中 finally 语句块的深度辨析
  • Linux 基础(一)
  • Windows 7 应用程序exe图标丢失的修复
  • 算法导论学习笔记——堆排序
  • 让Docker容器使用静态独立的外部IP(便于集群组建)
  • 算法导论学习笔记——插入排序
  • 本地Git仓库与Github远程仓库同步
  • 算法导论学习笔记——合并排序
  • 算法导论学习笔记——最大优先级队列
  • Data.xml文件找不到的解决
  • 算法导论学习笔记——快速排序算法
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • Java方法详解
  • Kibana配置logstash,报表一体化
  • node学习系列之简单文件上传
  • python大佬养成计划----difflib模块
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • ubuntu 下nginx安装 并支持https协议
  • 大快搜索数据爬虫技术实例安装教学篇
  • 基于web的全景—— Pannellum小试
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 那些年我们用过的显示性能指标
  • 山寨一个 Promise
  • 怎样选择前端框架
  • ionic入门之数据绑定显示-1
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​比特币大跌的 2 个原因
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #Java第九次作业--输入输出流和文件操作
  • #微信小程序(布局、渲染层基础知识)
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (办公)springboot配置aop处理请求.
  • (编译到47%失败)to be deleted
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (五)关系数据库标准语言SQL
  • (一)appium-desktop定位元素原理
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .gitignore文件—git忽略文件
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET CLR Hosting 简介
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .net反混淆脱壳工具de4dot的使用
  • .NET连接数据库方式
  • .NET项目中存在多个web.config文件时的加载顺序
  • .net专家(张羿专栏)
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [2023-年度总结]凡是过往,皆为序章
  • [acwing周赛复盘] 第 94 场周赛20230311