JAVA设计模式--动态代理模式

来源:互联网 发布:兄弟连php pdf 编辑:程序博客网 时间:2024/05/21 19:42


今天看了一下设计模式,下面我对这方面做个学习总结:

以小车做个实例:首先定义了一个定义了一个Moveable的接口,内的方法为move()方法;让小车继承Moveable接口,实现move方法,并写了一些简单逻辑

public void move() {
        long start =System.CurrentTimeMillis();
        System.out.println("Tank Moving...");
        try {
            Thread.sleep(new Random().nextInt(10000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        long end = System.currentTimeMillis();

        System.out.println(“time:”+(end-start));
    }

在这个实例,记录了小车运行时间。

提出问题:如何对该类进行日志检查、检查方法运行时间的等等操作。

则需要添加一个实现Moveable的接口一个类,对其扩展业务逻辑,不要使用继承,因为以后扩展太不灵活,在进行逻辑操作,会导致类的繁琐,所以使用聚合,达到高内聚,低耦合;

所以如果对其任意实现Moveable接口来扩展其功能,可以使用构造方法传值的方法、即所谓的内聚。

那么这个实现Moveable接口的类就叫做代理类,那么问题出现了如何为这个对象提供不同的逻辑处理那?

那么可以自己写一个总代理,为了理解不用JV,M的proxy,直接写一个newProxyInstance()方法返回Object对象,内部可以模拟JVM动态加载某个实现PROXY接口的子类,

所以可以再测试类中可以写创建一个小车对象、定义Movable m =(Movable)Proxy.newProxyInstance(小车对象); m.move();

就此实现了同一个对象有不同的逻辑处理

那么又有一个问题那么有这样一个代理类可以为任意一个对象代理哪,答案就是传入一class类型的接口,内部细节就不叙述了,实现的时候就可以以Movable m=(Moveable)Proxy.newProxyInstance(Movable.CLASS);

但是这样还不行每一个接口内的方法不是一样,那么就用到反射的技术,在proxy类里可以动态的创建class对象来获取方法


当然以上的流程都被JDK封装了,写这个就是为了更深入的理解代理的概念