代理模式__之深度剖析

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
官网文档__
http://www.runoob.com/design-pattern/proxy-pattern.html
意图:为其他对象提供一种代理以控制对这个对象的访问。

需求__现在有一个方法、要求计算方法实际执行的时间、但是有一个前提条件、不能对这个方法所在的类做任何改动___怎么办,???
使用代理__可以轻易的在方法的前边后边做任何事。

代码实现

1--------------
public interface Moveable {
    void move();
}


2----------------------------
public class Tank1 implements Moveable {
    @Override
    public void move() {
        System.out.print("zheng zai yi dong....");
    }
}



3--------------------------------------------
public class Dail2 implements Moveable {
//    Tank1 t;
    Moveable t;
    public Dail2(Moveable tank1) {
        super();
        t = tank1;
    }

    @Override
    public void move() {
        long start = System.currentTimeMillis();
        t.move();
        long end = System.currentTimeMillis();
        System.out.println("运行时间为:" + (end - start));
    }
}
4------------test
public static void main(String[] args) {
//        Tank1 t=new Tank1();
//        t.move();
        //记录时间__
        Tank1 t = new Tank1();
        Dail2 d = new Dail2(t);
        Moveable m = d;
        m.move();
    }

主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。

 * 何时使用:想在访问一个类时做一些控制。
 * 如何解决:增加中间层  __Moveable t;
 * 关键代码:实现与被代理类组合。 __Moveable t;
【接口1__实现 两层   代理类__同样的接口 接口1 _Moveable t;提前聚合 __.class加载时move方法已经加载、可在方法前后做一些操作】

关键点:___在执行 new Dail2(t).move() 方法时 中t.move() 会调用 new Tank().move() 根本原因是在jvm加载类时已经聚合了对象tank

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/e_shi_yi_p/article/details/84667159
今日推荐