静态代理
介绍:
给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。代理对象:起到中介作用,连接客户端和目标对象。
通过引入代理对象的方式间接访问目标对象,从而防止直接访问目标对象给系统带来的复杂性。
角色
- 抽象对象(Subject):声明了真实对象和代理对象的公共接口。
- 真实对象(RealSubject):代理对象所代表的真实对象,最终引用的对象。
- 代理对象(Proxy):包含对真实对象的引用从而操作真实主题对象,想到于对真实对象进行了封装。
特点
优点
协调调用者和被调用者,降低了系统的耦合度。
代理对象作为客户端和目标对象之间的中介,起到了保护目标对象的作用。
缺点
由于在客户端和真实主题之间增加了代理对象,因此会造成请求的处理速度变慢。实现代理模式需要额外的工作(有些代理模式的实现非常复杂),从而增加了系统实现的复杂度。
实例
public class ProxyTest {
public static void main(String[] args) {
//客户端调用
Subject subject=new Proxy();
subject.buyMac();
}
}
/**
* 因为小明想要买一台最新版的MAC电脑,但是国内买不了
* 只能到美国买才有。
* 现在需要你运用代码模式来实现:
* 解决:
* 代购(代理对象)代替我(真实对象)去购买(公共接口)电脑
*
*/
/**
* 抽象对象
* 声明了真实对象和代理对象的公共接口
*/
interface Subject{
void buyMac();
}
/**
* 真实的对象
*
*/
class RealSubject implements Subject{
@Override
public void buyMac() {
System.out.println("买一台Mac");
}
}
class Proxy implements Subject{
@Override
public void buyMac() {
//这里引用并创建对象实例
RealSubject realSubject=new RealSubject();
realSubject.buyMac();
wrapMac();
}
/**
*代理类的额外操作
*/
public void wrapMac() {
System.out.println("用盒子包装好Mac");
}
}
动态代理
介绍:
因为静态代理只能服务1种类型的目标对象,若服务多种类型的目标对象,则需要为每种目标对象都实现一个静态代理对象。在目标对象较多的情况下,若采用静态代理,则会出现静态代理对象的数量越来越多,代码量大,这是可以采用动态代理的模式解决问题。
动态代理其实是一种方便运行时候动态的处理代理方法的调用机制。
模式原理
设计动态代理类时,不需要显示实现与目标对象类相同的接口,而是将这种实现退出到程序运行时由JVM来实现。通过反射机制的method.invoke(),通过调用动态代理类对象方法,从而自动调用目标对象的方法。
特点
- 优点
只需要1个动态代理类就可以解决创建对个静态代理的问题,避免重复,多余代码,具有更强的灵活性。
- 缺点
效率低:相对于静态代理中,直接调用目标对象方法,动态代理则需要先通过Java反射机制,从而间接调用目标对象的方法。
具体的内容参考https://blog.csdn.net/qq_29966203/article/details/93377748
网友评论