动态代理比静态代理使用更多,也比静态代理使用更加简单,可是为何还要学习静态代理呢? 本人认为静态代理需要自己去实现,在学习的过程中可以让我们更好的理解代理模式。 本文将结合代理模式的延迟加载和安全性能来实现静态代理。
延迟加载
在上一文中我们可以了解到代理模式可以实现延迟加载来缩短系统的开启时间,文本中不会在提延迟加载的作用了,主要精力放在代码实现上。
主题接口: 真实主题和代理类都需要一个接口来定义对外的公共方法,这个接口就是主题接口,也有人将之称为抽象角色。
/**
* 主题接口
*/
public interface IDBQuery {
String request();
}
真实主题: 真实主题是真正实现业务的逻辑类,它需要实现主题接口的方法。它是重量级对象,构造会很慢。
/**
* 真实主题
*/
public class DBQuery implements IDBQuery {
public DBQuery() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("真实被创建");
}
@Override
public String request() {
return "我是真实的";
}
}
代理类:是真实主题的代理和封装,同样也需要实现主题接口的方法。它是轻量级对象,创建快,用来代理真实主题的位置
/**
* 代理角色
*/
public class DBQueryProxy implements IDBQuery {
private DBQuery real = null;
public DBQueryProxy() {
System.out.println("代理被创建");
}
@Override
public String request() {
if(real == null) {
real = new DBQuery();
}
return real.request();
}
}
客户端
@Test
public void staticPoxyTest() {
IDBQuery query = new DBQueryProxy();
System.out.println("调用真实主题开始");
System.out.println(query.request());
}
结果:
代理被创建
调用真实主题开始
真实被创建
我是真实的
从结果可以看出,真实主题只用在被调用的时候才会被创建。
中间层隔离(安全作用)
在上一章也说过代理模式可以起到保护真正主题的作用。 本次实例就根据房屋中介简单的写一下。
主题接口: 真实主题和代理类都需要一个接口来定义对外的公共方法,这个接口就是主题接口,也有人将之称为抽象角色。
public interface IInterface {
/**
* 出售房
*/
void sell();
/**
* 和租客碰面
*/
void contact();
/**
* 收费
*/
void charge();
}
真实主题: 是真正实现业务的逻辑类。如果比较重要,涉及安全问题,就可以使用代理模式代理
public class HouseOwner implements IInterface {
@Override
public void sell() {
System.out.println("房主:售卖的相关事");
}
@Override
public void contact() {
System.out.println("房主:碰面");
}
@Override
public void charge() {
System.out.println("房主:房屋出租价格范围");
}
}
代理类: 用来代理和封装真实主题,可以看作是中间层,对真实主题起到一定的保护作用
public class Intermediary implements IInterface {
private HouseOwner houseOwner;
public Intermediary(HouseOwner houseOwner) {
this.houseOwner = houseOwner;
}
@Override
public void sell() {
System.out.println("被代理售卖");
houseOwner.sell();
}
@Override
public void contact() {
System.out.println("中介见租房人");
houseOwner.contact();
}
@Override
public void charge() {
System.out.println("中介收取费用");
houseOwner.charge();
}
}
客户端测试:
@Test
public void staticProxyTest2() {
HouseOwner houseOwner = new HouseOwner();
Intermediary intermediary = new Intermediary(houseOwner);
intermediary.sell();
intermediary.contact();
intermediary.charge();
}
结果:
代理售卖
房主:售卖的相关事
中介见租房人
房主:碰面
中介收取费用
房主:房屋出租价格范围