设计模式动态代理

什么是设计模式?

  • 一个问题通常有n种解法,其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式

    设计模式有20多种,对应20多种软件开发中会遇到的问题。

关于设计模式的学习,主要学什么?

  1. 解决什么问题
  2. 如何写

设计模式:工厂模式

什么是工厂设计模式?

之前我们创建类对象时,都是使用new对象的形式创建,在很多业务场景下也提供了不直接new的方式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一,这种类型的设计模式属于创建型模式,它提供了一种获取对象的方式。

工厂设计模式的作用:

  • 工厂的方法可以封装对象的创建细节,比如:为该对象进行加工和数据注入
  • 可以实现类与类之间的解耦操作(核心思想)

设计模式:装饰模式

什么是装饰设计模式?

创建一个新类,包装原始类,从而在新类中提升原来类的功能。

装饰设计模式的作用:

作用: 装饰模式指的是在不改变原类的基础上,动态地扩展一个类的功能

InputStream(抽象父类)
FileInputStream(实现子类, 读写性能较差)
BufferedInputStream(实现子类, 装饰类, 读写性能高)
  1. 定义父类
  2. 定义原始类,继承父类,定义功能。
  3. 定义装饰类,继承父类,包装原始类,增强功能!!

单例设计模式(重点)

缺点: 如果有多个单例的话,在程序一开始运行前便会占内存

作用:确保一个类只有一个对象。

场景:计算机中的回收站、任务管理器、Java中的Runtime类等

写法

  • 把类的构造器私有(保证别人不能new)
  • 在类中自己创建一个对象,并赋值到一个变量
  • 定义一个静态方法,返回自己创建的这个对象
饿汉式单例:拿对象时,对象早就创建好了。
// 单例类
public class A {// 2、定义一个类变量记住类的一个对象private static A a = new A();// 1、私有构造器private A(){ }// 3、定义一个类方法返回对象public static A getObject(){return a;}
}

懒汉式单例设计模式(重点)

第一次拿对象时,才开始创建对象
写法

  • 把类的构造器私有(保证别人不能new)
  • 在类中定义一个类变量用于存储对象(注意:此时只定义,不创建)
  • 提供一个类方法,在方法中创建并返回对象(要保证只创建一次)
public class B {// 2、定义一个类变量量用于存储对象public static B b ; // null// 1、单例必须私有构造器private B(){ }// 3、提供一个类方法返回类的一个对象public synchronized static B getObject(){if(b == null){b = new B();}return b;}
}

数据输入(应用)

我们可以通过 Scanner 类来获取用户的输入。使用步骤如下:

1、导包。Scanner 类在java.util包下,所以需要将该类导入。导包的语句需要定义在类的上面。

import java.util.Scanner; 

2、创建Scanner对象。

Scanner sc = new Scanner(System.in);// 创建Scanner对象,sc表示变量名,其他均不可变

3、接收数据

int i = sc.nextInt(); // 表示将键盘录入的值作为int数返回。

示例:

import java.util.Scanner;
public class ScannerDemo {public static void main(String[] args) {//创建对象Scanner sc = new Scanner(System.in);//接收数据int x = sc.nextInt();//输出数据System.out.println("x:" + x);}
}

改写三个和尚案例,数据使用键盘录入。

import java.util.Scanner;
public class ScannerTest {public static void main(String[] args) {//身高未知,采用键盘录入实现。首先导包,然后创建对象。Scanner sc = new Scanner(System.in);//键盘录入三个身高分别赋值给三个变量。System.out.println("请输入第一个和尚的身高:");int height1 = sc.nextInt();System.out.println("请输入第二个和尚的身高:");int height2 = sc.nextInt();System.out.println("请输入第三个和尚的身高:");int height3 = sc.nextInt();//用三元运算符获取前两个和尚的较高身高值,并用临时身高变量保存起来。int tempHeight = height1 > height2 ? height1 : height2;//用三元运算符获取临时身高值和第三个和尚身高较高值,并用最大身高变量保存。int maxHeight = tempHeight > height3 ? tempHeight : height3;//输出结果。System.out.println("这三个和尚中身高最高的是:" + maxHeight +"cm");}
}
import java.util.Scanner;
public class IfTest02 {public static void main(String[] args) {//小明的考试成绩未知,可以使用键盘录入的方式获取值Scanner sc = new Scanner(System.in);	System.out.println("请输入一个分数:");int score = sc.nextInt();//由于奖励种类较多,属于多种判断,采用if...else...if格式实现//为每种判断设置对应的条件//为每种判断设置对应的奖励	//数据测试:正确数据,边界数据,错误数据if(score>100 || score<0) {System.out.println("你输入的分数有误");} else if(score>=95 && score<=100) {System.out.println("山地自行车一辆");} else if(score>=90 && score<=94) {System.out.println("游乐场玩一次");} else if(score>=80 && score<=89) {System.out.println("变形金刚玩具一个");} else {System.out.println("胖揍一顿");}}
}

动态代理

程序为什么需要代理?代理长什么样?

  • 代理就是被代理者没有能力或者不愿意去完成某件事情,需要找个人代替自己去完成这件事,动态代理就是用来对业务功能(方法)进行代理的。
  • 对象如果嫌身上干的事太多的话,可以通过代理来转移部分职责。
  • 对象有什么方法想被代理,代理就一定要有对应的方法

关键步骤

  • 必须有接口,实现类要实现接口(代理通常是基于接口实现的)
  • 创建一 个实现类的对象,该对象为业务对象,紧接着为业务对象做一个代理对象。
image-20240412230747658

如何为Java对象创建一个代理对象

java.lang.reflect.Proxy类:提供了为对象产生代理对象的方法:

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 
参数一:用于指定用哪个类加载器,去加载生成的代理类
参数二:指定接口,这些接口用于指定生成的代理长什么,也就是有哪些方法
参数三:用来指定生成的代理对象要干什么事情

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

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

相关文章

onedrive下載zip檔案有20G限制,如何解決

一般來說&#xff0c;OneDrive網頁版對文件下載大小的限制如下圖所示&#xff0c;更多資訊&#xff0c;請您參考這篇文章&#xff1a;OneDrive 和 SharePoint 中的限制 - Microsoft Support 因此我們推薦您使用OneDrive同步用戶端來同步到本地電腦&#xff0c;您也可以選擇只同…

MFC 列表控件删除实例(源码下载)

1、本程序基于前期我的博客文章《MFC下拉菜单打钩图标存取实例&#xff08;源码下载) 》 2、程序功能选中列表控件某一项&#xff0c;删除按钮由禁止变为可用&#xff0c;点击删除按钮&#xff0c;选中的项将删除。 3、首先在主界面添加一个删除参数按钮。 4、在myDlg.cpp 文件…

巨人网络发布2023年年报:全力拥抱AI浪潮,开启游戏产业新篇章

易采游戏网5月3日消息&#xff0c;国内知名游戏公司巨人网络发布了其2023年度财务报告&#xff0c;报告显示&#xff0c;公司在过去一年中积极拥抱AI技术&#xff0c;实现了业绩的稳步增长&#xff0c;为游戏产业带来了新的活力与机遇。 在报告中&#xff0c;巨人网络详细阐述了…

【C++】STL简介

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; C 目录 前言什么是STL&#xff1f;STL的历史STL的版本STL六大组件STL的优缺点STL的优点&#xff1a;STL的缺点&#xff1a; 如何学习STL结语 前言 本篇博客主要内容&#xff1a;STL简介。…

240503-关于Unity的二三事

240503-关于Unity的二三事 1 常用快捷键 快捷键描述CtrlP播放/停止Ctrl1打开Scene窗口Ctrl2打开Game窗口Ctrl3打开Inspect窗口Ctrl4打开Hierarchy窗口Ctrl5打开Project窗口Ctrl6打开Animation窗口 2 关联VisualStudio2022 3 节约时间&#xff1a;将最新声明的参数移动到最上…

解决wget报错:ERROR 403: Forbidden.

原因&#xff1a; 服务器正在检查引用者&#xff0c;部分 HTTP 请求会得到错误响应。不以 Mozilla 开头或不包含 Wget 的用户代理的请求会被拒绝。 解决方案&#xff1a; wget --user-agent“Mozilla” 要下载的链接 如&#xff1a; wget --user-agent"Mozilla" …

jvm垃圾回收机制介绍

JVM&#xff08;Java虚拟机&#xff09;是Java程序的运行环境&#xff0c;它负责执行字节码文件。JVM的工作原理主要包括以下几个部分&#xff1a;类加载器、执行引擎、垃圾收集器和内存管理。类加载器负责加载字节码文件并将其转换成Java平台上的机器码&#xff0c;执行引擎负…

java入门-日期类

日期类 Date类 Date类表示特定的时间&#xff0c;可以精确到毫秒。 获取Date对象 Date date new Date(); 构造方法 /*** Allocates a <code>Date</code> object and initializes it so that* it represents the time at which it was allocated, measured to…

k8s笔记 | Ingress

安装Ingress 添加helm创库 Installation Guide - Ingress-Nginx Controller Ingress | Kubernetes 下载包 将 文件helm 放到 /usr/local/bin/ 并给到执行权限 # 添加可执行权限 chmod ux helm # 测试是否能运行 helm version# 结果 version.BuildInfo{Version:"v3.14…

详细分析Java中的敏感词过滤(附Demo)

目录 前言1. 简易Demo2. 进阶Demo 前言 敏感词直接过滤&#xff0c;有效防止敏感信息的上传 本文主要给一个启发的思路 1. 简易Demo 通过简易的Demo机制了解基本原理 import java.util.HashSet; import java.util.Set;public class test {private Set<String> sensi…

基于STM32的最小系统电路设计(STM32F103C8T6为例)

前言&#xff1a;本篇博客为嵌入式硬件领域的文章&#xff0c;对 STM32 的最小系统电路设计进行教学。本篇博客以嘉立创 EDA&#xff08;标准版&#xff09;进行绘制 STM32F103C8T6 的最小系统电路 PCB 板&#xff0c;STM32 的最小系统通常包括&#xff1a;微控制器、时钟电路、…

python从0开始学习

目录 前言 1、print函数 2、input函数 3、保留字和标识符 总结 前言 本篇文章我们开辟一个新的学习模块&#xff1a;python。python是一个十分简洁实用的编程语言&#xff0c;我们将从0开始学习python 1、print函数 print(*args, sep , end\n, fileNone, flushFalse) pytho…

ESP-01/01S 烧录固件

目录 一、ESP-01 与 ESP-01S 的区别二、ESP-01 与 ESP-01S 烧录 AT 固件1、模块接线a、管脚功能定义b、模组启动模式c、模块接线 2、下载 AT 固件3、下载固件烧录工具4、固件烧录步骤5、模块快速烧录 AT 固件 三、ESP-01 与 ESP-01S 发送 AT 指令1、模块接线2、上电信息3、发送…

硅片和SOI哪个研究方向更好?

知识星球&#xff08;星球名&#xff1a;芯片制造与封测社区&#xff0c;星球号&#xff1a;63559049&#xff09;里的学员问&#xff1a;我研一将要结束&#xff0c;即将进入课题组。我们课题组方向有硅片和soi两种方向&#xff0c;这两种方向该如何选择呢&#xff1f; 硅片与…

Linux的Shell脚本详解

本文目录 一、什么是 Shell 脚本文件 &#xff1f;二、编写Shell脚本1. 基本规则2. shell 变量&#xff08;1&#xff09;创建变量&#xff08;2&#xff09;引用变量&#xff08;3&#xff09;删除变量&#xff08;4&#xff09;从键盘读取变量&#xff08;5&#xff09;特殊变…

Vulnhub-DIGITALWORLD.LOCAL: VENGEANCE渗透

文章目录 前言1、靶机ip配置2、渗透目标3、渗透概括 开始实战一、信息获取二、smb下载线索三、制作字典四、爆破压缩包密码五、线索分析六、提权&#xff01;&#xff01;&#xff01; Vulnhub靶机&#xff1a;DIGITALWORLD.LOCAL: VENGEANCE ( digitalworld.local: VENGEANCE …

【linux】初步认识文件系统

初步认识文件系统 前置知识的简单了解简单回顾C语言的文件操作stdin&stdout&stderr 系统文件IOopen函数的返回值文件描述符fd打开文件背后的操作文件描述符的分配规则 前置知识的简单了解 文件包括了文件内容和文件属性两个部分(文件内容顾名思义就是文件里面的数据等…

tomcat启动闪退问题解决方法

文章目录 Tomcat启动闪退的常见问题及解决方法Tomcat是什么启动闪退的常见问题及解决方法1. 内存不足问题描述&#xff1a;案例分析&#xff1a;解决方法&#xff1a; 2. 端口冲突问题描述&#xff1a;解决方法&#xff1a; 3. 日志错误问题描述&#xff1a;解决方法&#xff1…

冰蓄冷系统基础知识

冰蓄冷是将水制成冰储存冷量&#xff0c;它是潜热蓄冷的一种方式。当压力保持不变时&#xff0c;物质在相变过程中保持恒定温度并吸收或释放热量&#xff0c;通常把这个温度称为相变温度(即溶解温度或凝固温度)&#xff0c;把吸收或释放的热量称相变潜热。在常压下&#xff0c;…

基于Python的LSTM网络实现单特征预测回归任务(TensorFlow)

目录 一、数据集 二、任务目标 三、代码实现 1、从本地路径中读取数据文件 2、数据归一化 3、创建配置类&#xff0c;将LSTM的各个超参数声明为变量&#xff0c;便于后续使用 4、创建时间序列数据 5、划分数据集 6、定义LSTM网络 &#xff08;1&#xff09;创建顺序模…