代理模式之静态代理

       动态代理比静态代理使用更多,也比静态代理使用更加简单,可是为何还要学习静态代理呢? 本人认为静态代理需要自己去实现,在学习的过程中可以让我们更好的理解代理模式。 本文将结合代理模式的延迟加载和安全性能来实现静态代理。

       延迟加载

       在上一文中我们可以了解到代理模式可以实现延迟加载来缩短系统的开启时间,文本中不会在提延迟加载的作用了,主要精力放在代码实现上。

 

    主题接口: 真实主题和代理类都需要一个接口来定义对外的公共方法,这个接口就是主题接口,也有人将之称为抽象角色。

  

/**
 * 主题接口
 */
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();
    }

结果:

代理售卖
房主:售卖的相关事
中介见租房人
房主:碰面
中介收取费用
房主:房屋出租价格范围

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值