计算类中方法运行时间的几种方案:

Client:

 package com.tn.proxy;

 public class Client {
public static void main(String[] args) {
/* Car car=new Car();
car.move(); */ //通过继承计算方法的运行时间
/* CarTimeByExtends ctp=new CarTimeByExtends();
ctp.move(); */ //通过聚合计算类中方法运行时间
/* Car car=new Car();
CarTimeByAggregate ctba=new CarTimeByAggregate(car);
ctba.getCarRunningTime(); */
}
}

Movable:

 package com.tn.proxy;

 public interface Movable {
void move();
void stop();
}

Car:

 package com.tn.proxy;

 import java.util.Random;

 public class Car implements Movable {

     @Override
public void move() {
/**
* 方法内的两段注释代码为给move()方法增加日志及计算方法执行时间。
*/
/* long start=System.currentTimeMillis();
System.out.println("Car is start moving..."+start); */
System.out.println("Car is moving...");
try {
Thread.sleep(new Random().nextInt(1500));
} catch (InterruptedException e) {
e.printStackTrace();
}
/* long end=System.currentTimeMillis();
System.out.println("Car is stop moving..."+end);
System.out.println("Car running time is "+(end-start)); */
} @Override
public void stop() {
System.out.println("Car is stopped.");
} }

CarTimeByExtends:

 package com.tn.proxy;
/**
* 通过继承计算类中方法的运行时间
* @author xiongjiawei
*
*/
public class CarTimeByExtends extends Car{
@Override
public void move() {
long start=System.currentTimeMillis();
super.move();
long end=System.currentTimeMillis();
System.out.println("Car running time is:"+(end-start));
}
}

CarTimeByAggregate:

 package com.tn.proxy;
/**
* 通过聚合计算方法运行时间
* @author xiongjiawei
*
*/
public class CarTimeByAggregate {
Car car; public CarTimeByAggregate(Car car){
this.car=car;
} public void getCarRunningTime(){
long start=System.currentTimeMillis();
car.move();
long end=System.currentTimeMillis();
System.out.println("Car running time is:"+(end-start));
}
}

通过静态代理实现以上功能:

Client:

 package com.tn.proxy;

 public class Client {
public static void main(String[] args) {
Car car=new Car();
CarTimeProxy ctp=new CarTimeProxy(car);
CarLogProxy clp=new CarLogProxy(ctp);
clp.move();
/* 运行结果:Car被时间包装,时间被日志包装
logging...
start time:1494730233358
Car is moving...
end time:1494730234835
logged.
*/
System.out.println("--------------------------------------");
Movable clp2=new CarLogProxy(car);
Movable ctp2=new CarTimeProxy(clp2);
ctp2.move();
/*
运行结果:时间包装日志,日志包装car
start time:1494730473747
logging...
Car is moving...
logged.
end time:1494730474995
*/
}
}

Movable:

 package com.tn.proxy;

 public interface Movable {
void move();
}

Car:

 package com.tn.proxy;

 import java.util.Random;

 public class Car implements Movable {

     @Override
public void move() {
System.out.println("Car is moving...");
try {
Thread.sleep(new Random().nextInt(1500));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

CarTimeProxy:

 package com.tn.proxy;

 public class CarTimeProxy implements Movable{
Movable movable;
public CarTimeProxy(Movable movable){
this.movable=movable;
}
@Override
public void move() {
long start=System.currentTimeMillis();
System.out.println("start time:"+start);
movable.move();
long end=System.currentTimeMillis();
System.out.println("end time:"+end);
}
}

CarLogProxy:

 package com.tn.proxy;

 public class CarLogProxy implements Movable {
Movable movable; public CarLogProxy(Movable movable){
this.movable=movable;
} @Override
public void move() {
System.out.println("logging...");
movable.move();
System.out.println("logged.");
} }

利用反射动态加载:

 package com.tn.proxy2;

 import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.net.URLClassLoader; import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask; import com.tn.proxy.Car;
import com.tn.proxy.Movable; import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider; public class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
String rt="\r\t";
String str=
"package com.tn.proxy;"+rt+ "public class CarTimeProxy implements Movable{"+rt+
" Movable movable;"+rt+
" public CarTimeProxy(Movable movable){"+rt+
" this.movable=movable;"+rt+
" }"+rt+
" @Override"+rt+
" public void move() {"+rt+
" long start=System.currentTimeMillis();"+rt+
" System.out.println(\"start time:\"+start);"+rt+
" movable.move();"+rt+
" long end=System.currentTimeMillis();"+rt+
" System.out.println(\"end time:\"+end);"+rt+
" }"+rt+
"}"; //源代码文件生成
String fileName=System.getProperty("user.dir")
+"/src/com/tn/proxy/CarTimeProxy.java";
// System.out.println(fileName);
File f=new File(fileName);
FileWriter fw=new FileWriter(f);
fw.write(str);
fw.flush();
fw.close(); //编译
JavaCompiler compiler=ToolProvider.getSystemJavaCompiler();
// System.out.println(compiler.getClass().getName());
StandardJavaFileManager fMgr=compiler.getStandardFileManager(null, null, null);
Iterable iterable=fMgr.getJavaFileObjects(fileName);
CompilationTask ct=compiler.getTask(null, fMgr, null, null, null, iterable);
ct.call();
fMgr.close(); //载入内存,创建类对象实例
URL[] urls=new URL[]{new URL("file:/"+System.getProperty("user.dir")+"/src")};
URLClassLoader ul=new URLClassLoader(urls);
Class c=ul.loadClass("com.tn.proxy.CarTimeProxy");
ul.close();
// System.out.println(c); Constructor constructor=c.getConstructor(Movable.class);
Movable movable=(Movable)constructor.newInstance(new Car());
movable.move();
}
}

【java设计模式】代理模式的更多相关文章

  1. Java设计模式-代理模式之动态代理(附源代码分析)

    Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...

  2. JAVA 设计模式 代理模式

    用途 代理模式 (Proxy) 为其他对象提供一种代理以控制对这个对象的访问. 代理模式是一种结构型模式. 结构

  3. Java设计模式の代理模式

    目录  代理模式 1.1.静态代理   1.2.动态代理 1.3.Cglib代理 代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是 ...

  4. Java设计模式 - 代理模式

    1.什么是代理模式: 为另一个对象提供一个替身或占位符以访问这个对象. 2.代理模式有什么好处: (1)延迟加载 当你需要从网络上面查看一张很大的图片时,你可以使用代理模式先查看它的缩略图看是否是自己 ...

  5. Java设计模式—代理模式

    代理模式(Proxy Pattern)也叫做委托模式,是一个使用率非常高的模式. 定义如下:     为其他对象提供一种代理以控制对这个对象的访问. 个人理解:        代理模式将原类进行封装, ...

  6. Java设计模式——代理模式实现及原理

    简介 Java编程的目标是实现现实不能完成的,优化现实能够完成的,是一种虚拟技术.生活中的方方面面都可以虚拟到代码中.代理模式所讲的就是现实生活中的这么一个概念:中介. 代理模式的定义:给某一个对象提 ...

  7. Java设计模式-代理模式(Proxy)

    其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你 ...

  8. Java设计模式--代理模式+动态代理+CGLib代理

    静态代理 抽象主题角色:声明真实主题和代理主题的共同接口. 代理主题角色:代理主题内部含有对真实主题的引用,从而在任何时候操作真实主题对象:代理主题提供一个与真实主题相同的接口,以便在任何时候都可以代 ...

  9. Java设计模式——代理模式

    public interface People { public void work(); } public class RealPeople implements People { public v ...

  10. Java 之 设计模式——代理模式

    设计模式——代理模式 一.概述 1.代理模式 (1)真实对象:被代理的对象 (2)代理对象:代理真实对象的 (3)代理模式:代理对象代理真实对象,达到增强真实对象功能的目的 二.实现方式 1.静态代理 ...

随机推荐

  1. Api管理工具(spring-rest-docs)

    对于app开发来说,必须需要有相应的api文档,一般最基础的就是用markdown工具来撰写api文档.当对于开发人员来说,是总会想着寻找更方便撰写,测试,对接前端开发的文档生成的工具. 其实这方面的 ...

  2. python 常用库整理

    python 常用库整理 GUI 图形界面 Tkinter: Tkinter wxPython:wxPython pyGTK:PyGTK pyQt:pyQt WEB框架 django:django w ...

  3. P3092 [USACO13NOV]没有找零No Change

    题目描述 Farmer John is at the market to purchase supplies for his farm. He has in his pocket K coins (1 ...

  4. Science发表的超赞聚类算法

    作者(Alex Rodriguez, Alessandro Laio)提出了一种很简洁优美的聚类算法, 可以识别各种形状的类簇, 并且其超参数很容易确定. 算法思想 该算法的假设是类簇的中心由一些局部 ...

  5. 在没有DOM操作的日子里,我是怎么熬过来的(中)

    前言 继上篇推送之后,在掘金.segmentfault.简书.博客园等平台上迅速收到了不俗的反馈,大部分网友都留言说感同身受,还有不少网友追问中篇何时更新.于是,闰土顺应呼声,在这个凛冽的寒冬早晨,将 ...

  6. Python 运行效率为何低

    当我们提到一门编程语言的效率时:通常有两层意思,第一是开发效率,这是对程序员而言,完成编码所需要的时间:另一个是运行效率,这是对计算机而言,完成计算任务所需要的时间.编码效率和运行效率往往是鱼与熊掌的 ...

  7. 【JDK1.8】JDK1.8集合源码阅读——TreeMap(二)

    一.前言 在前一篇博客中,我们对TreeMap的继承关系进行了分析,在这一篇里,我们将分析TreeMap的数据结构,深入理解它的排序能力是如何实现的.这一节要有一定的数据结构基础,在阅读下面的之前,推 ...

  8. ajax实现用户名校验的传统和jquery的$.post方式

    第一种:传统的ajax异步请求,后台代码以及效果在最下边 首先我们在eclipse中创建一个注册页面regist.jsp,创建一个form表单,注意,由于我们只是实现用户名校验的效果,下边红色部门是我 ...

  9. Java开发步骤

    3.编辑Java源程序 使用纯文本编辑器,比如记事本notpad.exe:EditPlus.UltraEdit等专业的纯文本编辑器. Word不是纯文本编辑器. 需求:写一个Java程序,在控制台打印 ...

  10. POST和GET有什么区别?

    1. GET主要用于从服务器查询数据,POST用于向服务器提交数据 2. GET通过URL传递数据,POST通过http请求体传递数据 3. GET传输数据量有限制,不能大于2kb,POST传递的数据 ...