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
优点:
一、相对于动态代理来说,程序比较简易、性能比动态代理要高。
缺点:
一、静态代理类和被代理类实现了相同的接口,代理类通过被代理类实现了相同的方法。这样就出现了大量的代码重复,增加了代码维护的复杂度。二、静态代理只服务于一种类型的对象,如果要服务多类型的对象。势必要为每一种对象都进行代理,静态代理在程序规模稍大时就无法胜任了。