静态代理不是技术是一种思想,具体大意如下:
委托方(需要代理的一方)有业务提供,而为了解耦委托方不直接向客户提供业务,而是将业务交给代理方去代理提供,这时客户可直接向代理方请求业务请求,再由代理方去请求委托方处理业务,以此达到处理业务的目的。
优点:
委托方:只负责单纯的具体业务,不再关注公共业务,公共业务则交给代理方去处理,以此降低耦合性。
代理方:只依赖于委托方,将具体业务交给委托方,自己则处理公共业务,所谓公共业务就是即使不同的具体业务也会有公共的业务,虽然他们的具体业务不同,但是公共业务确实相同的,所以代理方只负责处理公共业务,而具体业务则交给委托方去处理即可。
下面用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(); } }
打印结果:
客户(客户请求业务):我要租房子
代理方(公共业务):让客户挑选
委托方(具体业务):出租一号大院,出租二号大院
代理方(公共业务):交易完成
静态代理的缺点:
因为静态代理的委托方和代理方都是提前写好的,所以严格意义(原子性)上来讲,我们已经将他定义为具体的业务类型了,如果需要代理其他类型的,就要重新写一套:委托类,代理类,....等。这样就会有很多的代理类出现。
例如:
场景一:租房代理,房东(委托类)找中介(代理类)代理出租房屋,我(客户)找中介租房。
场景二:买零食:食品工厂(委托类)找购物商场(代理类)代理出售零食,我(客户)找商场购买零食。
......
*以上两个场景中中介和购物商场扮演的都是代理的角色,两个委托方和客户都有不同的具体实现,所以静态代理也会不相同,这样就会造成租房是一套体系,购物是一套体系,代理类会随着客户和委托方的增加而增加。
解决方案:虽让以上两套(代码只提供了租房场景,购物场景纯文字描述,原谅我不想写那么多)静态代理方案,但他们的代理公共业务确是相同的(不要扣细节,意思能理解就好),都是 挑选商品,再交易。这种业务就可以使用动态代理下篇我们探讨动态代理。