当前位置: 首页 > news >正文

Java设计模式以及代理模式

一、设计模式

1.JAVA六大设计原则

JAVA设计模式提供六个基本原则,分别是:

  • 开闭原则(OCP) - The Open-Closed Principle
  • 单一职责原则(SRP) - Single Responsibility Principle
  • 里氏替换原则(LSP) - Liskov Substitution Principle
  • 依赖倒置原则(DIP) - Dependency Inversion Principle
  • 接口隔离原则(ISP) - Interface Segregation Principle
  • 迪米特法则(DP) - Demeter Principle
2.JAVA23种设计模式

在软件工程当中,设计原则和设计模式是不同的.

3.设计原则

设计原则是为了更好的设计软件的高层指导方针. 

它不提供具体的实现方式也不会绑定任何一种编程语言.  

最常用的原则是SOLID(SRP, OCP, LSP, ISP, DIP)原则

4.设计模式

设计模式对关于面向对象问题的具体解决方案.

比如说, 如果你想创建一个类而且它在任何时刻只会有一个对象,那么你就应该使用单例类模式.

设计模式是经过大量检测的安全的做法.

4.1 工厂模式(factory)

案例:

INoodles:

package com.ztt.test;public interface INoodles {public void noodleType();
}

LanZhouLaMianImp:

package com.ztt.test;public class LanZhouLaMianImp implements INoodles{@Overridepublic void noodleType() {System.out.println("========来一碗兰州拉面========");}
}

ReGanMianNoodleImp:

package com.ztt.test;public class ReGanMianNoodleImp implements INoodles{@Overridepublic void noodleType() {System.out.println("========来一碗武汉热干面========");}
}

YouPoMianNoodleImp:

package com.ztt.test;public class YouPoMianNoodleImp  implements INoodles{@Overridepublic void noodleType() {System.out.println("========来一碗油泼面========");}
}

NoodleFactory:

package com.ztt.test;
/*** 面长* */
public class NoodleFactory {/*** 规范下面条类型* */public static final int NOODLE_YOUPO = 1;public static final int NOODLE_REGAN = 2;public static final int NOODLE_LANZHOULA = 3;/***创建面条**/public static  INoodles getNoodle(int type){if (type == 1){return new YouPoMianNoodleImp();}else if(type ==2){return new ReGanMianNoodleImp();}else if(type ==3 ){return new LanZhouLaMianImp();}return null;}}
package com.ztt.test;public class Test01 {public static void main(String[] args) {NoodleFactory.getNoodle(NoodleFactory.NOODLE_LANZHOULA).noodleType();NoodleFactory.getNoodle(3).noodleType();}
}
4.2 单列设计模式(singlton)

饿汉式:

package com.ztt.hungrytest;
/*** 饿汉式* */
public class Student {//3.创建static修饰的成员变量private static Student stu = new Student();//1.设计私有构造方法private Student(){super();}//2.提供共有的方法public static synchronized Student getInstance(){return stu;}}
package com.ztt.hungrytest;import com.ztt.lazytest.Student;
public class Test03 {public static void main(String[] args) {com.ztt.lazytest.Student stu1 = com.ztt.lazytest.Student.getInstance();Student stu2 = Student.getInstance();System.out.println(stu1== stu2);}}

懒汉式:

package com.ztt.lazytest;
/*** 懒汉式* */
public class Student {//3.创建static修饰的成员变量private static Student stu;//1.设计私有构造方法private Student(){super();}//2.提供共有的方法public static synchronized Student getInstance(){if(stu == null){stu = new Student();}return stu;}}
package com.ztt.lazytest;public class Test02 {public static void main(String[] args) {Student stu1 = Student.getInstance();Student stu2 = Student.getInstance();System.out.println(stu1== stu2);}}

六、代理模式

1.什么是代理模式?
  • 代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
  • 通俗的来讲代理模式就是我们生活中常见的中介。
  • 举个例子来说明:假如说我现在想买一辆二手车,虽然我可以自己去找车源,
  • 做质量检测等一系列的车辆过户流程,但是这确实太浪费我得时间和精力了。
  • 我只是想买一辆车而已为什么我还要额外做这么多事呢?于是我就通过中介
  • 公司来买车,他们来给我找车源,帮我办理车辆过户流程,我只是负责选择
  • 自己喜欢的车,然后付钱就可以了。
2.为什么要用代理模式?
2.1 中介隔离作用:

在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。

2.2 开闭原则,增加功能:

代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。

3.有哪几种代理模式?

我们有多种不同的方式来实现代理。如果按照代理创建的时期来进行分类的话可以分为两种:

3.1 静态代理:

静态代理是由程序员创建或特定工具自动生成源代码,在对其编译。

在程序员运行之前,代理类.class文件就已经被创建了。

静态代理案例:

package com.ztt.statictest;public interface IWonman {public void makeEyeWithMan();
}
package com.ztt.statictest;public class PanJinLianImp implements IWonman{@Overridepublic void makeEyeWithMan() {System.out.println("回眸一笑,抛个媚眼~");}
}
package com.ztt.statictest;//代理
public class WangPoImp implements IWonman{//被代理对象IWonman obj;public WangPoImp(IWonman obj) {this.obj = obj;}@Overridepublic void makeEyeWithMan() {System.out.println("镇一壶酒,搞搞气氛~");obj.makeEyeWithMan();}
}
package com.ztt.statictest;public class XiMenQingTest {public static void main(String[] args) {//1.创建被代理对象IWonman pan = new PanJinLianImp();//2.创建代理IWonman wang = new WangPoImp(pan);wang.makeEyeWithMan();}
}
3.2 动态代理:

动态代理是在程序运行时通过反射机制动态创建的。

动态代理分为:

基于接口的动态代理(jdk自带)

基于子类的动态代理(第三方)

3.2.1 动态代理jdk自带的案例:
package com.ztt.jdktest;/*** @author 甜甜* @version 1.0* @since 2024/8/8*/
public interface ISinger {public void sing();public int dance(int num);
}
package com.ztt.jdktest;/*** @author 甜甜* @version 1.0* @since 2024/8/8*/
public class XuezhiqianImp implements ISinger{@Overridepublic void sing() {System.out.println("唱歌");}@Overridepublic int dance(int num) {System.out.println("跳舞");return 0;}
}
package com.ztt.jdktest;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** @author 甜甜* @version 1.0* @since 2024/8/8*/
public class Test01 {public static void main(String[] args) {//1.创建被代理对象final ISinger xue = new XuezhiqianImp();//2.创建代理对象ISinger jingJiRen = (ISinger) Proxy.newProxyInstance(xue.getClass().getClassLoader(), xue.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("===做个自我介绍===");Object obj = method.invoke(xue,args);return obj;}});jingJiRen.sing();//jingJiRen.dance(6);}
}

3.2.2 动态代理第三方案例:

① 导入坐标

<dependencies><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>2.2.2</version></dependency></dependencies>

② 代码展示:

package com.ztt.cglibtest;/*** @author 甜甜* @version 1.0* @since 2024/8/8*/
public interface ISinger {public void sing();
}
package com.ztt.cglibtest;/*** @author 甜甜* @version 1.0* @since 2024/8/8*/
public class TengGeErImp implements ISinger{@Overridepublic void sing() {System.out.println("听了赵雷的成都去了成都,听了汪峰的北京去了北京,至今不敢听腾格尔的天堂~");}
}
package com.ztt.cglibtest;import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.InvocationHandler;import java.lang.reflect.Method;/*** @author 甜甜* @version 1.0* @since 2024/8/8*/
public class Test02 {public static void main(String[] args) {//创建被代理对象final ISinger teng = new TengGeErImp();//创建代理对象ISinger jing=(ISinger) Enhancer.create(teng.getClass(), teng.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object o, Method method, Object[] objects) throws Throwable {Object object = method.invoke(teng,objects);return object;}});jing.sing();}
}

相关文章:

Java设计模式以及代理模式

一、设计模式 1.JAVA六大设计原则 JAVA设计模式提供六个基本原则&#xff0c;分别是&#xff1a; 开闭原则(OCP) - The Open-Closed Principle单一职责原则(SRP) - Single Responsibility Principle里氏替换原则(LSP) - Liskov Substitution Principle依赖倒置原则(DIP) - D…...

Elasticsearch 索引库管理:查询、修改与删除

Elasticsearch 是一个高度可扩展的开源全文搜索和分析引擎&#xff0c;它允许用户通过 RESTful API 进行数据的索引、搜索、更新和管理。在 Elasticsearch 中&#xff0c;索引库&#xff08;Index&#xff09;是存储数据的基本单元。本文将介绍如何查询、修改和删除 Elasticsea…...

视频大怎么压缩小?分享3种视频压缩方法

视频大怎么压缩小&#xff1f;视频文件过大时&#xff0c;压缩视频不仅能帮助我们节省宝贵的存储空间&#xff0c;使其更容易在有限容量的设备中保存&#xff0c;还能显著提升传输效率&#xff0c;特别是在网络条件有限或需要快速分享视频内容的场合。通过专业的压缩工具&#…...

springboot项目搭建集成 redis/跨域/远程请求

目录 一&#xff0c;创建maven项目 1&#xff0c;左上角file > new > maven project 2&#xff0c;next 到 创建 Group id 和 Artifact id​编辑​编辑 二&#xff0c;配置springboot 1&#xff0c;配置pom文件&#xff0c; 2&#xff0c;创建启动类 3&#xff…...

lvs详解及实例配置

目录 1.什么是负载均衡 1.1为什么用负载均衡 1.2.负载均衡类型 1.2.1.四层负载均衡 1.2.2.七层负载均衡 1.3 四层和七层的区别 2.LVS介绍 2.1LVS 的优势与不足 2.2LVS 核心组件和专业术语 3.ipvsadm命令 4.LVS集群中的增删改 4.1.管理集群服务中的增删改 4.2.管理集…...

DAY41-动态规划-买卖股票

LeetCode121. 买卖股票的最佳时机 public int maxProfit(int[] prices) {//dp数组含义&#xff1a;0为持有该股票&#xff0c;1为不持有该股票int[][] dp new int[prices.length][2];dp[0][0]-prices[0];dp[0][1]0;for(int i1;i<prices.length;i) {dp[i][0]Math.max(dp[i-…...

【C#】StringComparer

什么是“文化” 在 .NET 中&#xff0c;“文化”&#xff08;Culture&#xff09;指的是与语言、地区、和区域设置相关的特定信息集合。这些信息包括了日期和时间的格式、数字的表示方式、货币符号、字符串比较规则等等。文化的概念在软件开发中特别重要&#xff0c;因为应用程…...

阿里云服务器远程登录问题解决指南

前言 在使用阿里云服务器时&#xff0c;可能会遇到无法通过密码进行远程登录的情况。这种情况通常是因为操作系统默认禁用了密码登录功能。本文将介绍如何解决这一问题&#xff0c;确保能够顺利地通过密码进行远程登录。 问题描述 当尝试通过Workbench进行密码登录时&#x…...

Datawhale X 魔搭 AI夏令营(2024第四期)AIGC方向 学习笔记

粗谈 这一期是使用可图lora微调进行文生图任务的比赛 文生图也算是跨模态了&#xff0c;输入Prompt文本&#xff0c;输出图片。Prompt很重要&#xff0c;分为prompts和negative prompts。可以指导结果图片的生成。 lora可以参考我上期夏令营的文章:Datawhale AI 夏令营&…...

VScode前端环境搭建

前言 VScode是企业中最常用的前端开发工具&#xff0c;本文描述如何利用VScode搭建前端开发环境 一、安装VScode 下载Vscode 点击前往下载页面 安装 安装时一直点击下一步即可 二、环境配置 1&#xff09;更改语言 点击拓展搜索Chinese后下载第一个&#xff0c;下载完后…...

Python自动化测试之selenium - 元素定位

元素定位 元素定位就是通过元素的信息或者元素层级结构来定位元素。当定位到了重复的属性&#xff0c;默认会定位到第一个标签。 id定位 - find_element_by_id 同一个html页面中id值是唯一的。 模拟在百度输入框中输入想要查找的内容 python 代码解读 复制代码 from sel…...

深入探索 npm cache clean --force:清理 npm 缓存的艺术

npm 是 JavaScript 编程语言的包管理器&#xff0c;它是 Node.js 运行环境的默认包管理器。npm 提供了一个丰富的生态系统&#xff0c;包括数以百万计的可重用代码包。然而&#xff0c;随着时间的推移&#xff0c;npm 的缓存可能会变得庞大&#xff0c;影响性能或导致一些奇怪的…...

如何看待“低代码”开发平台的兴起?

如何看待“低代码”开发平台的兴起&#xff1f; 近年来&#xff0c;“低代码”开发平台如雨后春笋般涌现&#xff0c;承诺让非专业人士也能快速构建应用程序。这种新兴技术正在挑战传统软件开发模式&#xff0c;引发了IT行业的广泛讨论。低代码平台是提高效率的利器&#xff0…...

自动控制——过阻尼、欠阻尼、临界阻尼及无阻尼

自动控制——过阻尼、欠阻尼、临界阻尼及无阻尼 引言 在自动控制系统和振动分析中&#xff0c;系统的阻尼特性对于系统的动态响应至关重要。阻尼决定了系统在受到扰动或输入信号后&#xff0c;如何恢复到稳定状态。本文将详细介绍过阻尼&#xff08;overdamped&#xff09;、…...

从AlphaGo到AlphaPong:AI乒乓球机器人将如何改变乒乓球竞技?

在人工智能领域&#xff0c;谷歌DeepMind的AlphaGo曾以其超凡的围棋能力震惊了世界。而如今&#xff0c;DeepMind又将其技术延伸到了乒乓球领域&#xff0c;推出了乒乓球机器人&#xff0c;被网友戏称为“AlphaPong”。这一机器人使用ABB的IRB1100机械手臂&#xff0c;能够与普…...

荒原之梦:考研期间可以玩游戏吗?

有不少同学&#xff0c;特别是男同学&#xff0c;在考研之前&#xff0c;会有玩游戏的习惯&#xff0c;那么&#xff0c;对于考研的同学来说&#xff0c;就会产生这样一个疑问。在考研备考期间&#xff0c;我还可以玩游戏吗&#xff1f; 其实关于这个问题的答案是因人而异的&am…...

Hive SQL ——窗口函数源码阅读

前言 使用Starrocks引擎中的窗口函数 row_number() over( )对10亿的数据集进行去重操作&#xff0c;BE内存溢出问题频发&#xff08;忘记当时指定的BE内存上限是多少了.....&#xff09;&#xff0c;此时才意识到&#xff0c;开窗操作&#xff0c;如果使用 不当&#xff0c;反而…...

用python的Manim 创建大括号

Brace 是 Manim 中用于创建大括号&#xff08;curly braces&#xff09;的一个对象类。它有几个子类&#xff0c;自定义了不同的功能。下面是每个类的简要解释&#xff1a; 1. ArcBrace 功能: 创建一个环绕弧线的括号。适用于需要围绕弧形线条的场景。用法: 通常用于图形中有…...

白骑士的Matlab教学附加篇 5.2 代码规范与最佳实践

系列目录​​​​​​​ 上一篇&#xff1a;白骑士的Matlab教学附加篇 5.1 MATLAB开发工具 在 MATLAB 编程中&#xff0c;遵循良好的代码规范和最佳实践有助于提高代码的可读性、可维护性和可重用性。无论是变量命名、注释风格&#xff0c;还是代码格式化&#xff0c;合理的规…...

Javaweb--SpringBoot

1.SpringBoot入门 简化Spring开发的一个框架&#xff0c;Spring Boot 旨在帮助开发者快速搭建 Spring 框架。 整个Spring的一个合集&#xff0c;可以简化配置 2.微服务 &#xff08;1&#xff09;微服务就是一种架构风格 &#xff08;2&#xff09;微服务就是把一个项目拆…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...