java 代理实践

来源:互联网 发布:php chmod 777 编辑:程序博客网 时间:2024/05/21 19:46

why ?

当一个对象不能或者不想直接访问另一个对象时,可以通过一个代理对象来间接访问。为保证客户端使用的透明性,委托对象和代理对象要实现同样的接口。被访问的对象不想暴露全部内容时,可以通过代理去掉不想被访问的内容。

动态代理和静态代理优缺点

静态代理: 有点:业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。缺点:(1)代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。(2)如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。动态代理:优点:1、协调调用者和被调用者,降低系统耦合度。2、用小对象代表大对象,减少系统资源消耗,提高系统运行速度,如虚拟代理。3、控制用户对呗调用者的使用权限,如保护代理。缺点:1、首先当然是比直接调用原始对象多了一个中间者,会让结构有点复杂。2、调用原始对象的方法要通过代理来调用,可能会造成请求处理速度变慢。

java 静态代理

第一步: 创建接口

public interface ILawsuit {    void submit();//提交申请}

第二步: 实现者

public class Civilian implements ILawsuit {    @Override    public void submit() {        System.out.println("起诉");    }}

第三步: 调用者(代理类)

public class Lawyer implements ILawsuit {    private ILawsuit civilian;    public Lawyer(ILawsuit civilian) {        this.civilian = civilian;    }    @Override    public void submit() {        civilian.submit();    }}

第四步: 测试

 ILawsuit civilian = new Civilian(); ILawsuit lawyer = new Lawyer(civilian); lawyer.submit();

java 动态代理

第一步: 创建接口

public interface ILawsuit {    void submit();//提交申请}

第二步: 实现者

public class Civilian implements ILawsuit {    @Override    public void submit() {        System.out.println("起诉");    }}

第三步: 代理类

public class UserServiceInvocationHandler implements InvocationHandler {private Object delegate;public UserServiceInvocationHandler(Object delegate) {    super();    this.delegate = delegate;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {    System.out.println("Dynamic Before add");    Object object = method.invoke(delegate, args);    System.out.println("Dynamic After add");    return object;    }}

第四步: 测试

ILawsuit lawsuit = new Civilian();UserServiceInvocationHandler proxy = new UserServiceInvocationHandler(lawsuit);(1)第一种方法//和一个InvocationHandler的实现,也就是前面创建的proxy。ILawsuit lawyer = (ILawsuit) Proxy.newProxyInstance(lawsuit.getClass().getClassLoader(),new Class[]{ILawsuit.class},proxy);lawyer.submit();(2)第二种方法 Class<?> proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), ILawsuit.class); ILawsuit lawyer = (ILawsuit) proxyClass.getConstructor(UserServiceInvocationHandler.class).                 newInstance(proxy); lawyer.submit();
原创粉丝点击