java代理模式
前言:
看有关于技术的文章需要带着问题去看,我上周在公司做了一场设计模式的技术分享,在会上又不同的小伙伴提出了很多疑问,那么今天我就来解决一下这一些疑问,非常感谢参与会议的小伙伴。
问题:
一、什么是设计模式?
二、为什么JDK动态代理与CGLIB动态代理生成的源代码是差不多的?
三、代理模式相比直接使用接口有什么好处吗?
四、如果接口被多个类实现会怎样?
问题1:什么是设计模式
设计模式是一种经验能够使新手更加简单的使用前人的经验和方案。
可以避免重复劳动,就像一句在这个行业流行的话不要重复造轮子。
设计模式是针对特定上下文的特定问题的解决方案,解决方案被抽象化、模版化、就是设计模式,学习设计模式的关键是理解,理解方法理解思想理解观念。
不是为了使用设计模式而,设计的根本是为了可复用、可拓展、高性能,不要为了使用设计模式而使用,一定要结合实际环境的去考虑整个问题。
每一种模式有四个基本元素:模式名称、问题描述、应用场景、应用后效果。
设计模式在应用中遵循六大原则:
- 开闭原则:对扩展开放,对修改关闭。
- 里氏代换原则:任何基类可以出现的地方,子类一定可以出现。
- 依赖倒转原则:针对接口编程,依赖于抽象而不依赖于具体。
- 接口隔离原则:使用多个隔离的接口,比使用单个接口要好。
- 迪米特法则:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
- 合成复用原则:原则是尽量使用合成/聚合的方式,而不是使用继承。
代理模式分为两种:静态代理、动态代理,这两者有什么区别呢?往下看就明白了。
什么是代理模式:为其他对象提供一种代理以控制对这个对象的访问(例:AOP、拦截器)。
代理模式的角色:被代理者与代理者实现的接口、代理类、被代理类。
一、静态代理模式:
静态代理由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class就已经存在了。
UML图:
图中含有接口(person)、代理类(proxy)、被代理类(target),带代理者与代理者都实现了person的接口,client在调用时是直接访问的被代理类(proxy),代理类在buy方法中引用了targer类中的buy方法,可以在代理前、代理后做一些其他的业务逻辑处理,控制targer的访问。
下面直接上代码,一步步引出静态代理的优点与缺点:
接口:
package proxyblogs; /** * 人的行为接口. */ public interface person { /** * 买东西. * * @param name 商品名称. * @return int * @author null */ int buy(String name);
Target类(被代理者):
package proxyblogs; /** * @ClassName Target. * Create by Null on 2019/2/26/19:29 **/ public class Target implements person { /** * 买东西. * * @param name 商品名称. * @return int 价格 * @author null */ @Override public int buy(String name) { if (name.equals("apple")) { return 5; } else { return 3; } } }
package proxyblogs; /** * @ClassName proxy. * Create by Null on 2019/2/26/19:30 **/ public class proxy implements person { /** * 买东西. * * @param name 商品名称. * @return int * @author null */ @Override public int buy(String name) { int buy = new Target().buy(name); //运费 int freight = 2; return buy + freight; } }
test测试类
package proxyblogs; /** * @ClassName Test. * Create by Null on 2019/2/26/19:39 **/ public class Test { public static void main(String[] args) { int money = new proxy().buy("apple"); System.out.println(money); } }
执行结果:
7 Process finished with exit code 0
优点:
一、相对于动态代理来说,程序比较简易、性能比动态代理要高。
缺点:
一、静态代理类和被代理类实现了相同的接口,代理类通过被代理类实现了相同的方法。这样就出现了大量的代码重复,增加了代码维护的复杂度。二、静态代理只服务于一种类型的对象, 如果要服务 多类型的对象。势必要为每一种对象都进行代理,静态代理在程序规模 稍大时就无法胜任了。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
java 序列化transient 关键字使用
先解释下什么是序列化 我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术。 Java序列化技术正是将对象转变成一串由二进制字节组成的数组,可以通过将二进制数据保存到磁盘或者传输网络,磁盘或者网络接收者可以在对象的属类的模板上来反序列化类的对象,达到对象持久化的目的。 什么是 transient? 简单来说就是,被 transient 修饰的变量不能被序列化。 具体来看下面的示例1 importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.Serializable;publicclassTransientTest{ publicstaticvoidmain(String[]args)throwsException{ Useruser=newUser(); user.setUsername("hhy"); user.se...
- 下一篇
java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)
java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一) 目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性、可见性、有序性 对于synchronized关键字,对于静态方法默认是以该类的class对象作为锁,对于实例方法默认是当前对象this,对于同步代码块,需要指定锁对象 对于整个同步方法或者代码块,不再需要显式的进行加锁,默认这一整个范围都是在锁范围内 可以理解为,隐含的在代码开始和结尾处,进行了隐式的加锁和解锁 所以synchronized又被称为隐式锁 对于synchronized关键字的隐式锁,不需要显式的加锁和释放,即使出现了问题,仍旧能够对锁进行释放 synchronized是一种阻塞式的,在前面也提到过,对于synchronized修饰的同步,如果无法进入监视器则是BLOCKED状态,无疑,性能方面可想而知 而且,这种隐式锁,在同一个代码片段内只有一个监视器,灵活性不够 为了优化synchronized的一些不便,Java又提出来了显式锁的概念Lock 顾名思义,显式,是相对隐式来说的,也就是对于加锁和解锁,需要明确的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Linux系统CentOS6、CentOS7手动修改IP地址
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS关闭SELinux安全模块
- CentOS8安装Docker,最新的服务器搭配容器使用
- 设置Eclipse缩进为4个空格,增强代码规范