设计模式(主要的五种)

1.设计模式:

设计模式就是代码设计经验

2.设计模式的类型:

分为三大类:创建型模式,结构型模式,行为模式

创建型模式:

单例模式:某个类只能有一个实例,提供一个全局的访问点。

工厂模式:一个工厂类根据传入的参数决定创建出那一种产品类的实例。

抽象工厂:创建相关或依赖对象的家族,而无需明确指定具体类。

建造者模式:封装一个复杂对象的构建过程,并可以按步骤构造。

原型模式:通过复制现有的实例来创建新的实例。

结构型模式

适配器模式:将一个类的方法接口转换成客户希望的另外一个接口。

组合模式:将对象组合成树形结构以表示“”部分-整体“”的层次结构。

装饰模式:动态的给对象添加新的功能。

代理模式:为其他对象提供一个代理以便控制这个对象的访问。

亨元模式:通过共享技术来有效的支持大量细粒度的对象。

外观模式:对外提供一个统一的方法,来访问子系统中的一群接口。

桥接模式:将抽象部分和它的实现部分分离,使它们都可以独立的变化。

行为型模式

模板模式:定义一个算法结构,而将一些步骤延迟到子类实现。

解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器。

策略模式:定义一系列算法,把他们封装起来,并且使它们可以相互替换。

状态模式:允许一个对象在其对象内部状态改变时改变它的行为。

观察者模式:对象间的一对多的依赖关系。

备忘录模式:在不破坏封装的前提下,保持对象的内部状态。

中介者模式:用一个中介对象来封装一系列的对象交互。

命令模式:将命令请求封装为一个对象,使得可以用不同的请求来进行参数化。访问者模式:在不改变数据结构的前提下,增加作用于一组对象元素的新功能。

责任链模式:将请求的发送者和接收者解耦,使的多个对象都有处理这个请求的机会。

迭代器模式:一种遍历访问聚合对象中各个元素的方法,不暴露该对象的内部结构。

3.单例模式:

1.一个类只有一个实例

2.只提供一个全局访问点

3.自我实例化( 一个对象在其自身的定义中创建自己的实例 )

懒汉模式在第一次调用时才创建实例,适合节省资源,但需要考虑线程安全问题。

饿汉模式在类加载时就创建实例,确保线程安全,但会占用更多资源,可能在不需要时也会初始化。

饿汉模式1:

很形象,通过getxxx静态方法把静态对象返回出去

这里的对象是私有的,防止外头的人修改,起到保护的作用

返回对象

public class UserMassage {//这是饿汉模式1//创建静态对象,自我实例化public static final UserMassage usermassage = new UserMassage();//提供全局访问点public  static UserMassage getUsermassage(){return  usermassage;}public void show(){System.out.println("我是单例模式");}}

饿汉模式2:
public class UserMassage2 {//饿汉模式2public static final UserMassage2  usermassage;static {usermassage =  new UserMassage2();}public void show(){System.out.println("我是单例模式");}
}

懒汉模式:

先把静态对象设为null

判断静态对象是否为null

为null则生产一个返回

不为null则用这个对象

public class LayManModel {//懒汉模式//私有静态变量保存实例private static LayManModel layManModel;//提供公共的获取实例的方法public static LayManModel getInstance() {//使用synch保证线程安全if (layManModel == null) {synchronized (LayManModel.class) {if (layManModel == null) {layManModel = new LayManModel();}}}return layManModel;}public void show () {System.out.println("我是懒汉模式");}}

测试代码:

1.== 用来判断地址从而判断是否是同一个对象

2.通过全局访问点来创建对象

public class Main2 {public static void main(String[] args) {LayManModel layManModel1 = LayManModel.getLayManModel();LayManModel layManModel2 = LayManModel.getLayManModel();System.out.println(layManModel1 == layManModel2);layManModel1.show();}
}

优点:

在内存中只有一个实例,避免频繁的创建和销毁实例

缺点:

没有接口,不能继承

注意事项:getUserMassage() 方法中需要使用同步锁 synchronized (UserMassage.class) 防止多线程

同时进入造成 UserMassage被多次实例化

4.工厂模式:

优点

1、一个调用者想创建一个对象,只要知道其名称就可以了。

2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。

3、屏蔽产品的具体实现,调用者只关心产品的接口。

缺点

每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定

程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事 。

面条接口:
public interface MianTiao {//面条抽象类public abstract void des();}
三种产品:三种面条

拉面:

public class LaMian implements MianTiao{@Overridepublic void des() {System.out.println("我是拉面,兰州的拉面");}
}

泡面:

public class PaoMian implements MianTiao{@Overridepublic void des() {System.out.println("我是泡面,大家都不爱吃的泡面");}
}

烩面:

public class HuiMian implements MianTiao{@Overridepublic void des() {System.out.println("我是烩面,河南人爱吃的烩面");}
}

测试方法:
public class Main {//传入我要生产面public static void main(String[] args) {MianTiao miantiao = SimpleNoodlesFactory.createNoodles(LA_MIAN);miantiao.des();}
}

工厂:
public class SimpleNoodlesFactory {//简单面条工厂protected static final int PAO_MIAN = 1;protected static final int LA_MIAN = 2;protected static final int HUI_MIAN = 3;//这个方法是关键,用来生产的public static MianTiao createNoodles(int type) {switch (type) {case PAO_MIAN:return new PaoMian();case LA_MIAN:return  new LaMian();default:return new HuiMian();}}
}

抽象工厂:

因为工厂和工厂不一样,这个是面条工厂,我们随着企业的扩大需要包子工厂,生产工厂的工厂就是抽象工厂,也叫二级工厂。

5.装饰模式:

装饰模式是用来替代继承的一种设计模式。它通过一种无须定义子类的方式来给对象动态增加职责,使

用对象之间的关联关系取代类之间的继承关系。降低了系统的耦合,可以动态的增加或者删除对象的职 责

接口:

public interface Showable {//展示接口public abstract void show();
}

装饰器:

public abstract class Decorator implements Showable{Showable showable ;//持有一个善于展示自己某个家伙//抽象装饰器//构造函数public  Decorator(Showable showable){this.showable = showable;}//无需实现因为现在装饰器还不知道如何修饰public abstract  void show();
}

装饰对象:

public class Girl implements Showable{@Overridepublic void show() {System.out.print("女友的素颜");}
}

装饰功能:

描眉:

public class MiaoMei extends Decorator{public MiaoMei(Showable showable) {super(showable);}//重写接口化妆后展示 描眉@Overridepublic void show() {System.out.print("描眉(");showable.show();System.out.print(")");}
}

涂口红:

public class TuKouHong extends Decorator{public TuKouHong(Showable showable) {super(showable);}@Overridepublic void show() {System.out.print("涂口红(");showable.show();System.out.print(")");}
}

测试方法:

这个装饰模式就是套的方式

和I/O流中的创建可像

public class Main {public static void main(String[] args) {//创建女友对象Girl girl = new Girl();//将女友放入描眉类MiaoMei lyw = new MiaoMei(girl);TuKouHong cmy = new TuKouHong(lyw);cmy.show();}
}

6.代理模式:

代理模式 指由一个代理主题来操作真实主题,真实主题执行具体的业务操作,而代理主题负责其他相关 业务的处理。

/*
* 定义Network接口
*/
public interface Network {
public void browse(); // 定义浏览的抽象方法
}
/*
* 真实的上网操作
*/
public class Real implements Network {
//重写抽象方法
public void browse() {
System.out.println("上网浏览信息!");
}
}
/*
* 代理上网
*/
public class Proxy implements Network {
private Network network;
// 设置代理的真实操作
public Proxy(Network network) {
this.network = network; // 设置代理的子类
}
// 身份验证操作 其他操作
public void check() {
System.out.println("检查用户是否合法!");
}
//代码实现上网
public void browse() {
this.check(); // 调用具体的代理业务操作
this.network.browse(); // 调用真实的上网操作
}
}
public static void main(String args[]) {
Network net = null; // 定义接口对象
net = new Proxy(new Real()); // 实例化代理,同时传入代理的真实操作
net.browse(); // 调用代理的上网操作
}

7.观察者模式

就是举个例子:订报纸

报纸厂家和订阅报纸的人之间这种一对多的就可以称为观察者模式

报纸厂家是被观察者

订阅报纸的人是观察者

当你订阅了 一份报纸,每天都会有一份最新的报纸送到你手上,有多少人订阅报纸,报社就会发多少份报纸,报社 和订报纸的客户就是上面文章开头所说的“一对多”的依赖关系

奶厂:

接口:

public interface Subject {//订阅void attach(Observer observer);//取消订阅void detach(Observer observer);//通知变动void  notifyChanged();}

实例:

public class RealSubject implements Subject{//奶厂//本奶厂下订奶的人集合private List<Observer> observerList = new ArrayList<Observer>();//添加订阅者@Overridepublic void attach(Observer observer) {observerList.add(observer);}//删除订阅者@Overridepublic void detach(Observer observer) {observerList.remove(observer);}//消息通知订阅者@Overridepublic void notifyChanged() {for (Observer observer : observerList) {observer.update();}}}

订牛奶的:

接口:

package ObserverTest;public interface Observer {/*** 接收变动通知*/void update();
}

实例:

package ObserverTest;public class RealObject implements Observer{//奶厂@Overridepublic void update() {System.out.println("通知");}
}

测试方法:
public class mainTest {public static void main(String[] args) {Subject subject = new RealSubject(); //创建奶厂Observer observer = new RealObject();//创建订阅人subject.attach(observer);//订阅人订阅 subject奶厂subject.notifyChanged();//奶厂发布消息 订阅者接收}
}

奶厂可以管理订牛奶的,删除,添加或者发布消息

订牛奶的只能接收消息

总结:

通过定义一个抽象接口 Subject(奶厂),我们可以将 奶厂 和 订奶的人 的行为统一起来。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【北京迅为】itop-3588开发板摄像头使用手册Android12 双摄方案

本章节对应资料在网盘资料“iTOP-3588 开发板\02_【iTOP-RK3588 开发板】开发资料 \07_Android 系统开发配套资料\08_Android12 摄像头使用配套资料”目录下下载。 2.1 Android12 前摄后摄 网盘中默认的 Android12 源码支持四个摄像头单独打开&#xff0c;本小节我们来修改源码…

Javascript如何实现继承?

#一、是什么 继承&#xff08;inheritance&#xff09;是面向对象软件技术当中的一个概念。 如果一个类别B“继承自”另一个类别A&#xff0c;就把这个B称为“A的子类”&#xff0c;而把A称为“B的父类别”也可以称“A是B的超类” 继承的优点 继承可以使得子类具有父类别的…

测度论原创(三)

Morden Prob 文章目录 Morden ProbWeek3多维扩展和随机向量定理3.1推论&#xff1a;random variable的变换定理3.2 连续函数的可测性定理3.3 可测函数的线性组合关于拓展实数集的延伸定理3.4 可测函数的极限依旧为可测性随机变量的概率律&#xff08;Law of X X X&#xff09;…

Sql面试题二:请查询出用户连续三天登录的所有数据记录

问题&#xff1a; 现有用户登录记录表&#xff0c;请查询出用户连续三天登录的所有数据记录 id dt 1 2024-04-25 1 2024-04-26 1 2024-04-27 1 2024-04-28 1 2024-04-30 1 2024-05-01 1 2024-05-02 1 2024-05-04 1 2024-05-05 2 2…

vite中env uat/dev文件项目配置

1&#xff1a;图示 在vscode中显示的是&#xff08;在文件中显示不是文件夹而在vscode中显示是文件夹-- .env 而这个.env也是有内容的&#xff09; 2&#xff1a;.env文件内容 # 标题 VITE_APP_TITLE管理系统# 项目本地运行端口号 VITE_PORT80# open 运行 npm run dev 时自动打…

ssm基于JAVA的网上订餐管理系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码看文章最下面 需要定制看文章最下面 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容…

向日葵远程桌面Visual Studio白屏

问题描述 今天没带笔记本&#xff0c;想着拿 Ipad 远程写会代码&#xff0c;打开VS发现白屏了&#xff0c;看了看向日葵里面的设置有GPU加速&#xff0c;发现是和VS的GPU加速冲突了 解决方案&#xff08;远程同样可用&#xff09; ALT T 弹出工具菜单O 打开选项菜单A会取消…

Pandas | 数据分析时将特定列转换为数字类型 float64 或 int64的方法

类型转换 传统方法astype使用value_counts统计通过apply替换并使用astype转换 pd.to_numericx对连续变量进行转化⭐参数&#xff1a;返回值&#xff1a;示例代码&#xff1a; isnull不会检查空字符串 数据准备 有一组数据信息如下&#xff0c;其中主要将TotalCharges、MonthlyC…

Python+Appium编写脚本

一、环境配置 1、安装JDK&#xff0c;版本1.8以上 2、安装Python&#xff0c;版本3.x以上&#xff0c;用来解释python 3、安装node.js&#xff0c;版本^14.17.0 || ^16.13.0 || >18.0.0&#xff0c;用来安装Appimu Server 4、安装npm&#xff0c;版本>8&#xff0c;用…

WPF MVVM入门系列教程(三、数据绑定)

本文主要介绍WPF的数据绑定&#xff08;Data Binding&#xff09;功能&#xff0c;如果你已经熟悉本文的内容&#xff0c;可以跳过并直接阅读后面的文章。 什么是数据绑定 我们先来看一下MSDN上的说明&#xff1a; 数据绑定是在应用 UI 与其显示的数据之间建立连接的过程。 如…

关于Dell r730xd 老服务器的阵列卡 配置系统盘RAID 1

这里写自定义目录标题 关于Dell r730xd 老服务器的阵列卡 配置系统盘RAID 1操作步骤 关于Dell r730xd 老服务器的阵列卡 配置系统盘RAID 1 操作步骤 -开机后 按 Ctrl R 进入 RAID卡 配置界面&#xff0c;如下&#xff1a;-下面图片是 服务器中硬盘都已经准备好&#xff0c;并…

Qt Udp的组播(多播)、广播和单播

UDP通讯的基本概念和特点‌ UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是‌TCP/IP协议族中的一种无连接协议&#xff0c;主要用于那些对实时性要求较高而可靠性要求较低的应用场景。UDP的主要特点包括&#xff1a; ‌无连接‌&#xff1a;…

算法每日双题精讲——双指针(快乐数,盛最多水的容器)

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 别再犹豫了&#xff01;快来订阅我们的算法每日双题精讲专栏&#xff0c;一起踏上算法学习的精彩之旅吧&#xff01;&#x1f4aa;…

C语言 | Leetcode C语言题解之第551题学生出勤记录I

题目&#xff1a; 题解&#xff1a; bool checkRecord(char* s) {int absents 0, lates 0;int n strlen(s);for (int i 0; i < n; i) {char c s[i];if (c A) {absents;if (absents > 2) {return false;}}if (c L) {lates;if (lates > 3) {return false;}} els…

【未解决】vite反向代理问题

文章目录 可行网页直接访问&#xff0c;数据正常返回不使用反向代理&#xff0c;直接用axios可以得到数据postman测试也正常 不行-vite反向代理出问题case1命令行测试 可行 网页直接访问&#xff0c;数据正常返回 在地址栏输入 https://api.binance.com/api/v3/ticker/price?…

github使用基础

要通过终端绑定GitHub账号并进行文件传输&#xff0c;你需要使用Git和SSH密钥来实现安全连接和操作。以下是一个基本流程&#xff1a; 设置GitHub和SSH 检查Git安装 通过终端输入以下命令查看是否安装Git&#xff1a; bash 复制代码 git --version配置Git用户名和邮箱 bash …

9_api_intro_imagerecognition_ocr2word

通用图片 OCR 到 Word API 数据接口 高可用图像识别引擎&#xff0c;基于机器学习&#xff0c;超精准识别率。 1. 产品功能 通用的识别接口&#xff0c; 支持多种图片格式&#xff1b;支持中英文字符混合识别&#xff1b;支持 Base64 以及网络地址传参&#xff1b;基于机器学习…

深度优先搜索之全排列问题(C语言版)

本文的一些参考&#xff1a; DFS (深度优先搜索) 算法详解 模板 例题&#xff0c;这一篇就够了_dfs算法-CSDN博客 首先把深度优先搜索算法的基本概论摆出来 深度优先搜索算法&#xff08;Depth First Search&#xff0c;简称DFS&#xff09;&#xff1a; 一种用于遍历或搜…

如何防止苹果MacOS进入休眠状态

前言 远程控制的时候&#xff0c;发现MacOS已经进入了休眠状态。如何设置MacOS&#xff0c;防止其进入休眠状态&#xff0c;这样才能远程控制。 1、进入系统偏好设置 显示器自动关闭了不要紧。只要操作系统不进入休眠就可以。

云计算:定义、类型及对企业的影响

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 云计算&#xff1a;定义、类型及对企业的影响 云计算&#xff1a;定义、类型及对企业的影响 云计算&#xff1a;定义、类型及对企…