静态代理

静态代理不是技术是一种思想,具体大意如下:

  委托方(需要代理的一方)有业务提供,而为了解耦委托方不直接向客户提供业务,而是将业务交给代理方去代理提供,这时客户可直接向代理方请求业务请求,再由代理方去请求委托方处理业务,以此达到处理业务的目的。

优点:

  委托方:只负责单纯的具体业务,不再关注公共业务,公共业务则交给代理方去处理,以此降低耦合性。

  代理方:只依赖于委托方,将具体业务交给委托方,自己则处理公共业务,所谓公共业务就是即使不同的具体业务也会有公共的业务,虽然他们的具体业务不同,但是公共业务确实相同的,所以代理方只负责处理公共业务,而具体业务则交给委托方去处理即可。

下面用java代码模拟一段租房的业务来描述静态代理:

1.委托方和代理方都要实现的一个接口(也可以是抽象类),该接口描述他们都可以做的事情:

package mr.li.inface;

public interface Host {

    /** 房屋出租  */
    void houseRental();
}

2.代理类:

package mr.li.proxy;

import mr.li.host.Landlord;
import mr.li.inface.Host;

/**
 * 代理类:中介公司
 * @author yanLong.Li
 * @date 2019年3月14日 下午3:35:11
 */
public class IntermediaryCompany implements Host{

    private Landlord landlord;
    
    @Override
    public void houseRental() {
        System.out.println("代理方(公共业务):让客户挑选");
        landlord.houseRental();
        System.out.println("代理方(公共业务):交易完成");
    }
    
    public IntermediaryCompany(Landlord landlord) {
        this.landlord = landlord;
    }
}

3.委托类:

package mr.li.host;

import mr.li.inface.Host;
/**
 * 委托类:房东
 * @author yanLong.Li
 * @date 2019年3月14日 下午5:05:14
 */
public class Landlord implements Host{

    @Override
    public void houseRental() {
        System.out.println("委托方(具体业务):出租一号大院,出租二号大院");
    }

    
}

4.获得代理类的工厂类:

package mr.li.factory;

import mr.li.host.Landlord;
import mr.li.inface.Host;
import mr.li.proxy.IntermediaryCompany;

/**
 * 静态工厂类
 * @author yanLong.Li
 * @date 2019年3月14日 下午5:03:36
 */
public class IntermediaryFactory {

    public static Host getInstance() {
        return new IntermediaryCompany(new Landlord());
    }
}

5,客户端:

package mr.li.test;

import mr.li.factory.IntermediaryFactory;
import mr.li.inface.Host;
/**
 * 客户
 * @author yanLong.Li
 * @date 2019年3月14日 下午5:09:03
 */
public class Client {
    
    public static void main(String[] args) {
        System.out.println("客户(客户请求业务):我要租房子");
        Host host = IntermediaryFactory.getInstance();
        host.houseRental();
    }
}

打印结果:

客户(客户请求业务):我要租房子
代理方(公共业务):让客户挑选
委托方(具体业务):出租一号大院,出租二号大院
代理方(公共业务):交易完成

静态代理的缺点:

  因为静态代理的委托方和代理方都是提前写好的,所以严格意义(原子性)上来讲,我们已经将他定义为具体的业务类型了,如果需要代理其他类型的,就要重新写一套:委托类,代理类,....等。这样就会有很多的代理类出现。

  例如:

    场景一:租房代理,房东(委托类)找中介(代理类)代理出租房屋,我(客户)找中介租房。

    场景二:买零食:食品工厂(委托类)找购物商场(代理类)代理出售零食,我(客户)找商场购买零食。

    ......

  *以上两个场景中中介购物商场扮演的都是代理的角色,两个委托方和客户都有不同的具体实现,所以静态代理也会不相同,这样就会造成租房是一套体系,购物是一套体系,代理类会随着客户和委托方的增加而增加。

  解决方案:虽让以上两套(代码只提供了租房场景,购物场景纯文字描述,原谅我不想写那么多)静态代理方案,但他们的代理公共业务确是相同的(不要扣细节,意思能理解就好),都是 挑选商品,再交易。这种业务就可以使用动态代理下篇我们探讨动态代理。

原文地址:https://www.cnblogs.com/li-yan-long/p/10540794.html