代理模式是日常开发中比较常用的一种设计模式且很多框架也在使用代理模式(如动态代理),二话不说,以海运业务为例(简单业务抽象不影响用户理解代码),直接上实例。
普通代理
public interface HyBusiness {
//海运进口业务
public void in();
//海运出口业务
public void out();
}
顶层接口,代理类及被代理类都会实现这个接口。
public class HjlBussinessImpl implements HyBusiness {
/**
* HJL进口业务
*/
@Override
public void in() {
System.out.println("HJL进口业务");
}
/**
* HJL出口业务
*/
@Override
public void out() {
System.out.println("HJL出口业务");
}
}
被代理类实现顶层接口。
public class SuniscoProxy implements HyBusiness {
private HyBusiness hyBusiness;
public SuniscoProxy() {
//默认代理HJL
hyBusiness = new HjlBussinessImpl();
}
/**
* 构造注入被代理船公司
*
* @param object 被代理船公司
* @throws Exception
*/
public SuniscoProxy(Class<?> object) throws Exception {
this.hyBusiness = (HyBusiness) object.newInstance();
}
/**
* 船代办理进口业务
*/
@Override
public void in() {
this.hyBusiness.in();
}
/**
* 船代办理出口业务
*/
@Override
public void out() {
this.hyBusiness.out();
}
}
代理类实现顶层接口,通过构造函数接收被代理对象,可通过无参构造函数默认代理一个被代理者。
public class Customer {
public static void main(String[] args) throws Exception {
//客户到船代办理业务
SuniscoProxy sp = new SuniscoProxy(HjlBussinessImpl.class);
//办理进口业务
sp.in();
//办理出口业务
sp.out();
}
}
小结:普通代理比较简单一些,在程序入口构建一个代理对象并且通过构造函数注入被代理类,程序调用代理的in(),out()方法,实际逻辑的执行还是在被代理类的in(),out()方法中,这就是为什么说代理类与被代理类都要实现顶层接口的原因,代理类中还可以做代理前操作及代理后操作。普通代理有一个不好的地方就是得写代理类,有没有一种方法不写代理类?只写接口和被代理类,代理类自动生成?当然可以,下一篇就讲解动态代理。