静态代理
引言
在学习多线程的过程中,有必要学习下静态代理模式,因为在创建线程的几种方式,其中之的方式就是实现Runnable接口,这其实就是使用到了我们的静态代理模式。当然在现实生活中,也存在很多代理的场景,例如房产中介,婚礼策划等,都扮演者代理者的角色
实现
静态代理的实现一般可分为如下几个环节:
- 存在或定义一个主题接口Subject(包含一个业务方法:例如卖房子)
- 创建代理类(主角的狗腿子),实现主体接口Subject
- 创建真实对象(主角),继承主题接口Subject,实现业务方法
- 代理类持有真实主体对象类的引用(核心)
- 从代理类实现主题接口Subject的方法,并委托给引用的真实主题对象处理
代码实例:
1.定义主题接口
/*
======真实对象和代理对象需要实现的接口======
*/
interface Subject{
void sellHourse();
}
2.定义真实对象(主角)
/*
真实角色(主角)
*/
class Mr implements Subject{
@Override
public void sellHourse() {
//真实对象(我)的sellHourse方法
System.out.println("我是真实卖家,很高兴通过中介卖掉了房子");
}
}
3.定义代理类(主角的小弟)
/*
小弟要帮助主角完成目标
*/
class Mp implements Subject{
//真实对象(我)
private Subject realSale;
//构造方法
public Mp(Subject realSale) {
this.realSale = realSale;
}
@Override
public void sellHourse() {
defore();
//调用真实对象(我)的sellHourse方法
this.realSale.sellHourse();
after();
}
private void defore() {
System.out.println("我是中介,很高兴能够帮卖家卖房子......");
}
private void after() {
System.out.println("我是中介,很高兴能帮卖家把房子卖出去,并收到提成");
}
}
4.测试主类
public class Main {
public static void main(String[] args) {
/*
使用Lamda表达式:
实例化代理(中介),将真实对象传入(我),然后再调用真实对象的sellHourse方法
Mr mr = new Mr();
Mp mp = new Mp(mr);
mp.sellHourse();
上面代码等于:new MP(new Mr()).sellHourse();
*/
Mp mp = new Mp(new Mr());
mp.sellHourse();
System.out.println("======上下两种方法都可打印======");
Subject mr = new Mr();
new Mp(mr).sellHourse();
}
}
- 运行看结果:
我是中介,很高兴能够帮卖家卖房子......
我是真实卖家,很高兴通过中介卖掉了房子
我是中介,很高兴能帮卖家把房子卖出去,并收到提成
======上下两种方法都可打印======
我是中介,很高兴能够帮卖家卖房子......
我是真实卖家,很高兴通过中介卖掉了房子
我是中介,很高兴能帮卖家把房子卖出去,并收到提成
小结
静态代理模式总结:
- 真实对象和代理对象都要实现同一个接口
- 代理对象要代理真实角色
静态代理的好处:
- 代理对象可以做很多真实对象做不了的事情
- 真实对象只需要专注做自己的事情
176

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



