Head First设计模式学习笔记
Head First设计模式学习笔记
大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!
一、策略模式
策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
package cn.juwatech.strategy;interface QuackBehavior {void quack();
}class Quack implements QuackBehavior {public void quack() {System.out.println("Quack");}
}class Squeak implements QuackBehavior {public void quack() {System.out.println("Squeak");}
}abstract class Duck {QuackBehavior quackBehavior;public void performQuack() {quackBehavior.quack();}public void setQuackBehavior(QuackBehavior qb) {this.quackBehavior = qb;}abstract void display();
}class MallardDuck extends Duck {public MallardDuck() {quackBehavior = new Quack();}void display() {System.out.println("I'm a Mallard Duck");}
}public class StrategyPatternDemo {public static void main(String[] args) {Duck mallard = new MallardDuck();mallard.performQuack();mallard.setQuackBehavior(new Squeak());mallard.performQuack();}
}
二、观察者模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新。
package cn.juwatech.observer;import java.util.ArrayList;
import java.util.List;interface Observer {void update(float temp, float humidity, float pressure);
}interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObservers();
}class WeatherData implements Subject {private List<Observer> observers;private float temperature;private float humidity;private float pressure;public WeatherData() {observers = new ArrayList<>();}public void registerObserver(Observer o) {observers.add(o);}public void removeObserver(Observer o) {observers.remove(o);}public void notifyObservers() {for (Observer observer : observers) {observer.update(temperature, humidity, pressure);}}public void measurementsChanged() {notifyObservers();}public void setMeasurements(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;measurementsChanged();}
}class CurrentConditionsDisplay implements Observer {private float temperature;private float humidity;private Subject weatherData;public CurrentConditionsDisplay(Subject weatherData) {this.weatherData = weatherData;weatherData.registerObserver(this);}public void update(float temp, float humidity, float pressure) {this.temperature = temp;this.humidity = humidity;display();}public void display() {System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");}
}public class ObserverPatternDemo {public static void main(String[] args) {WeatherData weatherData = new WeatherData();CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);weatherData.setMeasurements(80, 65, 30.4f);weatherData.setMeasurements(82, 70, 29.2f);}
}
三、装饰者模式
装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
package cn.juwatech.decorator;abstract class Beverage {String description = "Unknown Beverage";public String getDescription() {return description;}public abstract double cost();
}class Espresso extends Beverage {public Espresso() {description = "Espresso";}public double cost() {return 1.99;}
}abstract class CondimentDecorator extends Beverage {public abstract String getDescription();
}class Mocha extends CondimentDecorator {Beverage beverage;public Mocha(Beverage beverage) {this.beverage = beverage;}public String getDescription() {return beverage.getDescription() + ", Mocha";}public double cost() {return .20 + beverage.cost();}
}public class DecoratorPatternDemo {public static void main(String[] args) {Beverage beverage = new Espresso();System.out.println(beverage.getDescription() + " $" + beverage.cost());beverage = new Mocha(beverage);System.out.println(beverage.getDescription() + " $" + beverage.cost());}
}
四、工厂模式
工厂模式通过定义一个创建对象的接口,让子类决定实例化哪一个类。
package cn.juwatech.factory;abstract class Pizza {String name;void prepare() {System.out.println("Preparing " + name);}void bake() {System.out.println("Baking " + name);}void cut() {System.out.println("Cutting " + name);}void box() {System.out.println("Boxing " + name);}public String getName() {return name;}
}class CheesePizza extends Pizza {public CheesePizza() {name = "Cheese Pizza";}
}class GreekPizza extends Pizza {public GreekPizza() {name = "Greek Pizza";}
}abstract class PizzaStore {public Pizza orderPizza(String type) {Pizza pizza = createPizza(type);pizza.prepare();pizza.bake();pizza.cut();pizza.box();return pizza;}protected abstract Pizza createPizza(String type);
}class SimplePizzaFactory extends PizzaStore {protected Pizza createPizza(String type) {Pizza pizza = null;if (type.equals("cheese")) {pizza = new CheesePizza();} else if (type.equals("greek")) {pizza = new GreekPizza();}return pizza;}
}public class FactoryPatternDemo {public static void main(String[] args) {PizzaStore store = new SimplePizzaFactory();Pizza pizza = store.orderPizza("cheese");System.out.println("Ordered a " + pizza.getName() + "\n");pizza = store.orderPizza("greek");System.out.println("Ordered a " + pizza.getName() + "\n");}
}
本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!
相关文章:
Head First设计模式学习笔记
Head First设计模式学习笔记 大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 一、策略模式 策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让…...
240806-RHEL 无法通过 ssh username@ip 远程连接,报错:Connection closed by ip port 22
A. 原因排查 遇到这个错误通常意味着 SSH 服务可能在目标主机上没有正常运行,或有防火墙/网络配置问题。以下是一些排查步骤: 检查 SSH 服务状态: 确认 SSH 服务是否正在目标主机上运行。 sudo systemctl status sshd重启 SSH 服务ÿ…...
C语言:复读机2种写法(输入什么就输出什么)
(1)题目:输入什么内容,输出就是什么内容,遇到"#"为止。输入一个随便的字符 (2)代码: 【1】getchar()和putchar() #include "stdio.h"int main() {char ch;pr…...
PySide6/PyQT学习笔记(很杂)
QGroupBox样式:科技机甲 QGroupBox { border: 2px solid #333; /* 深色边框,类似金属质感 */ border-radius: 8px; /* 轻微的圆角 */ background-color: #222; /* 暗色背景,模拟机甲内部或科技界面 */ color: #fff; /* 字体颜色为白色&a…...
学习笔记-JWT 保持登录状态
目录 一、解析 token 1. 在 JWT 工具类添加解析 token 的方法 2. 在 Controller 添加获取用户数据的方法 二、获取用户信息 1. 发起 axios 请求用户信息 2. 在路由守卫中调用方法 3. 使用 三、token 时效性 1. 设置 token 过期时间 2. 判断 token 是否过期 3. 在拦截…...
React 性能优化
使用 useMemo 缓存数据 (类似 vue 的 computed)使用 useCallback 缓存函数异步组件 ( lazy )路由懒加载( lazy )服务器渲染 SSR用 CSS 模拟 v-show 循环渲染添加 key使用 Fragment (空标签)减少层级 不在JSX 中定义函数࿰…...
后端常见问题及深度解决方案
🐟作者简介:一名大三在校生,喜欢编程🪴 🐡🐙个人主页🥇:Aic山鱼 🐠WeChat:z7010cyy 🦈系列专栏:🏞️ 前端-JS基础专栏✨前…...
C:野指针介绍(定义、危害、规避)以及野指针与空指针的区分
目录 1、野指针 1.1 野指针的成因 1.指针未初始化 2.指针越界访问 3.指针指向的空间释放 1.2 野指针的危害 1.3 如何规避野指针 1. 指针初始化 2. 小心指针越界 3.指针变量不使用就及时赋上NULL 4. 指针使用前检查是否是空指针 5. 避免返回局部变量的地址 1.4 区…...
vue中v-html 后端返回html + script js中click事件不生效
效果图: 需求:点击加号执行后端返回的script中的代码 后端返回的html: <!DOCTYPE html> <html langzh> <head> <title>xxx</title> <style>body{font-size: 14px}p{text-indent: 30px;}textarea{width…...
介绍maven生命周期-水温
Maven生命周期是指一系列的构建阶段,包括项目的清理、编译、测试、打包、部署等。Maven通过定义生命周期来规范项目构建过程,使得开发人员可以方便地执行一系列的构建任务。 Maven的生命周期分为三个阶段: clean生命周期:主要用…...
spring boot3.x快速入门
下一篇:Spring Boot 3.x gradle脚手架工程build.gradle详解 本教程将基于gradle项目构建工具来快速构建一个spring boot 3.x的最简单的web应用,其中涉及各种构建技巧和细节,希望能帮到初学者~ 文章目录 先决条件JDK17gradle全局配置 gradle项…...
JavaWeb之servlet关于Ajax实现前后端分离
一、什么是Ajax: AJAX Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。 AJAX 不是新的编程语言,而是一种使用现有标准的新方法。 AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部…...
vue3表格组件formatter
有时候在网页上显示表格数据时,表格的某些列值只有有限数目(例如,启用/停用),这时候后端常常使用不同的数据值表示不同状态,前端怎么将这些数据值转化为相应的列值呢? 我们可以采用vue3表格组件…...
C# 使用NHibernate连接MySQL实现数据的增删改查
使用 NHibernate 连接 MySQL 并实现数据的增删改查操作是一个非常典型的场景。以下是一个简单的示例,演示了如何配置 NHibernate 与 MySQL 连接并进行基本的 CRUD 操作。 目录 步骤 1: 安装必要的包 步骤 2: 配置 NHibernate 配置文件方式 代码方式 步骤 3: 定…...
IDEA2024.2重磅发布,更新完有4G!
JetBrains 今天宣布了其 IDE 家族版本之 2024.2 更新,其亮点是新 UI 现在已是默认设置,并且对 AI Assistant (AI助手)进行了几项改进。 安装密道 新 UI 的设计更加简约,可以根据需要以视觉方式扩展复杂功能。值得开发…...
QWT+Qt Creator+MSVC的配置与使用
目录 一、介绍 二、QWT下载 三、QWT编译 3.1 设置构建套件 3.2 修改QWT相关文件 3.3 进行QWT编译 四、QWT配置 4.1 配置QWT的lib文件 4.2 配置QWT的dll文件 4.3 配置QWT的designer的dll文件 五、代码实验 一、介绍 QWT,全称是Qt Widgets for Technical…...
Netty高性能数据结构
文章目录 Netty高性能数据结构FastThreadLocalHashedWheelTimer时间轮Mpsc无锁队列 Netty高性能数据结构 Netty 用高性能数据结构的主要目的是为了提高网络通信的效率和系统的整体性能。 所谓的高性能数据结构是指,那些在特定场景下优化了性能和效率的数据结构&am…...
关于百度、微软语音合成的实现案例
关键词 自助机产品、排队呼叫功能、网络喇叭、百度语音合成SDK、微软TTS 阅读建议 对自助机产品功能扩展感兴趣的读者、需要实现远程语音呼叫功能的开发者、想要了解网络喇叭选型及其使用的技术人员、对百度语音合成SDK和微软TTS感兴趣的开发者 阅读时长 预计阅读时长…...
二叉树:镜像树,子结构,二叉树转链表,二叉树的倒数K个数,对称,Z型打印
1.把一棵二叉树转换为它的镜像树。 void mirror_tree(TreeNode *root) {if(rootNULL) return ;TreeNode *temproot->right;root->rightroot->left;root->lefttemp;mirror_tree(root->right);mirror_tree(root->left);}2、输入两棵二叉树A,B&…...
瑞秋,詹妮弗·安妮斯顿多年来与本·阿弗莱克保持着“调情”友谊 又一个詹妮弗
尽管所有迹象都表明本阿弗莱克和詹妮弗洛佩兹的婚姻即将走向离婚,但他尚未公开评论此事。不过,好莱坞圈内人士已经纷纷将他与另一位名人联系起来。事实上,是另一位詹妮弗。 一位消息人士向媒体透露,詹妮弗安妮斯顿和阿弗莱克一直都很有默契——无论是在银幕上还是在银幕外…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
