静态代理
静态代理不是技术是一种思想,具体大意如下:
委托方(需要代理的一方)有业务提供,而为了解耦委托方不直接向客户提供业务,而是将业务交给代理方去代理提供,这时客户可直接向代理方请求业务请求,再由代理方去请求委托方处理业务,以此达到处理业务的目的。
优点:
委托方:只负责单纯的具体业务,不再关注公共业务,公共业务则交给代理方去处理,以此降低耦合性。
代理方:只依赖于委托方,将具体业务交给委托方,自己则处理公共业务,所谓公共业务就是即使不同的具体业务也会有公共的业务,虽然他们的具体业务不同,但是公共业务确实相同的,所以代理方只负责处理公共业务,而具体业务则交给委托方去处理即可。
下面用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("代理方(公共业务):与客户签合同"); 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(); } }
打印结果:
客户(客户请求业务):我要租房子
代理方(公共业务):带客户看房子
委托方(具体业务):出租一号大院
代理方(公共业务):与客户签合同
代理方(公共业务):交易完成