Java进阶13讲__补充2/2

server/2024/9/25 9:10:10/

1.  设计模式

1.1  什么是设计模式

1.2  单例设计模式

java">package com.itheima.a_单例_饿汉式;public class T1 {public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {Demo demo = Demo.createDemo();System.out.println(Thread.currentThread() + "::" + demo);}}).start();new Thread(new Runnable() {@Overridepublic void run() {Demo demo1 = Demo.createDemo();System.out.println(Thread.currentThread() + "::" + demo1);}}).start();new Thread(new Runnable() {@Overridepublic void run() {Demo demo1 = Demo.createDemo();System.out.println(Thread.currentThread() + "::" + demo1);}}).start();new Thread(new Runnable() {@Overridepublic void run() {Demo demo1 = Demo.createDemo();System.out.println(Thread.currentThread() + "::" + demo1);}}).start();new Thread(new Runnable() {@Overridepublic void run() {Demo demo1 = Demo.createDemo();System.out.println(Thread.currentThread() + "::" + demo1);}}).start();new Thread(new Runnable() {@Overridepublic void run() {Demo demo1 = Demo.createDemo();System.out.println(Thread.currentThread() + "::" + demo1);}}).start();}
}class Demo {private static final Demo demo = new Demo();public static final Demo createDemo() {return demo;}private Demo() {}private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

1.3  懒汉式单例设计模式

java">package com.itheima.b_单例_懒汉式;/*
单例设计模式作用:确保一个类只有一个对象。场景:计算机中的回收站、任务管理器、Java中的Runtime类等懒汉式(第一次获取时创建对象)把类的构造器私有(保证别人不能new)在类中定义一个类变量用于存储对象(注意:此时只定义,不创建)提供一个类方法,在方法中创建并返回对象(要保证只创建一次)注意获取方法需要使用synchronized修饰,以保证只有一个线程可以成功创建出对象
*/
public class Demo {//在类中定义一个类变量用于存储对象(注意:此时只定义,不创建)private static volatile Demo demo;//提供一个类方法,在方法中创建并返回对象(要保证只创建一次)public static Demo createDemo() {if (demo == null) {synchronized (Demo.class) {if (demo == null) {demo = new Demo();}}}return demo;}//把类的构造器私有(保证别人不能new)private Demo() {}
}
java">package com.itheima.b_单例_懒汉式;public class T1 {public static void main(String[] args) {while (true) {new Thread(new Runnable() {@Overridepublic void run() {Demo demo = Demo.createDemo();System.out.println(Thread.currentThread() + "::" + demo);}}).start();}}
}

1.4  枚举实现单例模式

java">package com.itheima.c_单例_枚举实现;import java.sql.SQLOutput;/*
单例设计模式作用:确保一个类只有一个对象。场景:计算机中的回收站、任务管理器、Java中的Runtime类等枚举实现单例直接在枚举中提供一个枚举项就可以实现单例注意Google首席Java架构师、(Effective Java》 一书作者Java集合框架的开创者Joshua Bloch在Effective Java一书中提到单元素的枚举类型,已经成为实现singleton的最佳方法在这种实现方式中,既可以避免多线程同步问题还可以防止通过反射和反序列化来重新创建新的对象在很多优秀的开源代码中,我们经常可以看到使用枚举方式来实现的单例模式类
*/
public class Demo {public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Animal.SunQing.hashCode());}}).start();new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Animal.SunQing.hashCode());}}).start();new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Animal.SunQing.hashCode());}}).start();new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Animal.SunQing.hashCode());}}).start();new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Animal.SunQing.hashCode());}}).start();new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Animal.SunQing.hashCode());}}).start();}
}
enum Animal{SunQing
}

2.  动态代理

2.1  入门案例 

ProxyUtil.java

java">package com.itheima.d_动态代理_入门;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** 代理工具类,生成代理对象*/
public class ProxyUtil {/*** 创建zxr代理对象** @return*/public static Star returnObject(Star item) {//获取被代理类对象//参数传入//编写代理类业务逻辑InvocationHandler handler = new InvocationHandler() {/*** @param proxy  生成的代理对象* @param method 调用代理对象的方法名字* @param args   参数* @return* @throws Throwable*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {String methodName = method.getName();if (methodName.equals("sing")) {
//                执行method唱歌System.out.println("经纪人准备话筒,收钱");Object obj = method.invoke(item, args);return obj;} else {
//                执行method跳舞System.out.println("经纪人准备场地,收钱");Object obj = method.invoke(item, args);return obj;}}};//生成代理类对象Object obj = Proxy.newProxyInstance(item.getClass().getClassLoader(),item.getClass().getInterfaces(),handler);//返回代理类对象return (Star) obj;}
}

Star.interface

java">package com.itheima.d_动态代理_入门;//明星接口
public interface Star {String sing(String name);/*** 跳舞*/void dancing();
}

ZXR.java

java">package com.itheima.d_动态代理_入门;//Sakream实现类
public class ZXR implements Star {@Overridepublic String sing(String name) {System.out.println("zxr开始唱歌,歌名:" + name);return name;}@Overridepublic void dancing() {System.out.println("zxr开始跳舞");}
}

Test.java

java">package com.itheima.d_动态代理_入门;public class Test {public static void main(String[] args) {
//        创建被代理对象ZXR zxr = new ZXR();
//        创建代理对象Star star = ProxyUtil.returnObject(zxr);
//        调用代理对象干活star.sing("罗生门");star.dancing();}
}

2.2  业务案例

UserService.interface

java">package com.itheima.e_动态代理_案例;/*** 用户业务接口*/
public interface UserService {// 登录功能void login(String loginName, String passWord) throws Exception;// 删除用户void deleteUsers() throws Exception;// 查询用户,返回数组的形式。String[] selectUsers() throws Exception;
}

UserServiceImpl.java

java">package com.itheima.e_动态代理_案例;/*** 用户业务实现类*/
public class UserServiceImpl implements UserService {@Overridepublic void login(String loginName, String passWord) throws Exception {if ("admin".equals(loginName) && "123456".equals(passWord)) {System.out.println("您登录成功,欢迎光临本系统~");} else {System.out.println("您登录失败,用户名或密码错误~");}Thread.sleep(1000);}@Overridepublic void deleteUsers() throws Exception {System.out.println("成功删除了1万个用户~");Thread.sleep(1500);}@Overridepublic String[] selectUsers() throws Exception {System.out.println("查询出了3个用户");String[] names = {"张全蛋", "李二狗", "牛爱花"};Thread.sleep(500);return names;}
}

ProxyUtils.java

java">package com.itheima.e_动态代理_案例;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
import java.util.Date;public class ProxyUtils {public static UserService createProxy(UserService impl) {InvocationHandler invocationHandler = new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//                调用代理对象的名字String methodName = method.getName();
//                计时long begin = System.currentTimeMillis();
//                执行方法if (methodName.equals("login")) {
//                    记录用户登录日志System.out.println(new Date() + "--" + Arrays.toString(args) + "用户登录了");}Object obj = method.invoke(impl, args);
//                结束long end = System.currentTimeMillis();long longTime = end - begin;System.out.println(methodName + "方法执行了:[" + longTime + "毫秒]");return obj;}};UserService us = (UserService) Proxy.newProxyInstance(impl.getClass().getClassLoader(),impl.getClass().getInterfaces(),invocationHandler);return us;}
}

Test.java

java">package com.itheima.e_动态代理_案例;import java.util.Arrays;/*** 目标:使用动态代理解决实际问题,并掌握使用代理的好处。*/
public class Test {public static void main(String[] args) throws Exception {// 1、创建用户业务对象UserService userService = new UserServiceImpl();UserService proxy = ProxyUtils.createProxy(userService);proxy.login("admin", "123456");proxy.deleteUsers();String[] names = proxy.selectUsers();System.out.println("查询到的用户是:" + Arrays.toString(names));System.out.println("----------------------------------");}
}

http://www.ppmy.cn/server/116924.html

相关文章

String存储原理

1.是什么 在Java中,String 是一种特殊的类,它是不可变的并且存储在堆内存中。为了理解 String 的存储原理,我们需要分解几个关键概念:不可变性、堆内存、字符串常量池和垃圾回收机制。下面我将详细解释这些概念并举例说明。 不可变…

监听html元素是否被删除,删除之后重新生成被删除的元素

/*** 监听水印是否清除和修改*/ export function watermarkClear() {// 添加水印的盒子let box: any document.querySelector(.dplayer-video-wrap)// 水印let watermark: any document.querySelector(.dplayer-logo)// 观察器的配置(需要观察什么变动&#xff09…

前端基础面试题·第三篇——JavaScript(其三)

1.字符串 (1) 常用方法 1.charAt(index) 返回指定位置的字符,若没找到,则返回空2.charCodeAt(index) 返回指定位置的unicode字符编码,若没找到,则返回空 3.String.concat(str1,str2) 连接多个字符串,并返回新字符串4.String.fromCharCode(co…

Qt C++ Udp相关知识学习(一)

文章目录 udp 单播消息,是什么意思特点:使用场景:例子:udp 广播消息,是什么意思特点:使用场景:示例:参考udp 单播消息,是什么意思 UDP 单播消息(UDP unicast)是指使用用户数据报协议(UDP)通过网络发送消息的过程,消息的接收者是单个特定的目标设备或IP地址。 特…

简单示例,搞懂PowerBI的ALL(),ALLEXCEPT()和ALLSELECTED()的区别

假设我们有如下数据,我们来统计下各班级的人数 我们在报表页里加上 班级’二班‘ 的筛选条件,此时PowerBI已经自动为我们显示了各班级人数:一班有3人,二班有1人。 根据我们的筛选条件,我们的统计人数应该是按照筛选器&…

数据结构应用实例(六)——最短路径

Content: 一、题目描述二、算法思想三、代码实现四、小结 一、题目描述 实现求最短路径的两种算法:Dijsktra 算法和 Floyd 算法; 二、算法思想 Dijkstra算法 求一个点到图中其余节点的最短路径; 首先设置三个辅助数组:   (1) f…

android系统设计模式

Android官方架构组件介绍之LifeCycle,Android架构组件一共包括以下几个: LifeCycle : 与Activity和Fragment的生命周期有关LiveData :异步可订阅数据,也是生命周期感知ViewModel :视图数据持有模型,也是生…

算法-最少箭引爆气球(贪心+区间)

leetcode题目链接 这道题思路很简单,就是一个贪心,甚至都不需要合并区间。 开始需要对气球的结束坐标排序一下,然后定义一个end指向当前箭的最远位置。 然后开始遍历数组,如果出现区间起始位置比end大,则说明需要再…