三大设计模式

1. 装饰者设计模式

<1>解决的问题:在不改变原有类方法源代码的情况下给方法进行增强,在实现的方法中调用原有对象的对应方法,也可对原有方法进行增强。

<2>要求:要实现接口的所有方法。

<3>弊端:要重写的方法太多了,写起来麻烦。

<4>代码演示:
需求:增强close方法

Inter接口:

//装饰设计模式
//在不改变现有对象原有结构的情况下,
//动态地给该对象增加一些职责(即增加其额外功能)
public interface Inter {public abstract void init();public abstract void close();
}

InterImpl1实现类:

public class InterImpl1 implements Inter{@Overridepublic void init() {System.out.println("初始化连接...");}@Overridepublic void close() {System.out.println("关闭连接...");}
}

重定义的InterImpl2实现类:

//1.定义一个类,实现和被装饰类相同的接口
public class InterImpl2 implements Inter {//2.定义一个原有对象的成员变量private Inter inter;//3.通过有参构造方法为其赋值}public InterImpl2(Inter inter) {this.inter = inter;}//4.重写方法:不想改进的方法继续调用原有对象的功能。想改进的方法自己重写@Overridepublic void init() {inter.init();}@Overridepublic void close() {System.out.println("归还连接");}
}

InterTest测试类:

//需求,再不改变现有对象原有结构的情况下;
// 将关闭连接改成归还连接
public class InterTest {public static void main(String[] args) {InterImpl1 i1 = new InterImpl1();i1.init();i1.close();System.out.println("-----------------");InterImpl2 i2 = new InterImpl2(i1);i2.init();i2.close();}
}打印结果:
---------------------------------------------------------------------------------------------------------------------
初始化连接...
关闭连接...
-----------------
初始化连接...
归还连接

2. 适配器模式

<1>解决的问题:解决重写的方法太多的问题,如果没有这样的模版类(适配器类)就需要自己写。

<2>要求:需要提前定义一个类(适配器类/模版类)实现接口,重写所有方法,在重写的方法中调用原有对象的对应方法,不做增强。然后我们的类只需要继承该适配器类,重写需要增强的方法即可.

<3>弊端:如果没有这样的模版类(适配器类)就需要自己写

<4>代码演示:
需求:增强method1方法

Inter接口:

//归还连接-适配器设计模式
//解决接口和实现类之间的矛盾问题。
public interface Inter {public  abstract void method1();public  abstract void method2();public  abstract void method3();public  abstract void method4();public  abstract void method5();
}

MyAdapter适配器类【为了避免其他类来创建适配器类的对象,该适配器类需要定义为抽象类!】:

//1.定义一个适配器类,实现对应的接口。
//2重写所有的抽象方法。
//3.为了避免其他类来创建适配器类的对象,该适配器类需要定义为抽象类!
public abstract class MyAdapter implements Inter {/*@Overridepublic void method1() {}*/@Overridepublic void method2() {}@Overridepublic void method3() {}@Overridepublic void method4() {}@Overridepublic void method5() {}
}

InterImpl实现类:

//4.让功能类继承适配器类,重写自己需要的方法。
public class InterImpl extends MyAdapter{@Overridepublic void method1() {System.out.println("只用method01方法...");}
}

Test测试类:

public class Test {public static void main(String[] args) {InterImpl ii = new InterImpl();ii.method1();}
}打印结果:
---------------------------------------------------------------------------------------------------------------------
只用method01方法...

3. 动态代理

<1>解决的问题:在不改变原始对象方法源代码的情况下对原始方法进行增强,可以彻底解决装饰模式以及适配器模式要重写的方法过多问题。

<2>要求:代理对象和目标/真实对象要实现相同的接口,实现了相同的接口就意味着有相同的功能

<3>三个角色:目标/原始/真实对象、接口、代理对象(在内存中动态生成的对象)

<4>具体做法:使用Proxy.newProxyInstance(…)方法动态生成并返回一个代理对象
在这里插入图片描述
<5>代码演示:
需求:增强study方法

StudentInterface接口:

public interface StudentInterface {void eat(String name);void study();
}

Student实现类:

public class Student implements StudentInterface{@Overridepublic void eat(String name){System.out.println("学生吃" +name);}@Overridepublic void study(){System.out.println("学生在教室学习");}
}

StudentTest测试类:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class StudentTest {public static void main(String[] args) {Student stu = new Student();stu.eat("米饭");stu.study();/*要求;在不改动Student类中任何的代码的前提下,通过study方法输出一句话:学生在家自己学习*///动态代理∶在不改变目标对象方法的情况下对方法进行增强组成//组成:// 被代理对象︰真实的对象// 代理对象︰内存中的一个对象要求//要求://代理对象必须和被代理对象实现相同的接口//实现[Proxy类]System.out.println("-------------------------------------------");//Proxy.newProxyInstance()//参数1-类加载器:和被代理对象使用相同的类加裁器//参数2-接口类型的Class数组:和被代理对象使用相同接口//参数3-代理规则:完成代理培强的功能[匿名内部类]//因为传递了一个接口类型的Class数组则可以强转StudentInterface proxyStu = (StudentInterface)Proxy.newProxyInstance(stu.getClass().getClassLoader(), new Class[]{StudentInterface.class}, new InvocationHandler() {/**  执行Student类中所有的方法都会经过invoke方法* */@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//对method方法进行判断,如果是study,则增强//如果不是,还是调用学生对象原有的功能即可if (method.getName().equals("study")) {System.out.println("学生在家自己学习");return null;} else {return method.invoke(stu, args);}}});proxyStu.eat("米饭");proxyStu.study();}
}打印结果:
---------------------------------------------------------------------------------------------------------------------
学生吃米饭
学生在教室学习
-------------------------------------------
学生吃米饭
学生在家自己学习

注:
<1>System.out.println(proxy); 不要打印,因为打印proxy相当于调用了proxy.toString(),形成了死递归【Exception in thread “main” java.lang.StackOverflowError】
<2>使用代理对象时,调用的其他方法【非增强方法】都是原对象中的方法
<3>Proxy.newProxyInstance( , ,)中的三个参数
stu.getClass().getClassLoader():借用stu获取对应的学生对象,再得到学生对象的类加载器
new Class[]{StudentInterface.class}:先new Class[ ]得到通过.class得到接口类[多态]的对象【该对象类型为StudentInterface】
new InvocationHandler():InvocationHandler是一个接口,通过匿名内部类来定义代理规则

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

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

相关文章

硬盘与存储设备

转自鸟哥&#xff1a; http://cn.linux.vbird.org/linux_basic/0105computers_2.php#pc_hd 【1】基本概念 实际的数据都是写在具有磁性物质的磁碟盘上头&#xff0c;而读写主要是透过在机械手臂上的读取头(head)来达成。 实际运作时&#xff0c; 主轴马达让磁碟盘转动&#x…

17张图揭密支付宝系统架构

转载自 17张图揭密支付宝系统架构 支付宝的系统架构图&#xff0c;仅供参考。不管是不是支付行业&#xff0c;都值得我们参考&#xff0c;学习。

Linux系统分区和挂载浅谈

转自&#xff1a; https://blog.csdn.net/cc_net/article/details/2894510好久没有写BLOG了,之前出差了2个月,都没怎么看书,也没有太多时间写。回来后一个月人也有点放松。现在开始还是得继续努力啊。不废话了&#xff0c;下面就介绍下Linux系统的分区和挂载 一 Linux的安装 L…

jmap, jhat, jvisualvm:java堆内存对象分析利器

转载自 jmap, jhat, jvisualvm&#xff1a;java堆内存对象分析利器jmap -help查看命令用法。jmap -heap <pid> 查看堆使用情况。jmap -dump导出堆对象文件进行内存分析。jhat -J-Xmx512m -port 8888 1136.txt命令生成分析报告&#xff0c;可通过http访问。访问http://loc…

ajax异步请求

1 什么是异步请求&#xff1f; 在页面不重新加载的情况下&#xff0c;发送请求局部更新页面内容。2 jquery实现异步请求&#xff1f; $.ajax({url:"访问路径",data:"请求参数", //请求参数格式:"namevalue&namevalue&..." 或者 {name:…

Buffers与cached啥区别

转自&#xff1a; https://www.cnblogs.com/argb/p/3448744.html A buffer is something that has yet to be “written” to disk.A cache is something that has been “read” from the disk and stored for later use对于应用程序来说&#xff0c;buffers/cached 是等于可用…

Spring面试题(第一期)

转载自 Spring面试题&#xff08;第一期&#xff09;Spring作为现在最流行的java web开发框架&#xff0c;Spring的应用及其原理的深入了解是每个Java开发程序员必经之路&#xff0c;下面10道面试题是Java开发程序员面试时会经常遇到的题目。 1、为什么要使用Spring框架&#x…

vue的基本语法

vue的基本语法 new Vue({el:"css选择器",//表示vue对象接管的区域&#xff0c;只有在这一块区域内才可以使用vue的方法显示数据。data:{// 定义各种变量&#xff0c;将来变量的值在页面html标签中使用。name:"snake",age:20,user:{username:"jack&quo…

linux-basic(6)linux的文件权限与目录配置

【6.1】用户与用户组 1&#xff09;linux用户身份与用户组记录的文件/etc/passwd 默认情况下所有系统上的账号都记录在该文件&#xff1b;/etc/shadow 用户密码记录在该文件下&#xff1b;/etc/group linux的所有组名记录在该文件下&#xff1b;注意&#xff1a;这3个文件是 li…

阿里巴巴对Java编程【异常处理】的规约

转载自 阿里巴巴对Java编程【异常处理】的规约 异常处理 1. 【强制】 Java 类库中定义的一类 RuntimeException 可以通过预先检查进行规避&#xff0c;而不应该通过 catch 来处理&#xff0c;比如&#xff1a; IndexOutOfBoundsException &#xff0c; NullPointerException 等…

Http协议的请求和响应

1.HTTP协议介绍 HTTP(HyperTextTransferProtocol)&#xff1a;超文本传输协议。HTTP协议是基于TCP/IP协议的。基于请求/响应模型的: 一次请求对应一次响应。传输协议&#xff1a;客户端和服务器端的通信规则(握手规则)。 2.HTTP协议的请求 HTTP协议规定了客户端发给服务器的数…

centos上安装jdk

1&#xff09;下载jdk&#xff1a; http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2&#xff09;放置到/usr/local/software/java 目录下&#xff0c;并解压 tar-xzv -f jdk*.gz 3&#xff09;配置环境变量 vim /etc/profile 追…

阿里巴巴对Java编程【单元测试】的规约

转载自 阿里巴巴对Java编程【单元测试】的规约 单元测试 1. 【强制】好的单元测试必须遵守 AIR 原则。 说明&#xff1a;单元测试在线上运行时&#xff0c;感觉像空气 &#xff08;AIR&#xff09; 一样并不存在&#xff0c;但在测试质量的保障上&#xff0c;却是非常关键的。好…

linux-basic(7)linux文件与目录管理

【7.1】目录与路径 【7.1.2】目录相关操作1&#xff09;特殊目录列表&#xff1a;(1)2&#xff09;目录操作命令&#xff0c;底下我们就来谈一谈几个常见的处理目录的命令吧&#xff1a;cd&#xff1a;变换目录pwd&#xff1a;显示目前的目录mkdir&#xff1a;创建一个新的目录…

Get和Post请求和对应的参数获取

1.get和post的请求方式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>vue的异步请求</title><script src"js/vue.js"></script><!--vue单独抽取的插件--><sc…

阿里巴巴对Java编程【安全规约】的规约

转载自 阿里巴巴对Java编程【安全规约】的规约 安全规约 1. 【强制】隶属于用户个人的页面或者功能必须进行权限控制校验。 说明&#xff1a;防止没有做水平权限校验就可随意访问、修改、删除别人的数据&#xff0c;比如查看他人的私信内容、修改他人的订单。 2. 【强制】用户敏…

JSON转换工具---jackson

1.json传递中和javaBean对象的关系 打印出来的字符串&#xff0c;对象和键值集合用{}, 数组和用[] 2.json的转换 总测试类:以下转换都为单元测试方法 public class ObjectMapperTest {private ObjectMapper mapper new ObjectMapper(); }<1>json和对象的转换 /*1.Use…

df、du和fdisk命令的区别

【1】df 列出文件系统的整体磁盘使用量由于 df 主要读取的数据几乎都是针对一整个文件系统&#xff0c;因此读取的范围主要是在 Superblock 内的信息&#xff0c; 所以这个命令显示结果的速度非常的快速&#xff01;&#xff08;1&#xff09;&#xff08;2&#xff09;补充&am…

阿里巴巴对Java编程【Mysql】的规约

转载自 阿里巴巴对Java编程【Mysql】的规约 建表规约 1. 【强制】表达是与否概念的字段&#xff0c;必须使用 is _ xxx 的方式命名&#xff0c;数据类型是 unsigned tinyint&#xff08; 1 表示是&#xff0c;0 表示否 &#xff09; 。 说明&#xff1a;任何字段如果为非负数&a…

applicationContext配置mybatis

1.引入外部的properties属性文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:context"http://w…