【java设计模式】代理模式
计算类中方法运行时间的几种方案:
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设计模式】代理模式的更多相关文章
- Java设计模式-代理模式之动态代理(附源代码分析)
		Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ... 
- JAVA 设计模式 代理模式
		用途 代理模式 (Proxy) 为其他对象提供一种代理以控制对这个对象的访问. 代理模式是一种结构型模式. 结构 
- Java设计模式の代理模式
		目录 代理模式 1.1.静态代理 1.2.动态代理 1.3.Cglib代理 代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是 ... 
- Java设计模式 - 代理模式
		1.什么是代理模式: 为另一个对象提供一个替身或占位符以访问这个对象. 2.代理模式有什么好处: (1)延迟加载 当你需要从网络上面查看一张很大的图片时,你可以使用代理模式先查看它的缩略图看是否是自己 ... 
- Java设计模式—代理模式
		代理模式(Proxy Pattern)也叫做委托模式,是一个使用率非常高的模式. 定义如下: 为其他对象提供一种代理以控制对这个对象的访问. 个人理解: 代理模式将原类进行封装, ... 
- Java设计模式——代理模式实现及原理
		简介 Java编程的目标是实现现实不能完成的,优化现实能够完成的,是一种虚拟技术.生活中的方方面面都可以虚拟到代码中.代理模式所讲的就是现实生活中的这么一个概念:中介. 代理模式的定义:给某一个对象提 ... 
- Java设计模式-代理模式(Proxy)
		其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你 ... 
- Java设计模式--代理模式+动态代理+CGLib代理
		静态代理 抽象主题角色:声明真实主题和代理主题的共同接口. 代理主题角色:代理主题内部含有对真实主题的引用,从而在任何时候操作真实主题对象:代理主题提供一个与真实主题相同的接口,以便在任何时候都可以代 ... 
- Java设计模式——代理模式
		public interface People { public void work(); } public class RealPeople implements People { public v ... 
- Java 之 设计模式——代理模式
		设计模式——代理模式 一.概述 1.代理模式 (1)真实对象:被代理的对象 (2)代理对象:代理真实对象的 (3)代理模式:代理对象代理真实对象,达到增强真实对象功能的目的 二.实现方式 1.静态代理 ... 
随机推荐
- 基于Spring开发的一个BIO-RPC框架(对新人很友好)
			PART1:先来整体看下项目的构成 其中bio-rpc-core就是所谓的rpc框架 bio-rpc-example-client即所谓的服务调用方(你的项目中想要调用服务的地方) bio-rpc-e ... 
- 如何完全根据官方下载包搭建hibernate框架
			好久没有用s2sh的框架了,最近业务需要又要拾起来.在搭框架时,发现之前都是复制配置文件,对具体的细节却很懵懂,所以要从新来一遍,也是一次新的学习. 我使用的版本是hibernate-release- ... 
- 《java.util.concurrent 包源码阅读》16 一种特别的BlockingQueue:SynchronousQueue
			SynchronousQueue是一种很特别的BlockingQueue,任何一个添加元素的操作都必须等到另外一个线程拿走元素才会结束.也就是SynchronousQueue本身不会存储任何元素,相当 ... 
- ViewPager无限轮播与自定义切换动画
			一直在寻求一个能用得长久的ViewPager,寻寻觅觅终于发现,ViewPager有这一个就够了. 注:并非完全原创 先看一下效果: 淡入淡出: 旋转: 无限轮播的ViewPager 主要设计思路(以 ... 
- JavaEE中的MVC(一)Dao层彻底封装
			最近Android工作实在难找,考虑是不是该转行做Java了,今天开始,花几天的事件,研究一下JavaEE各层优化. 首先是Dao层 增删改方法封装 使用PreparedStatement执行一条Sq ... 
- 面试相关-转载-well,yzl——持续更新
			转载yl,yzl大神的面经,顺便自己复习一下专业课的内容 操作系统相关: 什么是进程, 什么是线程.它们之间的区别和联系. 进程管理内存资源+运行过程, 线程只管理运行过程, 线程要在进程提供的资源基 ... 
- JAVAFX-5事件总结
			事件监听 在RIA 或者说 桌面客户端gui android 开发中,事件的机制是必须的要学习了解的, 分类处理类型 在Java GUI 和swing中,事件通常通过实现listener的接口函数,并 ... 
- 简单模板view调用
			$this->display();//模板名称与当前控制器.当前操作方法的名称不一致 $this->display();//调用当前控制器对应目录指定名称的模板 $this->dis ... 
- 布局神器display:flex
			2009年,W3C提出了一种新的方案--Flex布局,可以简便.完整.响应式地实现各种页面布局.目前已得到所有现在浏览器的支持. flex浏览器支持 一.Flex布局是什么? Flex是Flexi ... 
- 移动GIS未来的前景GIS解决方案应用
			目前,在我国一些发达地区,移动GIS所需的两个技术前提——移动互联网的普及和智能终端的普及都已经得到了满足,特别是平板电脑.智能手机的流行,苹果产品的风靡,为移动GIS的应用提供了肥沃的土壤,而GIS ... 
