黑马-设计模式-笔记(未完)

一、基础

UML类图

可见性:

  • + public
  • - private
  • #protected
    表示方式:
  • 属性:可见性 名称:类型[=默认值]
  • 方法:可见性 名称(参数)[:返回类型]
    关系:
  • 关联关系:实线,引用关系,类属性里有另一个类
  • 聚合关系:空心菱形,表示整体和部分,类属性是另一个类的集合
  • 组合关系:实心菱形,强烈聚合关系,类属性是另一个类,控制它的存在
  • 依赖关系:虚线,类方法参数里有另一个类,(耦合度最低)
  • 继承关系:空心实线三角,泛化关系,表示一般与特殊,(耦合度最高)
  • 实现关系:空心虚线三角,接口和实现类关系
软件设计原则

单一职责原则:一个类只负责一个职责
里氏代换原则:子类可以直接替换父类,可以扩展父类的方法,但不能改变父类原有功能
开闭原则:对扩展开放,对修改关闭,实现热插拔
依赖倒转原则:模块间要依赖抽象,不要依赖实现,客户和实现解耦
接口隔离原则:接口最小粒度设计,一个类对另一个类尽量少依赖不相关的方法,抽象接口细拆开进行实现
迪米特法则:两个模块无需直接通讯就无需直接调用,使用第三方转发降低耦合度
合成复用原则:尽量先使用关联关系实现,其次才是继承复用,父类对子类是透明的(白箱复用)

一、创建型模式

如何创建对象,将对象的创建和使用分离

1.单例模式
结构
  • 单例类:只能创建一个实例的类
  • 访问类:使用单例类
分类
  • 饿汉式:类加载就会导致该单例对象被创建
    静态变量方式
public class Singleton {  // 1.私有构造方法  private Singleton() {}  // 2.在本类中创建该类对象  private static Singleton instance = new Singleton();  // 3.提供公共访问方式  public static Singleton getInstance() {  return instance;  }  
}

静态代码块方式

public class Singleton {  // 1.私有构造方法  private Singleton() {}  // 2.声明Singleton类型变量  private static Singleton instance; // null  // 3.静态代码块赋值  static {  instance = new Singleton();  }  // 4.提供公共访问方式  public static Singleton getInstance() {  return instance;  }  
}

枚举方式
枚举类线程安全只会装载一次,唯一不会被破坏的单例模式

public enum Singleton {  INSTANCE;  
}
  • 懒汉式:首次使用对象时才被创建
    方式一:判断并加锁
public class Singleton {  // 1.私有构造方法  private Singleton() {}  // 2.声明Singleton类型变量  private static Singleton instance;  // 3.提供公共访问方式  public static synchronized Singleton getInstance() {  // 判断instance是否为null  if (instance == null) {  instance = new Singleton();  }  return instance;  }  
}

方式二:双重检查锁 写操作才加锁优化性能

public class Singleton {  // 私有构造方法  private Singleton() {}  // 声明对象 需要volatile保证有序性private static volatile Singleton instance;// 对外提供方法  public static Singleton getInstance() {  // 第一次判断  if (instance == null) {  synchronized (Singleton.class){  // 第二次判断  if (instance == null) {  instance = new Singleton();  }  }  }  return instance;  }  
}

方式三:静态内部类
JVM加载时不会加载内部类,只有调用内部类时才会加载

public class Singleton {  // 私有构造方法  private Singleton() {}  // 定义一个静态内部类  // JVM加载时不会加载内部类,只有调用内部类时才会加载  private static class SingletonHolder{  // 在内部类中声明并初始化外部类的对象  private static final Singleton INSTANCE = new Singleton();  }  // 对外提供方法  public static Singleton getInstance() {  return SingletonHolder.INSTANCE;  }  
}
问题
  • 破坏单例模式
    • 序列化、反序列化:通过ObjectOutStream和ObjectInputStream对对象进行反序列化生产新的对象
      • 解决方法:在单例类中增加readResolve()方法返回单例对象
    • 反射:通过反射获取无参构造函数并放权
      • 解决方法:在单例类无参构造方法中增加判断并返回单例对象
2.工厂模式
简单工厂模式/静态工厂模式

把对象创建和业务分开,有新产品只需要修改工厂类;但是产品和工厂还有耦合,新产品还需要改工厂违反开闭

组成
  • 具体工厂:提供了创建产品的规范,调用者通过该方法创建产品
  • 抽象产品:定义产品规范
  • 具体产品:实现或继承抽象产品的子类
    ![[20240424_设计模式 GoF_1.png]]
工厂方法模式

用户只需知道具体工厂名称;新增产品只需添加具体产品和具体工厂类,无需对原工厂修改;但是增加了系统复杂

组成
  • 抽象工厂:提供创建产品的接口,调用者通过它访问具体工厂来创建产品
  • 具体工厂:提供了创建产品的规范,调用者通过该方法创建产品
  • 抽象产品:定义产品规范
  • 具体产品:实现或继承抽象产品的子类
    在这里插入图片描述
抽象工厂模式

可以保证用户使用同一个产品族的产品;但是产品族加一个产品,所有工厂类都需要修改

组成
  • 抽象工厂:提供创建产品的接口,包含多个创建产品的方法,创建多个不同等级的产品
  • 具体工厂:提供了创建产品的规范,调用者通过该方法创建产品
  • 抽象产品:定义产品规范
  • 具体产品:实现或继承抽象产品的子类
    ![[20240424_设计模式 GoF_2.png]]
3.原型模式

用一个已创建的实例为原型创建新对象,适用于对象创建复杂,对性能安全有要求

浅克隆:非基本类型指向原有内存地址
深克隆:完全一致并独立的拷贝,可以使用序列化或者递归浅克隆或其他方式实现

组成
  • 抽象原型类:规定了具体原型对象必须实现的clone方法,通常是Cloneable接口
  • 具体原型类:实现抽象原型类的clone方法
  • 访问类:使用具体原型类的clone方法来复制新对象
4.建造者模式

将复杂对象的构建和表示分离,使同样的构建可以创建不同的表示
适用于构建复杂且各个部分独立,构建流程相对一致的
可以通过内部建造类实现链式编程

组成
  • 抽象建造者类:接口规定都有哪些部分要创建
  • 具体建造者类:实现抽象建造者,提供具体构建各个部分的方法,完成后提供产品实例
  • 产品类:要创建的复杂对象
  • 指挥者类:调用具体建造者创建各个部分,只负责按顺序或完整创建
    在这里插入图片描述

二、结构型模式

如何将类或对象按布局组成更大的结构

1.代理模式

访问对象不直接引用目标对象;有静态代理(编译时生成)和动态代理(java运行时动态生成 JDK代理、CGLib代理)

组成
  • 抽象主题类:通过接口或抽象类声明真实主题和代理对象的业务方法
  • 真实主题类:实现具体业务,是代理对象代表的真实对象,是最终要引用的对象
  • 代理类:提供了与真实主题相同的接口,内部是对真实主题引用
静态代理

直接在代理类中增加真实主题类的成员变量,在方法中调用真实主题类的成员变量
在这里插入图片描述

JDK动态代理

java中提供动态代理类Proxy,里面有静态方法newProxyInstance获取代理对象

2.适配器模式
3.桥接模式
4.装饰者模式
5.外观模式
6.享元模式
7.组合模式

三、行为型模式

如何让类或对象协作完成任务

1.模板方法模式
2.策略模式
3.命令模式
4.职责链模式
5.状态模式
6.观察者模式
7.中介者模式
8.迭代器模式
9.访问者模式
10.备忘录模式
11.解释器模式

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

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

相关文章

Pycharm/Dataspell中使用jupyter导入ros humble包

配置ros humble对应python包路径文件 首先在~/.local/lib/python3.10/site-packages目录下新建一个.pth文件,如下图所示。 将对应的ros humble的python包的路径配置在上述文件中,一行放置一个路径,对应的路径如下图所示。 完成上述操作后…

苹果电脑装虚拟机好用吗 苹果电脑装虚拟机要钱吗 Parallels对mac的损害 Parallels占用多大空间 PD19

在当今数字化的时代,人们对电脑系统跨设备互联的需求越来越高。作为拥有广泛用户群体的苹果电脑,许多用户会有在Mac系统中运行其他操作系统的需求。在这种情况下,安装虚拟机是一个较好的解决方案。那么接下来就给大家介绍苹果电脑装虚拟机好用…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(三)

课程地址: 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程,一套精通鸿蒙应用开发 (本篇笔记对应课程第 4 - 6节) P5《04.快速入门》 本节来实现一个 HelloWorld 效果: 1、打开编辑器,选择新建项目&…

SpringBoot War打包部署

修改打包方式 <packaging>war</packaging>修改 Servlet 容器的 scope <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></d…

Mybatis入门(入门案例,IDEA配置SQL提示,JDBC介绍,lombok介绍)

目录 一、Mybatis入门案例介绍整体步骤创建SpringBoot项目pom依赖准备测试数据新建实体类配置Mybatis数据库连接信息新建接口类,编写SQL代码单元测试 二、IDEA配置SQL提示三、JDBC是什么案例JDBC和Mybatis对比 四、数据库连接池介绍如何实现一个数据库连接池切换数据库连接池 五…

Oracle导出导入dmp等文件类型的多表数据的常用方法、遇见的常见问题和解决办法(exp无效sql???)

使用PLSQL执行导出表数据的时候有两种方法 1、使用Oracle命令【imp--exp】【impdp--expdp】 但是如果你的本机没有安装有Oracle数据库&#xff0c;使用的instant client远程连接服务器上的Oracle数据库时候&#xff0c;你没有Oracle数据库带有的exp.exe、imp.exe等扩展文件&a…

Android kotlin 协程异步async与await介绍与使用

一、介绍 在kotlin语言中&#xff0c;协程是一个处理耗时的操作&#xff0c;但是很多人都知道同步和异步&#xff0c;但是不知道该如何正确的使用&#xff0c;如果处理不好&#xff0c;看似异步&#xff0c;其实在runBloacking模块中使用的结果是同步的。 针对如何同步和如何异…

day04 51单片机-矩阵按键

1 矩阵按键 1.1 需求描述 本案例实现以下功能&#xff1a;按下矩阵按键SW5到SW20&#xff0c;数码管会显示对应的按键编号。 1.2 硬件设计 1.2.1 硬件原理图 1.2.2 矩阵按键原理 1.3软件设计 1&#xff09;Int_MatrixKeyboard.h 在项目的Int目录下创建Int_MatrixKeyboard…

Acer宏碁掠夺者战斧300笔记本电脑PH315-52工厂模式原装Win10系统安装包 恢复出厂开箱状态 带恢复重置

宏碁掠夺者PH315-52原厂Windows10工厂包镜像下载&#xff0c;预装oem系统 链接&#xff1a;https://pan.baidu.com/s/1grmJzz6nW1GOaImY_ymXGw?pwdi286 提取码&#xff1a;i286 原厂W10系统自带所有驱动、PredatorSense风扇键盘控制中心、Office办公软件、出厂主题壁纸、系统…

C语言简易类json格式解析

在使用MQTT时&#xff0c;获取的数据基本上都是json格式的&#xff0c;虽然C语言也可以添加第三方的解析库&#xff0c;但有些资源少的单片机用着还是挺吃力的&#xff0c;所以自己简单写了一个从json格式中获取数据的&#xff0c;说白了就是一个字符串查找。就比如下面这一段 …

Scrapy 爬虫教程:从原理到实战

Scrapy 爬虫教程&#xff1a;从原理到实战 一、Scrapy框架简介 Scrapy是一个由Python开发的高效网络爬虫框架&#xff0c;用于从网站上抓取数据并提取结构化信息。它采用异步IO处理请求&#xff0c;能够同时发送多个请求&#xff0c;极大地提高了爬虫效率。 二、Scrapy运行原…

Elasticsearch单机部署(Linux)

1. 准备环境 本文中Elasticsearch版本为7.12.0&#xff0c;JDK版本为1.8.0&#xff0c;Linux环境部署。 扩展&#xff1a; &#xff08;1&#xff09;查看Elasticsearch对应的常用的jdk版本如下&#xff1a;&#xff08;详情可看官网的支持一览表&#xff09; Elasticsearch a…

机器学习 -- 分类问题

场景 探讨了一个回归任务——预测住房价格&#xff0c;用到了线性回归、决策树以及随机森林等各种算法。本次中我们将把注意力转向分类系统。我们曾经对MNIST进行了分类任务&#xff0c;这次我们重新回到这里&#xff0c;细致的再来一次。 开始 获取数据 Scikit-Learn提供了…

ELK 日志分析系统(二)

一、ELK Kibana 部署 1.1 安装Kibana软件包 #上传软件包 kibana-5.5.1-x86_64.rpm 到/opt目录 cd /opt rpm -ivh kibana-5.5.1-x86_64.rpm 1.2 设置 Kibana 的主配置文件 vim /etc/kibana/kibana.yml --2--取消注释&#xff0c;Kiabana 服务的默认监听端口为5601 server.po…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

一分钟教你学浪视频怎么存到网盘里面#小浪助手

只需要将学浪视频下载下来,然后利用网盘的上传功能,就能将学浪视频存到网盘里面 那么怎么下载学浪视频呢?其实这里可以借助一个工具:小浪助手 小浪助手我已经打包好了,有需要的自己取一下 学浪下载器链接&#xff1a;https://pan.baidu.com/s/1nyjXc88BWbF8jnfQWUGLZQ?pwd…

Python爱心代码

爱心效果图&#xff1a; 完整代码&#xff1a; import random from math import sin, cos, pi, log from tkinter import *# 定义画布尺寸和颜色 CANVAS_WIDTH 640 CANVAS_HEIGHT 480 CANVAS_CENTER_X CANVAS_WIDTH / 2 CANVAS_CENTER_Y CANVAS_HEIGHT / 2 IMAGE_ENLARG…

Pandabuy代采模式独立站打造攻略,轻松开启全球电商新篇章!

Pandabuy是一个知名的代采平台&#xff0c;老外想要购买1688的物美价廉的商品&#xff0c;但是受限于物流和支付&#xff0c;老外没有大陆支付宝&#xff0c;另外1688不支持海外物流。作为跨境出口的代采平台&#xff0c;pandabuy解决了这个问题 通过对接1688的搜索api&#xf…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 4月26日,星期五

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年4月26日 星期五 农历三月十八 1、 神舟十八号载人飞船发射取得圆满成功&#xff0c;3名航天员与神舟十七号乘组实现“太空会师”。 2、 工信部征求意见&#xff1a;电动自行车拟禁用车载充电器。 3、 两部门&#xff1a;调…

详解Qt中实现树状结构图

在Qt中&#xff0c;实现树状结构图通常采用QTreeWidget或QTreeView组件。这两个组件都允许我们创建具有层次结构的列表&#xff0c;但它们之间存在一些差异。QTreeWidget提供了更简单的API&#xff0c;适用于轻量级、快速开发的需求&#xff1b;而QTreeView则更为灵活和可定制&…