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

《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设计模式(第二版)》第一章源码

代码文件目录结构&#xff1a; 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 的用法&#xff0c;以及insert into select的坑或者注意事项。本篇文章中的sql基于mysql8.0进行讲解 一、insert into select 该语法常用于从另一张表查询数据插入到某表中…...

图像识别技术:计算机视觉的进化与应用展望

导言&#xff1a; 图像识别技术是计算机视觉领域的重要研究方向&#xff0c;它使计算机能够理解和解释图像内容&#xff0c;从而实现自动化和智能化的图像处理。随着深度学习等技术的快速发展&#xff0c;图像识别在诸多领域取得了重大突破&#xff0c;如自动驾驶、医疗影像分析…...

【免费送书】重新定义Python学习!

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…...

Qt 4. 发布exe

把ex2.exe放在H盘Ex2文件夹下&#xff0c;执行 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…...

消息队列的使用场景以及优缺点

消息队列是一种在应用系统之间传递消息的通信模式。它允许发送者将消息发布到一个队列中&#xff0c;而接收者则从队列中获取消息进行处理。 消息队列的主要特点包括&#xff1a; 异步通信&#xff1a;消息的发送和接收是异步进行的&#xff0c;发送者无需等待接收者的即时响应…...

掌握Python的X篇_17_循环语句(while;for var in ;range)

文章目录 1. 为什么需要循环2. while循环3. for...in循环4. range函数 1. 为什么需要循环 循环语句方便我们做重复的事情&#xff0c;比如&#xff1a; for i in range (0,3):print("重要的事情说三遍")运行效果如下&#xff1a; Python中有while循环和for循环两…...

IDEA maven 报错 malformed \uxxx encoding

IDEA maven 报错 malformed \uxxx encoding 最近搞几个JAVA项目总是出现上面错误&#xff0c;在网上搜的大部分都是删maven库&#xff0c;删jar包等等&#xff0c;每次都搞了好久才解决&#xff0c;今天无意中发现并不是包的问题&#xff0c; 解决办法 1.点击 idea 右侧的ma…...

Django实现音乐网站 ⑵

使用Python Django框架制作一个音乐网站&#xff0c;在系列文章1的基础上继续开发&#xff0c;本篇主要是后台歌手表模块开发。 目录 表结构设计 歌手表&#xff08;singer&#xff09;结构 创建表模型 设置图片上传路径 创建上传文件目录 生成表迁移 执行创建表 后台管…...

Vue 基础语法(二)

一、背景&#xff1a; 我们对于基础语法&#xff0c;说白了就是实现元素赋值&#xff0c;循环&#xff0c;判断&#xff0c;以及事件响应即可&#xff01; 二、v-bind 我们已经成功创建了第一个 Vue 应用&#xff01;看起来这跟渲染一个字符串模板非常类似&#xff0c;但是 V…...

kafka raft协议

1、首先要了解kafka是什么(Scala) Kafka是一个分布式的消息订阅系统,消息被持久化到一个topic中,topic是按照“主题名-分区”存储的,一个topic可以分为多个partition,在parition(分区)内的每条消息都有一个有序的id号,这个id号被称为偏移(offset),记录消息的消息位置…...

平板光波导中导模的(注意不是泄露模)传播常数β的matlab计算(验证了是对的)

参照的是导波光学_王建(清华大学)的公式(3-1-2、3-1-3)&#xff0c;算的参数是这本书的图3-3的。 function []PropagationConstantsMain() clear;clc;close all lambda01.55;%真空或空气中的入射波长&#xff0c;单位um k02*pi/lambda0; m3;%导模阶数(需要人为指定) n11.62;%芯…...

JVM面试题--JVM组成

JVM是什么 Java Virtual Machine Java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 运行流程 什么是程序计数器&#xff1f; 程序计数器&#xff1a;线程私有的&#xff0c;内部保存的字节码的行号。用于记录正在执行的字节码指令的地址。 我们知道ja…...

【Golang 接口自动化05】使用yml管理自动化用例

目录 YAML 基本语法 对象&#xff1a;键值对的集合(key:value) 数组&#xff1a;一组按顺序排列的值 字面量&#xff1a;单个的、不可再分的值&#xff08;数字、字符串、布尔值&#xff09; yml 格式的测试用例 定义yml文件 创建结构体 读取yml文件中的用例数据 调试…...

【【STM32学习-3】】

STM32学习-3 下面是对c语言的稍微复习 这个是我们设置好的文件 以后拖出去用就可以了 这里加入关于指针的感想 关于指针数组和数组指针的想法 常规的东西是int a10; int * p&a; &#xff08;p指向了a元素&#xff0c;意思是p等于a的地址 类型是int*&#xff09;就是 整型指…...

代码随想录第四十八天|198、213、337.打家劫舍

198.打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个…...

js笔记总结

prototype 属性的作用 JavaScript 规定&#xff0c;每个函数都有一个prototype属性&#xff0c;指向一个对象。 function f() {} typeof f.prototype // "object" ​ 上面代码中&#xff0c;函数f默认具有prototype属性&#xff0c;指向一个对象。 对于普通函数来…...

第四章:Spring上

第四章&#xff1a;Spring上 4.1&#xff1a;Spring简介 Spring概述 官网地址&#xff1a;https://spring.io/。 Spring是最受欢迎的企业级的java应用程序开发框架&#xff0c;数以百万的来自世界各地的开发人员使用Spring框架来创建性能好、易于测试、可重用的代码。Spring框…...

【时频分析,非线性中频】非线性STFT在瞬时频率估计中的应用(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

MTK平台关机流程和原因(二)

&#xff08;1&#xff09;ShutdownThread 从上一篇可以看到&#xff0c;最终会调用此类的shutdown以及reboot等函数&#xff0c;我们来看一下这些函数的实现。 &#xff08;A&#xff09;被调用函数 //frameworks/base/services/core/java/com/android/server/power/Shutdo…...

Qwen3.5-35B-A3B-AWQ-4bit企业落地应用:教育题图分析、医疗影像初筛、工业图纸解读

Qwen3.5-35B-A3B-AWQ-4bit企业落地应用&#xff1a;教育题图分析、医疗影像初筛、工业图纸解读 1. 多模态AI在企业场景的价值 在当今企业运营中&#xff0c;视觉内容处理已成为关键环节。教育机构需要快速分析教材插图&#xff0c;医疗机构面临海量影像筛查压力&#xff0c;工…...

Realistic Vision V5.1 模型安全与内容过滤部署指南

Realistic Vision V5.1 模型安全与内容过滤部署指南 如果你正在公司里部署AI图像生成服务&#xff0c;最头疼的问题是什么&#xff1f;除了模型效果和生成速度&#xff0c;恐怕就是内容安全了。你肯定不希望员工或者用户用它生成一些不合规的图片&#xff0c;这不仅可能违反公…...

梦幻动漫魔法工坊快速上手:无需代码,网页端直接生成动漫图像

梦幻动漫魔法工坊快速上手&#xff1a;无需代码&#xff0c;网页端直接生成动漫图像 你是否也曾幻想过&#xff0c;用几句话就能召唤出脑海中的梦幻场景&#xff1f;一个可爱的猫耳少女&#xff0c;在樱花树下回眸&#xff1b;或是奇幻的魔法森林里&#xff0c;精灵在月光下起…...

雪女-斗罗大陆-造相Z-Turbo企业级应用:自动化营销素材生成平台

雪女-斗罗大陆-造相Z-Turbo企业级应用&#xff1a;自动化营销素材生成平台 想象一下&#xff0c;你是一家游戏或动漫周边公司的营销负责人。新版本上线、节日活动、角色生日、新品预售……每个月的营销日历排得满满当当。每次活动&#xff0c;设计团队都在为海报、宣传图、社交…...

TranslucentTB启动失败?3步快速解决VCLibs运行时依赖问题

TranslucentTB启动失败&#xff1f;3步快速解决VCLibs运行时依赖问题 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 当你满怀期待地安装…...

毫米波雷达(AWR1864)二、从零到一:SDK配置与固件刷写实战

1. 毫米波雷达开发环境搭建全攻略 第一次接触AWR1864毫米波雷达开发板时&#xff0c;最让人头疼的就是软件环境的配置。记得我刚开始用这块板子的时候&#xff0c;光是为了让开发板识别出来就折腾了大半天。这里给大家分享一个Windows系统下的完整配置方案&#xff0c;帮你避开…...

Wan2.1 VAE模型蒸馏与轻量化部署探索

Wan2.1 VAE模型蒸馏与轻量化部署探索 最近在折腾一些生成模型的实际落地&#xff0c;发现一个挺普遍的问题&#xff1a;模型效果是真好&#xff0c;但体积也是真的大&#xff0c;推理起来对硬件的要求不低。特别是想把模型搬到一些资源有限的边缘设备&#xff0c;或者希望降低…...

OpenClaw技能扩展:基于nanobot实现Markdown自动转换

OpenClaw技能扩展&#xff1a;基于nanobot实现Markdown自动转换 1. 为什么需要文档自动化转换 在日常工作中&#xff0c;我们经常需要处理各种格式的文档——Word、PDF、PPT、Excel甚至网页内容。手动将这些文档转换为Markdown格式不仅耗时&#xff0c;还容易出错。作为一名技…...

29、【Agent】【OpenCode】模型配置(OpenCode Zen)(二)

【声明】本博客所有内容均为个人业余时间创作&#xff0c;所述技术案例均来自公开开源项目&#xff08;如Github&#xff0c;Apache基金会&#xff09;&#xff0c;不涉及任何企业机密或未公开技术&#xff0c;如有侵权请联系删除 背景 上篇 blog 【Agent】【OpenCode】模型配…...

Go Routine 调度器任务执行机制

Go语言凭借其轻量级线程——Goroutine&#xff0c;成为高并发编程的热门选择。而Goroutine的高效执行&#xff0c;离不开Go调度器的精妙设计。本文将深入探讨Go调度器的任务执行机制&#xff0c;揭示其如何实现高效并发。 **Goroutine的轻量特性** Goroutine相比传统线程更加…...