策略模式(Strategy Pattern)
public abstract class Duck {
/**
* 显示鸭子的信息
*/
public abstract void display();
/**
* 鸭子行为
*/
public void fly() {
System.out.println("鸭子会飞");
}
/**
* 鸭子行为
*/
public void quack() {
System.out.println("鸭子会叫");
}
}
public class WildDuck extends Duck {
/**
* 显示鸭子信息
*/
public void display() {
System.out.println(" 这是野鸭子 ");
}
}
public class PekingDuck extends Duck {
/**
* 显示鸭子信息
*/
public void display() {
System.out.println(" 这是北京鸭 ");
}
/**
* 因为北京鸭不能飞翔,所以需要重写 fly
*/
@Override
public void fly() {
System.out.println("北京鸭不能飞翔");
}
}
public class ToyDuck extends Duck {
/**
* 显示鸭子信息
*/
public void display() {
System.out.println(" 这是玩具鸭 ");
}
/**
* 因为玩具鸭不能飞翔,所以需要重写 fly
*/
@Override
public void fly() {
System.out.println("玩具鸭不能飞翔");
}
/**
* 因为玩具鸭不能叫,所以需要重写 quack
*/
@Override
public void quack() {
System.out.println("玩具鸭不能叫");
}
}
public interface FlyBehavior {
/**
* 抽象的飞行方法
*/
void fly();
}
public class GoodFlyBehavior implements FlyBehavior {
/**
* 实现飞行方法
*/
public void fly() {
System.out.println("飞翔技术高超");
}
}
public class BadFlyBehavior implements FlyBehavior {
/**
* 实现飞行方法
*/
public void fly() {
System.out.println("飞翔能力一般");
}
}
public class NoFlyBehavior implements FlyBehavior {
/**
* 实现飞行方法
*/
public void fly() {
System.out.println("没有飞行能力");
}
}
public abstract class Duck {
/* 聚合飞翔行为策略接口 */
protected FlyBehavior flyBehavior;
/**
* 显示鸭子的信息
*/
public abstract void display();
/**
* 鸭子行为
*/
public void fly() {
if (flyBehavior != null) {
flyBehavior.fly();
}
}
/**
* 鸭子行为
*/
public void quack() {
System.out.println("鸭子会叫");
}
}
/**
* 初始化飞行行为
*/
public WildDuck() {
flyBehavior = new GoodFlyBehavior();
}
/**
* 初始化飞行行为
*/
public PekingDuck() {
flyBehavior = new NoFlyBehavior();
}
/**
* 初始化飞行行为
*/
public ToyDuck() {
flyBehavior = new NoFlyBehavior();
}
public class Client {
/**
* 测试方法
*
* @param args
*/
public static void main(String[] args) {
System.out.println("======野鸭子======");
WildDuck wildDuck = new WildDuck();
wildDuck.fly();
System.out.println("======北京鸭======");
PekingDuck pekingDuck = new PekingDuck();
pekingDuck.fly();
System.out.println("======玩具鸭======");
ToyDuck toyDuck = new ToyDuck();
toyDuck.fly();
}
}

Integer[] arr = {1,5,3,7,8};
Arrays.sort(arr, new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
策略模式的注意事项和细节:1)策略模式的关键是:分析项目中变化部分与不变部分2)策略模式的核心思想:多用组合/聚合 少用继承;用行为类组合,而不是行为的继承。更具弹性3)体现了 "对修改关闭,对扩展开放" 原则,客户端增加行为不用修改原有代码,只要添加一种策略(或者行为)即可,避免了使用多重转移语句(if...else if...else)4)提供了可以替换继承关系的方法:策略模式将算法封装在独立的 Strategy 类中使得你可以独立于其 Context 改变它,使它易于切换、易于理解、易于扩展5)需要注意的是:每添加一个策略就要增加一个类,当策略过多是会导致类数目庞大
相关文章:
策略模式(Strategy Pattern)
编写鸭子项目,具体要求如下: 1) 有各种鸭子(比如 野鸭、北京鸭,水鸭等,鸭子有各种行为,比如 叫,飞行等) 2)显示鸭子的信息 传统方案解决鸭子问题 1࿰…...
《Qt6开发及实例》6-2 Qt6基础图形的绘制
目录 一、绘图框架设计 二、绘图区的实现 2.1 PaintArea类 2.2 PaintArea类讲解 三、主窗口的实现 3.1 MainWidget类 3.2 MainWidget类讲解 3.3 槽函数编写 3.5 其他内容 一、绘图框架设计 界面 两个类 二、绘图区的实现 2.1 PaintArea类 paintarea.h #ifndef…...
LeetCode 382. 链表随机节点
原题链接 难度:middle\color{orange}{middle}middle 题目描述 给你一个单链表,随机选择链表的一个节点,并返回相应的节点值。每个节点 被选中的概率一样 。 实现 SolutionSolutionSolution 类: Solution(ListNodehead)Solution…...
iOS开发AppleDeveloper中给别人授权开发者权限后,对方一直显示不了我的开发账号team
在iOS开发经常出现多人协作开发的情况。这时我们通常要发邮件邀请别的用户为开发者或者app管理就可以开发我们自己的项目了。但是这次我给别人授权开发者权限后,发现别人权限中没有证书相关权限如图:并且别人登录该账号后,在xcode中只有一个看…...
FreeRTOS数据类型和编程规范
目录 数据类型 变量名 函数名 宏的名 数据类型 每个移植的版本都含有自己的portmacro.h头文件,里面定义了2个数据类型 TickType_t FreeRTOS配置了一个周期性的时钟中断:Tick Interrupt每发生一次中断,中断次数累加,这被称为t…...
【python知识】win10下如何用python将网页转成pdf文件
一、说明 本篇记录一个自己享用的简单工具。在大量阅读网上文章中,常常遇到一个专题对应多篇文章,用浏览器的收藏根本不够。能否见到一篇文章具有搜藏价值,就转到线下,以备日后慢慢消化吸收。这里终于找到一个办法,将在…...
C语言常见关键字
写在前面 这个博客是结合C语言深度解剖这本书和我以前学的知识综合而成的,我希望可以更见详细的谈一下C语言的关键字,内容有点多,有错误还请斧正. 常见关键字 下面我们说下C语言的关键字,所谓的关键字是指具有特定功能的单词,我们可以使用关键字来帮助我们完成不同的事物.C语…...
【MT7628】固件开发-SDK4320添加MT7612E WiFi驱动操作说明
解压5G WiFi MT7612E驱动1.1解压指令 tar -xvf MT76x2E_MT7620_LinuxAP_V3.0.4.0_P2_DPA_20160308.tar.bz2 1.2解压之后会出现以下两个目录 rlt_wifi rlt_wifi_ap 1.3将解压后的文件拷贝到系统下 拷贝路径 RT288x_SDK/source/linux-2.6.36.x/drivers/net/wireless 内核中打开驱…...
如何从手工测试进阶自动化测试?阿里10年测开经验分享...
随着行业的竞争加剧,互联网产品迭代速度越来越快,QA 与测试工程师都需要在越来越短的测试周期内充分保证质量。可是,App 测试面临着很多挑战,比如多端发布、多版本发布、多机型发布等等,导致了手工测试很难完全胜任。因…...
C++复习笔记11
1. vector是表示可变大小数组的序列容器。 2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被…...
【MT7628】固件开发-SDK4320添加MT7628 WiFi驱动操作说明
解压2.4G WiFi MT7628驱动1.1解压指令 tar -xvf MT7628_LinuxAP_V4.1.0.0_DPA_20160310.tar.bz2 1.2解压之后会出现以下两个目录 mt_wifi mt_wifi_ap 1.3将解压后的文件拷贝到系统下 拷贝路径 RT288x_SDK/source/linux-2.6.36.x/drivers/net/wireless 内核中打开驱动编译修改R…...
C#开发的OpenRA游戏加载界面的实现
C#开发的OpenRA游戏加载界面的实现 游戏的UI是一个游戏必备, 但是游戏的UI都是自己处理的,不能使用像Windows自带的UI。 这样游戏的UI,其实也是使用游戏的方式来显示的, 只不过使用了低帧率的方式来显示。 比如OpenRA游戏界面,就会显示如下: 游戏的界面有很多,先从一个简…...
渲染农场优势是什么_云渲染农场怎么用?
在回答渲染农场的优势这个问题之前,我先申明一下本文中提到的渲染农场/云渲染平台/云渲染农场,都特指CG领域内的专业3D渲染平台,有一些文章会强调这个叫法的区别,但是业内一般都不会分这么细,所以也就不赘述了。渲染农…...
SoapUI、Jmeter、Postman三种接口测试工具的比较分析
目录 前言 1. 用例组织方式 2. 支持的接口类型与测试类型 3. 配置不同接口类型 4. 自定义变量以及变量的作用域 5. 数据源、生成器,进行参数化 6. 流程控制 7. 结果解析、展示 8. 断言 9. 脚本扩展能力 10. 团队协作 总结 重点:配…...
Python内置函数 — sort,sorted
1、sort 列表的属性方法,对列表进行排序,默认升序,返回None值。 源码注释: """ Sort the list in ascending order and return None.The sort is in-place (i.e. the list itself is modified) and stable (i.e.…...
mysql事务隔离级别
mysql锁机制及原理1.隔离级别2.实践2.1查看事务隔离级别2.2 设置隔离级别2.3 不可重复读2.4 幻读3.幻读怎么解决3.1 Record Lock3.2 Gap Lock3.3 Next-Key Lock引用:https://blog.csdn.net/xinyuan_java/article/details/1284932051.隔离级别 SERIALIZABLE(序列化)…...
【C++】string类(下)
文章目录1.迭代器(正向遍历)begin有两个版本2.反向迭代器(反向遍历)rbegin由两个版本3. at4. insert ——头插在pos位置前插入一个字符串在pos位置前插入n个字符在迭代器前插入一个字符5. erase从pos位置开始删除len个字符从迭代器位置开始删除6. replace——替换从pos位置开始…...
Elasticsearch: Prefix queries - 前缀查询
Prefix queries 被用于在查询时返回在提供的字段中包含特定前缀的文档。有时我们可能想使用前缀查询单词,例如 Leonardo 的 Leo 或 Marlon Brando、Mark Hamill 或 Martin Balsam 的 Mar。 Elasticsearch 提供了一个前缀查询,用于获取匹配单词开头部分&a…...
GEE学习笔记 七十七:GEE学习方法简介
这是一篇关于学习方法的思考探索,当然我不会大篇文章介绍什么学习方法(因为我也不是这方面的专家?),这个只是总结一下我是如何学习GEE以及在学习中遇到问题时如何解决问题的。我写这篇文章的目的就是在和一些学习GEE的新同学接触…...
20基于主从博弈的智能小区代理商定价策略及电动汽车充电管理MATLAB程序
参考文档:《基于主从博弈的智能小区代理商定价策略及电动汽车充电管理》基本复现仿真平台:MATLABCPLEX/gurobi平台优势:代码具有一定的深度和创新性,注释清晰,非烂大街的代码,非常精品!主要内容…...
Flink任务传参避坑指南:除了--key value,命令行提交jar时这几种参数传递方式你试过吗?
Flink任务传参避坑指南:从命令行到生产环境的全链路实践 在分布式计算领域,参数传递看似简单却暗藏玄机。记得去年我们团队将一个看似稳定的Flink作业从测试环境迁移到生产环境时,仅仅因为一个参数传递方式的差异,导致整个数据处理…...
translategemma-4b-it镜像免配置:Docker+Ollama一键拉起图文翻译服务
translategemma-4b-it镜像免配置:DockerOllama一键拉起图文翻译服务 本文介绍如何通过Docker和Ollama快速部署translategemma-4b-it镜像,实现零配置的图文翻译服务,支持55种语言的智能翻译。 1. 快速了解translategemma-4b-it translategemm…...
OpenClaw数据清洗:Qwen3-32B处理Excel异常值与格式转换
OpenClaw数据清洗:Qwen3-32B处理Excel异常值与格式转换 1. 为什么选择OpenClaw处理Excel数据 上周我需要处理一份包含3万行销售记录的Excel文件,手动检查异常值和格式转换花了整整两天时间。当我第三次因为格式不一致导致分析脚本报错时,终…...
AT32F403A开发板串口通信进阶:V2库下弹性DMA与空闲中断的完美搭配
AT32F403A开发板串口通信进阶:V2库下弹性DMA与空闲中断的完美搭配 在嵌入式开发中,串口通信作为最基础也最常用的外设接口之一,其稳定性和效率直接影响着整个系统的性能表现。AT32F403A作为一款高性能ARM Cortex-M4内核微控制器,其…...
【开题答辩全过程】以 基于python的天气预测可视化系统为例,包含答辩的问题和答案
个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…...
BLE 协议栈(GAP,GATT;HCI,LL,PHY)
文章目录 蓝牙发展历程 蓝牙协议分层 蓝牙协议栈架构 一、主协议层(Host) 1.1 GAP(Generic Access Profile,通用访问规范) 1.2 GATT(Generic Attribute Profile,通用属性规范) 1.3 SM(Security Manager,安全管理) 1.4 ATT(Attribute Protocol,属性协议) 1.5 L2CA…...
FUTURE POLICE模型API网络安全防护配置指南
FUTURE POLICE模型API网络安全防护配置指南 最近在帮一个朋友部署他们团队的FUTURE POLICE模型服务,准备对外提供API。部署本身挺顺利,但聊到安全防护时,我发现他们想得有点简单了——直接把服务端口暴露在公网上,觉得有个密码登…...
Janus-Pro-7B模型部署避坑指南:解决403 Forbidden等常见网络错误
Janus-Pro-7B模型部署避坑指南:解决403 Forbidden等常见网络错误 你是不是也遇到过这种情况?好不容易把Janus-Pro-7B模型部署起来,满心欢喜地准备调用,结果浏览器或者命令行里弹出一个冷冰冰的“403 Forbidden”,瞬间…...
流形学习避坑指南:为什么你的t-SNE可视化效果总不好?
流形学习实战解析:从算法原理到可视化效果优化 当你第一次看到t-SNE生成的彩色散点图时,可能会被那些看似完美分离的簇所震撼。但当你真正开始在自己的数据集上应用时,却发现结果远不如预期——簇与簇之间模糊不清,甚至完全混在一…...
Qwen-Image镜像企业实操:用RTX4090D+Qwen-VL构建多模态客服图文问答系统
Qwen-Image镜像企业实操:用RTX4090DQwen-VL构建多模态客服图文问答系统 1. 项目背景与价值 在当今企业客服场景中,传统的纯文本问答系统已经难以满足用户需求。越来越多的客户倾向于通过图片、截图等方式提出问题,比如: 上传商…...
