设计模式-读书笔记

确认好:

模式名称

问题:在何时使用模式,包含设计中存在的问题以及问题存在的原因

解决方案:设计模式的组成部分,以及这些组成部分之间的相互关系,各自的职责和协作方式,用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/492854.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C缺陷与陷阱 — 8 编译与链接

目录 1 程序的编译过程 2 动态链接的优缺点 2.1 动态链接的优点 2.2 动态链接的缺点 2.3 只使用动态链接 3 函数库链接的5个特殊秘密 4 警惕Interpositioning 5 产生链接器报告文件 1 程序的编译过程 程序的编译过程是将源代码转换成计算机可以执行的机器代码的过程。…

QT c++ 测控系统 一套报警规则(上)

本文适用于pc based的测控系统的上位机&#xff0c;定义了一套报警规则。 由5个部分组成&#xff1a;自定义4布尔类、在全局文件定义工位错误结构体和结构体变量&#xff0c;其它地方给此变量的当前值成员赋值&#xff0c;报警线程类、数据库保存类、弹框类。 1.自定义4布尔类…

作业Day4: 链表函数封装 ; 思维导图

目录 作业&#xff1a;实现链表剩下的操作&#xff1a; 任意位置删除 按位置修改 按值查找返回地址 反转 销毁 运行结果 思维导图 作业&#xff1a;实现链表剩下的操作&#xff1a; 1>任意位置删除 2>按位置修改 3>按值查找返回地址 4>反转 5>销毁 任意…

WebSocket入门与结合redis

WebSocket是什么 WebSocket 是一种用于在客户端和服务器之间建立双向通信的协议&#xff0c;它能实现实时、持久的连接。与传统的 HTTP 请求响应模式不同&#xff0c;WebSocket 在建立连接后允许客户端和服务器之间相互发送消息&#xff0c;直到连接关闭。由于 WebSocket 具有…

WSL Ubuntu

文章目录 1. 概述1.1 什么是适用于 Linux 的 Windows 子系统1.2 什么是 WSL 21.3 WSL 2 中的新增功能1.4 比较 WSL 2 和 WSL 1 2. 参考资料3. 修改存储位置4. 网络访问 1. 概述 1.1 什么是适用于 Linux 的 Windows 子系统 适用于 Linux 的 Windows 子系统可让开发人员按原样运…

unity接入coze智能体

官网链接 coze智能体创建、设置 点击创建–选着智能体&#xff0c;随便起一个名字&#xff0c;就可以了 添加令牌 把随便起一个名字&#xff0c;设置时间&#xff0c;把所有选项都勾选上&#xff0c;一定要勾选所有团队空间&#xff0c;否则无法点击确定。 点击确定后&a…

基于51单片机的交通灯设计—夜间、紧急、复位、可调时间、四个数码管显示

基于51单片机的交通灯设计 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1、采用四方向数码管设计&#xff0c;更加符合真实的交通信号灯设计&#xff1b; 2、左侧按键从上到下依次为…

省略内容在句子中间

一、使用二分查找法 每次查找时&#xff0c;将查找范围分成两半&#xff0c;并判断目标值位于哪一半&#xff0c;从而逐步缩小查找范围。 循环查找 计算中间位置 mid Math.floor((low high) / 2)。比较目标值 target 和中间位置的元素 arr[mid]&#xff1a; 如果 target ar…

Python:动态粒子爱心

预览 代码结构概述 这段代码使用了 pygame 库来创建一个动态的图形窗口&#xff0c;绘制一个心形图案&#xff0c;并在其中显示闪烁的文本。代码主要分为以下几个部分&#xff1a; 初始化和设置心形曲线的计算粒子类的定义生成粒子文本设置主循环 1. 初始化和设置 import p…

springboot449教学资源共享平台(论文+源码)_kaic

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统教学资源共享平台信息管理难度大&#xff0c;容错率低&am…

DataOps驱动数据集成创新:Apache DolphinScheduler SeaTunnel on Amazon Web Services

引言 在数字化转型的浪潮中&#xff0c;数据已成为企业最宝贵的资产之一。DataOps作为一种文化、流程和实践的集合&#xff0c;旨在提高数据管道的质量和效率&#xff0c;从而加速数据从源头到消费的过程。白鲸开源科技&#xff0c;作为DataOps领域的领先开源原生公司&#xf…

【大模型】GraphRAG技术原理

核心概念 GraphRAG 的核心在于用大模型构建知识图谱知识图谱聚类社区化RAG RAG就是输入&#xff08;问题知识&#xff09;到大模型 1-大模型自动从海量数据中构建知识图谱&#xff08;提取合并实体关系&#xff09; 2-聚类算法从知识图谱中聚类社区并生成社区摘要 3-输入问题…

揭秘区块链隐私黑科技:零知识证明如何改变未来

文章目录 1. 引言&#xff1a;什么是零知识证明&#xff1f;2. 零知识证明的核心概念与三大属性2.1 完备性&#xff08;Completeness&#xff09;2.2 可靠性&#xff08;Soundness&#xff09;2.3 零知识性&#xff08;Zero-Knowledge&#xff09; 3. 零知识证明的工作原理4. 零…

王佩丰24节Excel学习笔记——第十二讲:match + index

【以 Excel2010 系列学习&#xff0c;用 Office LTSC 专业增强版 2021 实践】 【本章小技巧】 vlookup与match&#xff0c;index 相结合使用match,index 结合&#xff0c;快速取得引用的值扩展功能&#xff0c;使用match/index函数&#xff0c;结合照相机工具获取照片 一、回顾…

探秘C语言:从诞生到广泛应用的编程世界

引言 在编程的广袤天地里&#xff0c;C 语言宛如一颗璀璨的恒星&#xff0c;持久而耀眼地散发着光芒。自诞生以来&#xff0c;它就以独特的魅力和强大的功能&#xff0c;深深扎根于软件开发的各个层面。无论是构建复杂的操作系统&#xff0c;还是操控微小的嵌入式设备&#xff…

【Python】pandas库---数据分析

大学毕业那年&#xff0c;你成了社会底层群众里&#xff0c;受教育程度最高的一批人。 前言 这是我自己学习Python的第四篇博客总结。后期我会继续把Python学习笔记开源至博客上。 上一期笔记有关Python的NumPy数据分析&#xff0c;没看过的同学可以去看看&#xff1a;【Pyt…

常见异构程序设计语言

目录 一、OpenMP 二、MPI 三、CUDA/HIP 四、OpenACC 五、Athread 六、OpenCL 七、oneAPI 20世纪80年代&#xff0c;异构计算技术就已经诞生了。异构就是CPU、DSP、GPU、ASIC、协处理器、FPGA等各种计算单元、使用不同的类型指令集、不同的体系架构的计算单元&#xff0c…

番外篇 Git 的原理与使用

PS&#xff1a;本篇是个长篇&#xff0c;但是阅读完&#xff0c;可以基本了解 Git 在实际开发中的绝大部分常用操作。 前言&#xff1a;什么是Git 我们在日常工作 / 学习时&#xff0c;对于某些文档 / 代码&#xff0c;可能会存在多个版本需要维护&#xff0c;但是随着版本的…

音频开发中常见的知识体系

在 Linux 系统中&#xff0c;/dev/snd 目录包含与声音设备相关的文件。每个文件代表系统中的一部分音频硬件或音频控制接口。以下是你列出的文件及其含义&#xff1a; 一.基本术语 样本长度(sample)&#xff1a;样本是记录音频数据最基本的单位&#xff0c;计算机对每个通道采…

我的工作会被AI替代吗?

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…