代理模式--静态代理

明确AOP之前首先要对代理模式进行深刻的学习。

代理模式分为静态代理 和动态代理。 动态代理又包括JDK代理和Cglib

本文主要学习静态代理。

代理模式

从生活出发,我是一个要租房子的人,我要租房子,要找房屋中介,房源多。我不会去找房东,因为很难找到而且房东手里房源有限。对于房东来说,我只想把我的房子租出去,我不想找房客,也不想带房客看房或者是其他的一些行为。 对于我和房东来说中间需要一个中介。这个中介代表着房东将房子租给我。 中介就是房东的代理。中介和房东有共同的行为租房,交给中介去最后完成。

代理模式 包括

  • 抽象角色:角色有的一些行为,通常用抽象类和接口实现。
  • 真实角色:被代理的对象(房东)
  • 代理角色:代理真实角色,并对真实角色的行为加以补充(中介)
  • 客户:可以访问到代理的人(我,租客)

代理模式的好处:

  • 可以使真实角色的操作更加纯粹,不用去关注公共的业务
  • 公共业务交给了代理角色,实现了业务的分工
  • 公共业务发生扩展的时候,方便集中管理
  • 可以在不改动原有代码的同时增加其他的一些操作

手撸静态代理的代码

抽象角色

package com.heaboy.proxyExcise.staticExcise;

/**
 * @Author:XK
 * @Date: Created in 11:20 2022/2/19
 * @Description:静态代理的抽象行为
 **/
public interface Rent {
    public void rent();
}

真实角色

package com.heaboy.proxyExcise.staticExcise;

/**
 * @Author:XK
 * @Date: Created in 11:23 2022/2/19
 * @Description:静态代理的真实角色,也就是被代理的对象,租房模型中的房东
 **/
public class Host implements Rent {

    @Override
    public void rent() {
        System.out.println("房东出租房子");
    }
}

代理角色

package com.heaboy.proxyExcise.staticExcise;

/**
 * @Author:XK
 * @Date: Created in 11:24 2022/2/19
 * @Description:代理对象,代理真实角色,租房模型的中介所
 **/
public class StaticProxy {
    private Host host;

    public StaticProxy() {
    };

    public StaticProxy(Host host) {
        this.host = host;
    }
    //代理房东的出租房子行为,并且可以加一下附加操作
    public void rent(){
        System.out.println("我是中介,出租我代理房东的房子");
        host.rent();
    }
    //甚至可以追加一些其他的行为
    public void kanfang(){
        System.out.println("我是中介,带客人看我代理房东的房子");
    }
}

不仅实现了房东的行为,还对房东的行为增强,并且有了附加行为看房。 

客户

package com.heaboy.proxyExcise.staticExcise;

/**
 * @Author:XK
 * @Date: Created in 11:27 2022/2/19
 * @Description:客户端获取到代理对象,出租模型中代表房客
 **/
public class Client {
    public static void main(String[] args) {
        StaticProxy staticProxy = new StaticProxy(new Host());
        staticProxy.kanfang();
        staticProxy.rent();
    }
}

运行结果:

我是中介,带客人看我代理房东的房子
我是中介,出租我代理房东的房子
房东出租房子

Process finished with exit code 0

 如果不通过代理来直接找房东:

猜你喜欢

转载自blog.csdn.net/Yoke______/article/details/123016221