《HeadFirst设计模式(第二版)》第一章源码
代码文件目录结构:

FlyBehavior.java
package Chapter1_StrategyPattern.ch1_3_behavior.behaviors.fly;public interface FlyBehavior {void fly();
}
FlyNoWay.java
package Chapter1_StrategyPattern.ch1_3_behavior.behaviors.fly;public class FlyNoWay implements FlyBehavior{@Overridepublic void fly() {System.out.println("I can't fly!");}
}
FlyRocketPowered.java
package Chapter1_StrategyPattern.ch1_3_behavior.behaviors.fly;public class FlyRocketPowered implements FlyBehavior{@Overridepublic void fly() {System.out.println("I'm flying with a rocket!");}
}
FlyWithWings.java
package Chapter1_StrategyPattern.ch1_3_behavior.behaviors.fly;public class FlyWithWings implements FlyBehavior{public void fly(){System.out.println("I'm flying!");}
}
QuackBehavior.java
package Chapter1_StrategyPattern.ch1_3_behavior.behaviors.quack;public interface QuackBehavior {public void quack();
}
MuteQuack.java
package Chapter1_StrategyPattern.ch1_3_behavior.behaviors.quack;public class MuteQuack implements QuackBehavior{@Overridepublic void quack() {System.out.println("<< Silence >>");}
}
Quack.java
package Chapter1_StrategyPattern.ch1_3_behavior.behaviors.quack;public class Quack implements QuackBehavior{@Overridepublic void quack() {System.out.println("Quack!");}
}
Squeak.java
package Chapter1_StrategyPattern.ch1_3_behavior.behaviors.quack;public class Squeak implements QuackBehavior{@Overridepublic void quack() {System.out.println("Squeak!");}
}
Duck.java
package Chapter1_StrategyPattern.ch1_3_behavior;import Chapter1_StrategyPattern.ch1_3_behavior.behaviors.fly.FlyBehavior;
import Chapter1_StrategyPattern.ch1_3_behavior.behaviors.quack.QuackBehavior;public abstract class Duck {FlyBehavior flyBehavior;QuackBehavior quackBehavior;public Duck(){}public void setFlyBehavior(FlyBehavior flyBehavior) {this.flyBehavior = flyBehavior;}public void setQuackBehavior(QuackBehavior quackBehavior) {this.quackBehavior = quackBehavior;}public void performFly(){this.flyBehavior.fly();}public void performQuack(){this.quackBehavior.quack();}public void swim(){System.out.println("the duck is swimming!");}public abstract void display();
}
MallardDuck.java
package Chapter1_StrategyPattern.ch1_3_behavior;import Chapter1_StrategyPattern.ch1_3_behavior.behaviors.fly.FlyWithWings;
import Chapter1_StrategyPattern.ch1_3_behavior.behaviors.quack.Quack;//绿头鸭
public class MallardDuck extends Duck {public MallardDuck(){this.flyBehavior = new FlyWithWings();this.quackBehavior = new Quack();}@Overridepublic void display() {System.out.println("this is a MallardDuck!");}
}
RedHeadDuck.java
package Chapter1_StrategyPattern.ch1_3_behavior;import Chapter1_StrategyPattern.ch1_3_behavior.behaviors.fly.FlyWithWings;
import Chapter1_StrategyPattern.ch1_3_behavior.behaviors.quack.Quack;public class RedHeadDuck extends Duck {public RedHeadDuck(){this.flyBehavior = new FlyWithWings();this.quackBehavior = new Quack();}@Overridepublic void display() {System.out.println("this is a redHeadDuck!");}
}
RubberDuck.java
package Chapter1_StrategyPattern.ch1_3_behavior;import Chapter1_StrategyPattern.ch1_3_behavior.behaviors.fly.FlyNoWay;
import Chapter1_StrategyPattern.ch1_3_behavior.behaviors.quack.Squeak;public class RubberDuck extends Duck{public RubberDuck(){this.flyBehavior = new FlyNoWay();this.quackBehavior = new Squeak();}@Overridepublic void display() {System.out.println("this is a rubberDuck!");}
}
DecoyDuck.java
package Chapter1_StrategyPattern.ch1_3_behavior;import Chapter1_StrategyPattern.ch1_3_behavior.behaviors.fly.FlyNoWay;
import Chapter1_StrategyPattern.ch1_3_behavior.behaviors.quack.MuteQuack;public class DecoyDuck extends Duck {public DecoyDuck(){this.flyBehavior = new FlyNoWay();this.quackBehavior = new MuteQuack();}@Overridepublic void display() {System.out.println("this is a DecoyDuck!");}
}
ModelDuck.java
package Chapter1_StrategyPattern.ch1_3_behavior;import Chapter1_StrategyPattern.ch1_3_behavior.behaviors.fly.FlyNoWay;
import Chapter1_StrategyPattern.ch1_3_behavior.behaviors.quack.MuteQuack;public class ModelDuck extends Duck{public ModelDuck(){this.quackBehavior = new MuteQuack();this.flyBehavior = new FlyNoWay();}@Overridepublic void display() {System.out.println("I'm a model duck!");}
}
MiniDuckSimulator.java
package Chapter1_StrategyPattern.ch1_3_behavior;import Chapter1_StrategyPattern.ch1_3_behavior.behaviors.fly.FlyRocketPowered;public class MiniDuckSimulator {public static void main(String[] args) {Duck mallard = new MallardDuck();mallard.performFly();mallard.performQuack();Duck model = new ModelDuck();model.performFly();model.setFlyBehavior(new FlyRocketPowered());model.performFly();}
}
notes.txt
ch1_1直接使用继承来应付新增子类的问题问题:
1.当子类鸭子的数量越来越多的时候,继承就难以保证整个系统的可维护性,因为每次添加一个子类,都要对对应的属性是否要实现进行考虑
2.代码在多个子类重复
3.代码在运行时难以改变ch1_2将其中某些非共通的行为抽取出来作为接口问题:
1.对于具有同一个行为的每个子类都会重复代码,可维护性差ch1_31.将某一类行为抽取出来作为一系列行为类,从is-a转为has-a ==> 将继承转成组合
2.使用setter实现动态设置行为设计模式:定义一个算法族,分别封装起来,是的他们之间可以相互变换,使得算法的变化独立于使用他的客户(鸭子)
运行结果:

相关文章:
《HeadFirst设计模式(第二版)》第一章源码
代码文件目录结构: FlyBehavior.java package Chapter1_StrategyPattern.ch1_3_behavior.behaviors.fly;public interface FlyBehavior {void fly(); } FlyNoWay.java package Chapter1_StrategyPattern.ch1_3_behavior.behaviors.fly;public class FlyNoWay imp…...
insert into select用法
文章目录 一、insert into select二、insert into select插入失败 本篇文章主要讲解insert into select 的用法,以及insert into select的坑或者注意事项。本篇文章中的sql基于mysql8.0进行讲解 一、insert into select 该语法常用于从另一张表查询数据插入到某表中…...
图像识别技术:计算机视觉的进化与应用展望
导言: 图像识别技术是计算机视觉领域的重要研究方向,它使计算机能够理解和解释图像内容,从而实现自动化和智能化的图像处理。随着深度学习等技术的快速发展,图像识别在诸多领域取得了重大突破,如自动驾驶、医疗影像分析…...
【免费送书】重新定义Python学习!
欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关…...
Qt 4. 发布exe
把ex2.exe放在H盘Ex2文件夹下,执行 H:\Ex2>windeployqt ex2.exe H:\Ex2>windeployqt ex2.exe H:\Ex2\ex2.exe 64 bit, release executable Adding Qt5Svg for qsvgicon.dll Skipping plugin qtvirtualkeyboardplugin.dll due to disabled dependencies (Qt5…...
消息队列的使用场景以及优缺点
消息队列是一种在应用系统之间传递消息的通信模式。它允许发送者将消息发布到一个队列中,而接收者则从队列中获取消息进行处理。 消息队列的主要特点包括: 异步通信:消息的发送和接收是异步进行的,发送者无需等待接收者的即时响应…...
掌握Python的X篇_17_循环语句(while;for var in ;range)
文章目录 1. 为什么需要循环2. while循环3. for...in循环4. range函数 1. 为什么需要循环 循环语句方便我们做重复的事情,比如: for i in range (0,3):print("重要的事情说三遍")运行效果如下: Python中有while循环和for循环两…...
IDEA maven 报错 malformed \uxxx encoding
IDEA maven 报错 malformed \uxxx encoding 最近搞几个JAVA项目总是出现上面错误,在网上搜的大部分都是删maven库,删jar包等等,每次都搞了好久才解决,今天无意中发现并不是包的问题, 解决办法 1.点击 idea 右侧的ma…...
Django实现音乐网站 ⑵
使用Python Django框架制作一个音乐网站,在系列文章1的基础上继续开发,本篇主要是后台歌手表模块开发。 目录 表结构设计 歌手表(singer)结构 创建表模型 设置图片上传路径 创建上传文件目录 生成表迁移 执行创建表 后台管…...
Vue 基础语法(二)
一、背景: 我们对于基础语法,说白了就是实现元素赋值,循环,判断,以及事件响应即可! 二、v-bind 我们已经成功创建了第一个 Vue 应用!看起来这跟渲染一个字符串模板非常类似,但是 V…...
kafka raft协议
1、首先要了解kafka是什么(Scala) Kafka是一个分布式的消息订阅系统,消息被持久化到一个topic中,topic是按照“主题名-分区”存储的,一个topic可以分为多个partition,在parition(分区)内的每条消息都有一个有序的id号,这个id号被称为偏移(offset),记录消息的消息位置…...
平板光波导中导模的(注意不是泄露模)传播常数β的matlab计算(验证了是对的)
参照的是导波光学_王建(清华大学)的公式(3-1-2、3-1-3),算的参数是这本书的图3-3的。 function []PropagationConstantsMain() clear;clc;close all lambda01.55;%真空或空气中的入射波长,单位um k02*pi/lambda0; m3;%导模阶数(需要人为指定) n11.62;%芯…...
JVM面试题--JVM组成
JVM是什么 Java Virtual Machine Java程序的运行环境(java二进制字节码的运行环境) 运行流程 什么是程序计数器? 程序计数器:线程私有的,内部保存的字节码的行号。用于记录正在执行的字节码指令的地址。 我们知道ja…...
【Golang 接口自动化05】使用yml管理自动化用例
目录 YAML 基本语法 对象:键值对的集合(key:value) 数组:一组按顺序排列的值 字面量:单个的、不可再分的值(数字、字符串、布尔值) yml 格式的测试用例 定义yml文件 创建结构体 读取yml文件中的用例数据 调试…...
【【STM32学习-3】】
STM32学习-3 下面是对c语言的稍微复习 这个是我们设置好的文件 以后拖出去用就可以了 这里加入关于指针的感想 关于指针数组和数组指针的想法 常规的东西是int a10; int * p&a; (p指向了a元素,意思是p等于a的地址 类型是int*)就是 整型指…...
代码随想录第四十八天|198、213、337.打家劫舍
198.打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个…...
js笔记总结
prototype 属性的作用 JavaScript 规定,每个函数都有一个prototype属性,指向一个对象。 function f() {} typeof f.prototype // "object" 上面代码中,函数f默认具有prototype属性,指向一个对象。 对于普通函数来…...
第四章:Spring上
第四章:Spring上 4.1:Spring简介 Spring概述 官网地址:https://spring.io/。 Spring是最受欢迎的企业级的java应用程序开发框架,数以百万的来自世界各地的开发人员使用Spring框架来创建性能好、易于测试、可重用的代码。Spring框…...
【时频分析,非线性中频】非线性STFT在瞬时频率估计中的应用(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
MTK平台关机流程和原因(二)
(1)ShutdownThread 从上一篇可以看到,最终会调用此类的shutdown以及reboot等函数,我们来看一下这些函数的实现。 (A)被调用函数 //frameworks/base/services/core/java/com/android/server/power/Shutdo…...
实战复盘:从帕鲁杯应急响应赛题看企业级安全事件调查全流程
企业级安全事件调查实战指南:从CTF赛题到真实攻防溯源 在网络安全领域,应急响应能力直接决定了企业遭受攻击后的损失程度。去年某大型电商平台因未能及时识别攻击链,导致用户数据持续泄露长达三周,最终造成数亿元的直接损失。这类…...
深入torch.cuda.Event:解锁GPU代码性能瓶颈的精准计时器
1. 为什么你需要torch.cuda.Event? 在GPU编程的世界里,时间就是金钱。你可能遇到过这样的情况:明明优化了算法,但训练速度就是上不去;或者发现某个操作耗时异常,却找不到具体原因。这时候,传统的…...
ArchLinux新手必看:用Fcitx5搞定中文输入,从安装到美化皮肤保姆级教程
ArchLinux新手必看:用Fcitx5搞定中文输入,从安装到美化皮肤保姆级教程 刚接触ArchLinux的新手们,面对命令行界面时总会有些手足无措。特别是当需要输入中文时,如何配置一个既美观又实用的输入法成了许多人的第一个挑战。Fcitx5作…...
Vue 中的 deep、v-deep 和 >>> 有什么区别?什么时候该用
点赞 收藏 学会🤣🤣🤣 “你用 Element Plus 写了个按钮,想改下 hover 颜色,结果死活不生效!最后查了半天,发现得加个 :deep() 才行” 其实,这是 Vue 中一个非常常见的坑…...
Qwen3-4B-Thinking开源镜像教程:Chainlit前端对接企业微信机器人
Qwen3-4B-Thinking开源镜像教程:Chainlit前端对接企业微信机器人 1. 引言:当大模型遇到企业级应用 想象一下这个场景:你刚部署好一个强大的AI模型,它能帮你写代码、分析问题、生成文档。但每次使用,你都得打开一个特…...
2026年项目管理工具选型指南:功能对比、适用场景与避坑建议
项目管理工具早已不只是任务看板,而是连接目标、需求、计划、资源、交付、知识与复盘的管理底座。本文选取 ONES、Tower、Jira、Asana、monday.com、ClickUp、Microsoft Planner、Smartsheet、Notion 九款主流项目管理工具展开评估,帮助企业中高层研发负…...
【HALCON实战】set_window_param:解锁图形窗口高级定制与性能调优
1. 为什么你需要掌握set_window_param? 在机器视觉项目开发中,图形窗口就像工程师的眼睛。我见过太多同行把90%的精力花在算法优化上,却忽视了窗口显示这个"最后一公里"问题。直到某次在客户现场演示时,程序因为频繁刷新…...
从零开始用Typora写技术文档:完整配置指南与高效排版秘籍
从零开始用Typora打造专业技术文档:配置、排版与效率全攻略 在技术写作领域,文档的呈现质量往往直接影响知识传递的效果。Typora作为一款轻量级Markdown编辑器,凭借其即时渲染、简洁界面和强大的扩展功能,已成为众多开发者和技术作…...
Performance-Fish:环世界性能优化的全方位解决方案
Performance-Fish:环世界性能优化的全方位解决方案 【免费下载链接】Performance-Fish Performance Mod for RimWorld 项目地址: https://gitcode.com/gh_mirrors/pe/Performance-Fish 问题诊断:环世界性能瓶颈深度剖析 🔍 AI决策系统…...
上篇:那个隔墙听声的侦探——AI中的隐马尔可夫模型到底是什么,以及它为什么被发明出来
想象一下这样的场景:你被关在一间屋子里,隔壁房间有一个人在扔硬币。但你看不到那个房间,也看不到那个人,更看不到硬币。你唯一能做的,就是竖起耳朵听——每隔一段时间,你能听到一个声音:“叮”…...
