1.引言
在学习多线程的过程中,有必要学习下静态代理模式,为啥呢?在《多线程01--线程》中,我们提到创建线程的几种方式,其中之一就是实现Runnable接口,这时其实就使用到了我们的静态代理模式。当然现实生活中,也有很多存在代理的场景例如房产中介、海淘代购等等,都扮演着代理者的角色。
2.结构
静态代理通常包含以下几个组成部分:
-
目标接口(Subject Interface): 定义了目标对象和代理对象共有的接口,代理类和目标类都实现这个接口。
-
目标类(Real Subject): 实现了目标接口的具体类,提供了实际的业务逻辑。
-
代理类(Proxy): 也实现了目标接口,并在内部持有目标对象的引用。代理类在调用目标对象的方法前后可以添加额外的操作,如日志记录、权限检查等。
3.实现
静态代理的实现一般可分为如下几个环节:
- 存在或定义一个主题接口Subject(包含一个业务方法:如卖房子);
- 创建代理类,实现主题接口Subject;
- 创建真实对象,继承主题接口Subject,实现业务方法;
- 代理类持有真实主题对象类的引用(核心);
- 从代理类实现主题接口Subject的方法,并委托给引用的真实主题对象类处理。
OK,开始coding.....
- 定义主题接口Subject
package proxy;
/**
* 主题接口
*/
public interface MSubject {
void sellHourse();
}
- 定义代理类
package proxy;
public class MProxySale implements MSubject {
private MSubject realSale;
public MProxySale(MSubject realSale){
this.realSale = realSale;
}
@Override
public void sellHourse() {
System.out.println("我是中介,开始替卖家卖房子。。。");
realSale.sellHourse();
System.out.println("我是中介,收到卖方提成,我很开心");
}
}
- 定义真实主题实体对象
package proxy;
/**
* 真实卖家
*/
public class MRealSale implements MSubject{
@Override
public void sellHourse() {
System.out.println("我是真实卖家,很开心通过中介卖掉了房子");
}
}
- 测试主类
package proxy;
public class Main {
public static void main(String[] args) {
MSubject mRealSale = new MRealSale();
new MProxySale(mRealSale).sellHourse();
}
}
- 运行看看结果:
我是中介,开始替卖家卖房子。。。
我是真实卖家,很开心通过中介卖掉了房子
房子卖掉了,收到提成我很开心
Process finished with exit code 0
总结下,上个图:

4.存在的问题
静态代理存在如下优点:
- 简单易懂:静态代理的实现相对简单,逻辑清晰。
- 控制访问:可以在代理类中添加额外的逻辑,如日志记录、权限检查等,控制对目标对象的访问。
- 不改变目标类:通过代理类增强目标对象的功能,而不需要修改目标对象的代码。
但静态代理模式还存在如下缺点:
-
代码冗余:静态代理模式要求为每一个目标对象创建一个代理类,如果目标对象较多或者目标对象的方法较多,会导致代理类的代码量非常大,增加了代码的冗余度。
-
不易维护:由于代理类和目标对象必须具有相同的接口,一旦目标对象的接口发生变化,代理类也需要相应地进行修改,这增加了代码的耦合度,使得代码的灵活性和可维护性降低。
-
性能损耗:在客户端和目标对象之间增加了一个代理对象,可能会导致请求处理速度变慢,从而造成性能损耗。
-
增加系统复杂度:引入代理对象会使系统变得更复杂,增加了额外的类和对象关系,这可能会使得系统更难理解和维护。
-
违反开闭原则:如果需要对多个类进行代理,就需要为每个类创建代理类,违反了开闭原则(对扩展开放,对修改关闭),因为每增加一个新的类或接口,都需要修改现有的代理类代码。
为了解决这些问题,可以考虑使用动态代理,它能够在运行时动态地创建代理对象,避免了静态代理的这些缺点,提供了更大的灵活性和可维护性。
5.使用场景
- 需要控制访问:在需要对目标对象进行访问控制的场景中,静态代理非常有用。
- 增强功能:当需要在不修改目标对象的情况下为其添加额外功能(如日志、权限、事务管理等)时,可以使用静态代理。
- 业务逻辑清晰:在业务逻辑相对简单且不需要频繁变化的情况下,静态代理可以提供清晰的代码结构。
6.总结
静态代理是一种简单而有效的设计模式,适用于需要控制对目标对象访问的场景。尽管它有一些缺点,如代码冗余和维护复杂性,但在某些情况下,它仍然是一个有用的工具。对于更复杂的场景,可以考虑使用动态代理,以提高灵活性和可维护性。
本文介绍了静态代理模式在多线程编程中的应用,通过一个具体的卖房案例解释了静态代理模式的实现过程。包括定义主题接口、创建代理类及真实主题实体对象等关键步骤。
481

被折叠的 条评论
为什么被折叠?



