设计模式-读书笔记
确认好:
模式名称
问题:在何时使用模式,包含设计中存在的问题以及问题存在的原因
解决方案:设计模式的组成部分,以及这些组成部分之间的相互关系,各自的职责和协作方式,用uml类图和核心代码描述
效果:模式优缺点,使用模式时应权衡的问题
创建型:描述如何创建对象。5个
结构型:如何实现类对象的组合。7个
行为型:类和对象怎么交互,以及怎么分配职责。11个
结合是处理类还是对象,如单例模式是对象创建型模式
类之间的关系:
1、关联。单向关联(顾客和地址),双向关联(顾客与产品,相互绑定),自关联(链表节点),多重性关联(界面上有多个按钮)
聚合(生命周期不同,汽车与轮胎),组合(生命周期相同,脸与鼻子)
菱形箭头,指向轮胎,另一边右箭头
2、依赖。驾驶员与汽车。----->指向汽车
3、泛化。继承,父类与子类。菱形箭头,指向父类,另一边无箭头。 在这基础上,改为虚线,就是接口实现,指向接口
面向对象设计原则:
1、单一职责:一个类只负责一个功能领域中的相应职责。
2、开闭原则。实体对扩展开放,对修改关闭。
3、里氏替换原则。所有引用基类对象的地方,能够透明地使用其子类的对象。
4、依赖倒转原则。抽象不应该依赖于细节,而是细节依赖于对象。
换言之,要针对接口编程,而不是针对实现编程。
一个具体类应当实现接口或抽象类中声明过的方法,而不要给出多余的方法,否则将无法调用到在子类中加的新方法。
将具体类的对象通过依赖注入(DI)的方式注入到其他对象:构造注入,设值setter注入,接口注入
5、接口隔离原则。使用多个专门的接口,而不使用单一的总接口。
应当为客户端提供尽可能小的单独的几口,客户端不应该依赖那些它不需要的接口。因为实现一个接口就要实现该接口定义的所有方法。
6、合成复用原则。尽量使用对象组合,而不是继承来达到复用目的。
聚合/组合应优于继承,后者破坏了封装性,前者耦合性低。
7、迪米特原则。一个软件实体应当尽可能少地与其他实体发生相互作用。
通过引入一个合理的第三者来降低现有对象之间的耦合度
创建型模式
单例模式 对象创建型模型
问题:windows任务管理器点击多次,只弹出一个页面(!真的) 再比如负载均衡器的唯一性
demo1
private static A a = null; 静态变量
public static A getA(){if(a == null){ 但是这里初始化需要一段时间,仍可能创建了多个loadBalancera = new A();}return a;
}
为了解决上面的问题,考虑到单例类的两个实现方式:饿汉式和懒汉式。
饿汉式,定义静态变量,直接初始化,见demo2,资源效率不好,可能初始化用不到该类,并且初始化加载时间长
private static A a = new A(); 静态变量
public static A getA(){return a;
}
懒汉式就是demo1,在demo1的基础上我们引入线程锁定
demo3
private static A a = null;
public static A getA(){if(a == null){ synchronized(LazySingleton.class){a = new A();} }return a;
}
仍有问题,假如两个线程同时判定了为空。引入双重检查锁定
demo4
private static A a = null;
public static A getA(){if(a == null){synchronized(LazySingleton.class)if(a == null){ // 第2重判断a = new A();}}return a;
}
更好的方法 IoDH方法
增加一个静态内部类
demo5
private static Class B(){private final static A a = new A();
}
public static A getA(){return B.a;}
简单工厂模式 集中式 对象创建型 静态工厂
Chart类实现柱状图、饼状图等不同图表的实现
创建和使用不应耦合在一起
工厂类!!
//demo1
class Factory{public static Chart getChart(String type){ //静态工厂实现Chart chart = null;if(type.equalsIgnoreCase("h")){chart = new HChart();}else if 。。。。。。 }
}
工厂方法 多态 对象创建型 解决静态工厂无法引入新产品
工厂 多个具体的
//demo1
interface Logger{public void w();} //抽象产品
class DLogger implements Logger{public void w(){.....}} //具体产品
interface Factory{public Logger getL();} //抽象工厂
class DLoggerFactory{public Logger getL(){DLogger d = new DLogger();return d;}
}
//使用
Factory f;
Logger l;
f = new DLoggerFactory();
l = f.getL();
l.w();
可以用读取配置文件来获取类字符串,使用java的反射机制,根据类名字符串生成对象
如创建一个字符串类型的对象,通过类名生成实例对象并将其返回
Class c = Class.forName("String");
Object obj = c.newInstance();
return obj;
创建DOM对象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
用xml文件配置
<?xml version = "1.0">
<config><className>FileLoggerFactory></className>
</cofig>
f = new DLoggerFactory();
//改为
f = (DLoggerFactory)XMLUtil.getBean();
缺点:类成对增加,开销大
抽象工厂模式 产品族 对象创建型 比如界面风格
//抽象工厂
interface Factory{public Button createButton(); //两个抽象产品public TextField createTextField();
}//具体工厂
class SummerFactory{public Button createButton(){return new SummerButton;}; public TextField createTextField(){。。。。。};
}
同样可以用xml配置文件反射得到java具体工厂
缺点:再增加新的抽象产品很麻烦
P86/396 12.4 22:01留
原型模式 对象的克隆 对象创建型
//demo1
class ConcretePrototype implements Prototype{private String attr; // 成员变量public void setAttr(String attr){this.attr = attr;}public String getAttr(){return this.attr;}// 克隆方法public Prototype clone(){Prototype prototype = new Prototype();prototype.setAttr(this.attr);return prototype}
}
java中所有类都继承Object 类中的clone()方法,而这个方法来自接口Clonable
浅克隆
主要区别是是否支持引用类型(类、接口、数组)的成员变量的复制。当引用类型时,原型对象和克隆对象的成员变量指向相同的内存地址
深克隆 序列化实现:将对象写到流中,写到流中的对象,是原有对象的一个复制品
Serializable接口(两个类均要实现)附件类Attachment 是下面一个类的属性 周报类WeeklyLog(使用序列化实现深克隆)
//demo2
public WeeklyLog deepclone(){//将对象写入流中ByteArrayOutputStream bao = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bao);oos.writeObject(this);//将对象从流中读取ByteArrayInputStream bis = new ByteArrayInputStream(bao.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis);return (WeeklyLog)ois.readObject();
}
建造者模式 复杂对象的组装与创建 对象创建型
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
客户端只需实例化指挥者类,指挥者类针对抽象建造者编程,客户端根据需要传入具体的建造者类型
指挥者将指导具体建造者一步一步地构造一个完整的产品
//产品
class Product{private String partA;private String partB;
}
//抽象建造者类
abstract class Buider{protected Product product = new Product();public abstract void buildPartA();public abstract void buildPartB();//返回产品对象public Product getResult(){return product;}
}
//指挥者
class Director{private Builder builder;public Director(Builder builder){this.builder = builder;}//产品构建与组装方法public Product construct(){builder.buildPartA();builder.buildPartB();//决定次序}
}
//实现
Builder builder = new ConcreteBuilder(); //可通过配置文件实现
Director director = new Director(builder);
Product product = director.construct();
工厂方法:集中管理创建类型
关于指挥者:
1、省略Director,直接在具体建造者中construct构建
2、引入钩子方法,返回类型是Boolean,方法名一般是isXXX(),定义在抽象建造者类中,如是否光头 Bareheaded
相关文章:
设计模式-读书笔记
确认好: 模式名称 问题:在何时使用模式,包含设计中存在的问题以及问题存在的原因 解决方案:设计模式的组成部分,以及这些组成部分之间的相互关系,各自的职责和协作方式,用uml类图和核心代码描…...
c语言----选择结构
基本概念 选择结构是C语言中用于根据条件判断来执行不同代码块的结构。它允许程序在不同的条件下执行不同的操作,使程序具有决策能力。 if语句 单分支if语句 语法格式: if (条件表达式) { 执行语句块; } 功能: 当条件表达式的值为真&#…...
KS曲线python实现
目录 实战 实战 # 导入第三方模块 import pandas as pd import numpy as np import matplotlib.pyplot as plt# 自定义绘制ks曲线的函数 def plot_ks(y_test, y_score, positive_flag):# 对y_test重新设置索引y_test.index np.arange(len(y_test))# 构建目标数据集target_dat…...
解决matplotlib中文乱码问题
进入python,查看缓存 import matplotlib as mpl print(mpl.get_cachedir())如果结果为/Users/xxx/.matplotlib 那么就rm -rf /Users/xxx/.matplotlib 然后 mkdir ~/.fonts cd ~/.fonts wget http://129.204.205.246/downloads/SimHei.ttfsudo apt-get install fo…...
实操给桌面机器人加上超拟人音色
前面我们讲了怎么用CSK6大模型开发板做一个桌面机器人充当AI语音助理,近期上线超拟人方案,不仅大模型语音最快可以1秒内回复,还可以让我们的桌面机器人使用超拟人音色、具备声纹识别等能力,本文以csk6大模型开发板为例实操怎么把超…...
git stash 的文件如何找回
在Git中,如果你使用了git stash命令来保存你的工作进度,但之后想要找回这些被stash的文件,你可以按照以下步骤进行操作: 1. 查看stash列表 首先,使用git stash list命令来查看当前保存的所有stash记录。这个命令会列出…...
皮肤伤口分割数据集labelme格式248张5类别
数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):284 标注数量(json文件个数):284 标注类别数:5 标注类别名称:["bruises","burns","cu…...
uni-app开发AI康复锻炼小程序,帮助肢体受伤患者康复!
**提要:**近段时间我们收到多个康复机构用户,咨询AI运动识别插件是否可以应用于肢力运动受限患者的康复锻炼中来,插件是可以应用到AI康复锻炼中的,今天小编就为您介绍一下AI运动识别插件在康腹锻炼中的应用场景。 一、康复机构的应…...
双内核架构 Xenomai 4 安装教程
Xenomai 4是一种双内核架构, 继承了Xenomai系列的特点,通过在Linux内核中嵌入一个辅助核心(companion core),来提供实时能力。这个辅助核心专门处理那些需要极低且有界响应时间的任务。 本文将在官网教程(https://evlproject.org/…...
【redis的使用、账号流程、游戏服Handler的反射调用】1.自增id 2.全局用户名这样子名字唯一 3.
一、web服 1)账号注册 // 用于唯一命名服务 com.xinyue.game.center.business.account.logic.AccountRegisterService#accountRegister public void accountRegister(AccountEntity account) {accountManager.checkUsername(account.getUsername());accountManager.checkPass…...
neo4j 图表数据导入到 TuGraph
neo4j 图表数据导入到 TuGraph 代码文件说明后文 前言:近期在引入阿里的 TuGraph 图数据库,需要将 原 neo4j 数据导入到新的 tugraph 数据库中。预期走csv文件导入导出,但因为格式和数据库设计问题,操作起来比较麻烦(可能是个人没…...
启动报错java.lang.NoClassDefFoundError: ch/qos/logback/core/status/WarnStatus
报错信息图片 日志: Exception in thread "Quartz Scheduler [scheduler]" java.lang.NoClassDefFoundError: ch/qos/logback/core/status/WarnStatus先说我自己遇到的问题,我们项目在web设置了自定义的log输出路径,多了一个 / 去…...
【ubuntu18.04】ubuntu18.04挂在硬盘出现 Wrong diagnostic page; asked for 1 got 8解决方案
错误日志 [ 8754.700227] usb 2-3: new full-speed USB device number 3 using xhci_hcd [ 8754.867389] usb 2-3: New USB device found, idVendor0e0f, idProduct0002, bcdDevice 1.00 [ 8754.867421] usb 2-3: New USB device strings: Mfr1, Product2, SerialNumber0 [ 87…...
kubeadm安装K8s高可用集群之集群初始化及master/node节点加入calico网络插件安装
系列文章目录 1.kubeadm安装K8s高可用集群之基础环境配置 2.kubeadm安装K8s集群之高可用组件keepalivednginx及kubeadm部署 3.kubeadm安装K8s高可用集群之集群初始化及master/node节点加入集群calico网络插件安装 kubeadm安装K8s高可用集群之集群初始化及master/node节点加入ca…...
游戏何如防抓包
游戏抓包是指在游戏中,通过抓包工具捕获和分析游戏客户端与服务器之间传输的封包数据的过程。抓包工具可实现拦截、篡改、重发、丢弃游戏的上下行数据包,市面上常见的抓包工具有WPE、Fiddler和Charles Proxy等。 抓包工具有两种实现方式,一类…...
【LeetCode】每日一题 2024_12_19 找到稳定山的下标(模拟)
前言 每天和你一起刷 LeetCode 每日一题~ 最近力扣的每日一题出的比较烂,难度过山车,导致近期的更新都三天打鱼,两天断更了 . . . LeetCode 启动! 题目:找到稳定山的下标 代码与解题思路 先读题:最重要…...
运维 mysql、redis 、RocketMQ性能排查
MySQL查看数据库连接数 1. SHOW STATUS命令-查询当前的连接数 MySQL 提供了一个 SHOW STATUS 命令,可以用来查看服务器的状态信息,包括当前的连接数。 SHOW STATUS LIKE Threads_connected;这个命令会返回当前连接到服务器的线程数,即当前…...
[SAP ABAP] 将内表数据转换为HTML格式
从sflight数据库表中检索航班信息,并将这些信息转换成HTML格式,然后下载或显示在前端 开发步骤 ① 自定义一个数据类型 ty_sflight 来存储航班信息 ② 声明内表和工作区变量,用于存储表头、字段、HTML内容和航班详细信息以及创建字段目录lt…...
LLM大语言模型私有化部署-使用Dify与Qwen2.5打造专属知识库
背景 Dify 是一款开源的大语言模型(LLM) 应用开发平台。其直观的界面结合了 AI 工作流、 RAG 管道、 Agent 、模型管理、可观测性功能等,让您可以快速从原型到生产。相比 LangChain 这类有着锤子、钉子的工具箱开发库, Dify 提供了更接近生产需要的完整…...
使用C语言连接MySQL
在C语言中连接MySQL数据库,通常需要使用MySQL提供的C API。以下是使用C语言连接MySQL数据库的基本步骤和示例代码: 步骤 1: 安装MySQL C API 首先,确保你的系统上安装了MySQL数据库,并且安装了MySQL C API库。在大多数Linux发行版…...
GEE快速入门:哨兵2号影像批量下载与去云处理指南
1. 为什么选择GEE处理哨兵2号影像? 如果你正在寻找一个免费、高效且无需本地高性能计算机的遥感数据处理方案,Google Earth Engine(GEE)绝对是你的首选。作为一个云端地理空间分析平台,GEE存储了海量的卫星影像数据&am…...
TradingAgents-CN本地化部署实战指南:多智能体金融框架避坑策略
TradingAgents-CN本地化部署实战指南:多智能体金融框架避坑策略 【免费下载链接】TradingAgents-CN 基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN 一、问题发现&#x…...
舰艇推进电机供电流程优化方案
舰艇推进电机供电流程优化方案 第一章 绪论 1.1 背景与意义 现代舰艇(如驱逐舰、潜艇、全电推进船舶)广泛采用综合电力系统。传统的供电流程中,推进电机作为最大的非线性负载,其负载突变(如急加速、倒车、波浪冲击导致的螺旋桨甩尾)会通过直流母线回馈至发电机组,导致…...
鸿蒙应用开发实战:手把手教你封装一个可复用的音乐播放器管理类(ArkTS版)
鸿蒙应用开发实战:构建高可复用的音乐播放器管理类(ArkTS版) 在鸿蒙应用开发中,音频播放功能是许多应用的核心需求。本文将深入探讨如何设计一个健壮、可复用的音乐播放器管理类,采用ArkTS语言实现,帮助开发…...
【回归儿童本位,重构专业底色】学前教育行业的深度思辨与价值坚守(二)
吕坤阳亲笔二、行业高质量发展的核心:回归儿童,摒弃功利化教育随着学前教育普惠政策的推进,行业规范化程度不断提升,但功利化、形式化的教育倾向依然存在,成为高质量发展的阻碍。部分幼儿园为迎合家长“抢跑”需求&…...
2026年,山东专业联想服务器解决方案,涵盖SR858 V3等众多型号!
在当今数字化飞速发展的时代,服务器作为企业数据处理和存储的核心设备,其性能和可靠性至关重要。联想服务器凭借其卓越的性能、丰富的功能和广泛的应用场景,成为众多企业的首选。今天,我们就来详细了解一下联想SR858 V3服务器。联…...
别再踩坑了!KubeKey离线安装K8s v1.26.12时,containerd镜像拉取失败的完整避坑指南
KubeKey离线部署K8s集群:containerd镜像拉取全流程避坑手册 第一次用KubeKey离线部署Kubernetes集群时,containerd镜像拉取失败的问题让我折腾了大半天。看着部署日志里反复出现的证书错误提示,才意识到离线环境下的镜像仓库配置远比想象中复…...
别让import.*拖慢你的Spring Boot项目!IDEA优化导入配置详解
别让import.*拖慢你的Spring Boot项目!IDEA优化导入配置详解 在微服务架构盛行的今天,Spring Boot项目的启动速度已经成为开发者关注的焦点。一个常见的性能陷阱就隐藏在那些看似无害的import.*语句中——它们会强制JVM加载整个包的类,即使你…...
科研人必备:用浏览器插件给IEEEXplore做个‘小手术’,告别20秒加载
科研效率革命:用浏览器插件精准优化IEEEXplore访问体验 每次打开IEEEXplore文献库,那个转不停的加载图标是否让你焦躁不安?作为每天要与学术数据库打交道的科研工作者,20秒的等待时间足以打断思考流,降低工作效率。这背…...
Benchmark.js 配置选项终极指南:如何优化你的 JavaScript 性能测试环境
Benchmark.js 配置选项终极指南:如何优化你的 JavaScript 性能测试环境 【免费下载链接】benchmark.js A benchmarking library. As used on jsPerf.com. 项目地址: https://gitcode.com/gh_mirrors/be/benchmark.js Benchmark.js 是一款专业的 JavaScript 性…...
