`
knight_black_bob
  • 浏览: 853258 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

设计模式 之 代理模式

阅读更多

 

 

下载 23种设计模式源码 :http://download.csdn.net/download/knight_black_bob/8936043

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


创建型模式,共五种:
工厂方法模式 抽象工厂模式 单例模式 建造者模式 原型模式

结构型模式,共七种:
适配器模式 装饰器模式 代理模式 外观模式 桥接模式 组合模式 享元模式

行为型模式,共十一种:
策略模式 模板方法模式 观察者模式 迭代子模式 责任链模式 命令模式

备忘录模式 状态模式 访问者模式 中介者模式 解释器模式

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

 

 

马士兵 动态代理学习~~~~

 

 

 

 

package 设计模式.代理模式;

public interface Moveable {
	void move();
}

 

package 设计模式.代理模式;

public class Tank implements Moveable{
	@Override
	public void move() {
     System.out.println("tank moving");
	}

}

 

package 设计模式.代理模式;

public class TankTimeProxy implements Moveable{

	private Moveable t;
	public TankTimeProxy(Moveable t) {
		this.t = t;
	}
	@Override
	public void move() {
		 long startTime = System.currentTimeMillis();  
         System.out.println("startTime: "+startTime);  
         t.move();  
         try { Thread.sleep(100); } catch (InterruptedException e) { }
         long endTime= System.currentTimeMillis();  
         System.out.println("endTime: "+endTime);  
         System.out.println("运行时间为: "+(endTime-startTime) +"ms"); 
	}

}

 

package 设计模式.代理模式;

import java.lang.reflect.Method;

public interface InvocationHandler {
	void invoke(Object o,Method m);  
}

 

package 设计模式.代理模式;

import java.lang.reflect.Method;

public class LogInvocationHandler implements InvocationHandler{

	 private Object target;  
     public LogInvocationHandler(Object target) {  
         this.target = target;  
     }  
	
	@Override
	public void invoke(Object o, Method m) {
		System.out.println("Tank start...........");  
        try {    m.invoke(target);   } catch (Exception e) {  }  
        System.out.println("Tank stop..............");  
	}

}

 

package 设计模式.代理模式;

import java.io.File;
import java.io.IOException;
import java.util.StringTokenizer;

public class FileUtil {
	
	 public static void createFile(String pathstr) throws IOException{  
        String path = pathstr;       
        StringTokenizer st = new StringTokenizer(path,"/");    
        String path1 = st.nextToken()+"/";    
        String path2 = path1;    
        while(st.hasMoreTokens())     {    
            path1 = st.nextToken()+"/";    
            path2 += path1;  
            File inbox = new File(path2);    
            if(!inbox.exists())    
                    inbox.mkdir();    
        }   
	}  
}

 

package 设计模式.代理模式;

import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

public class DynamicProxy {
	
	public static Object newProxyIntenct(Class infac,InvocationHandler h) throws Exception{  
        String br ="\r\n";  
        String methString ="";  
        Method[] method = infac.getMethods();  
        for(Method m: method){  
            methString =
            	"  @Override"+ br +  
                "   public void "+m.getName()+"() {"+ br +  
                "       try {" + br +  
                "       Method md ="+ infac.getName()+".class.getMethod(\""+m.getName()+"\");"+ br +  
                "       h.invoke(this,md);" + br +  
                "       }catch (Exception e){ "+ br+   
                "           e.printStackTrace();" + br +   
                "       }" + br +  
                "   }";  
        }  
      
        String src =   
                "package 设计模式.代理模式;" + br +  
                "import java.lang.reflect.Method;" + br +  
                "public class $DynamicProxy implements "+infac.getName()+"{" + br +  
                "   private 设计模式.代理模式.InvocationHandler h;" + br +  
                "   public $DynamicProxy(InvocationHandler h) {" + br +  
                "       super();" + br +  
                "       this.h = h;" + br +  
                "   }" + br + 
                	methString +br +  
                "}";  
        
        	FileUtil.createFile("D:/cache/eclipse-workspace/Test/src/设计模式/代理模式");  
            //生成java文件  
            String fileName ="D:\\cache\\eclipse-workspace\\Test\\src\\设计模式\\代理模式\\$DynamicProxy.java";  
            File file = new File(fileName);  
            FileWriter fWriter = new FileWriter(file);  
            fWriter.write(src);  
            fWriter.flush();  
            fWriter.close();  
          
            //生成class文件,jdk6提供的工具类  
            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();  
             //System.out.println(compiler.getClass().getName());  
            StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);  
            Iterable units = fileManager.getJavaFileObjects(fileName);  
            CompilationTask task = compiler.getTask(null, fileManager, null, null, null, units);  
            task.call();  
            fileManager.close();  
          
            //装载到内存,生成新对象  
            URL[] urls = new URL[]{new URL("file:/"+"D:\\cache\\eclipse-workspace\\Test\\src\\")};  
            URLClassLoader loader = new URLClassLoader(urls);  
            Class c = loader.loadClass("设计模式.代理模式.$DynamicProxy");  
          
            //通过有参的构造器反射生成代理类的实例  
            Constructor ctr = c.getConstructor(InvocationHandler.class);  
            Object obj = (Object) ctr.newInstance(h);   
            return obj;  
    }  
}

 

package 设计模式.代理模式;

public class ProxyTest {

	public static void main(String[] args) throws Exception {
		 Tank t = new Tank();  
         Moveable move = new TankTimeProxy(t);  
         move.move();  
         System.out.println("--------------------------------");
         Moveable move2 = (Moveable) DynamicProxy.newProxyIntenct(Moveable.class, new LogInvocationHandler(move));  
         move2.move(); 
                     
	}
}

 

 



 

 

 

如果发现 有   JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();  空指针 错误

 

请 把  jdk 中的 tool.jar  拷贝一份 放到 jre 中



 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

捐助开发者

在兴趣的驱动下,写一个免费的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(右上角的爱心标志,支持支付宝和PayPal捐助),没钱捧个人场,谢谢各位。



 
 
 谢谢您的赞助,我会做的更好!

 

 

 

  • 大小: 11.6 KB
  • 大小: 50.7 KB
  • 大小: 319.6 KB
分享到:
评论

相关推荐

    设计模式之代理模式

    **设计模式之代理模式** 代理模式是软件设计模式中的一种结构型模式,它在对象交互过程中引入一个代理,代理对象负责控制对原对象的访问。这种模式的主要目的是为了解耦,提供一种替代真实对象的方式,使得客户端...

    设计模式之代理模式proxy

    **设计模式之代理模式(Proxy Pattern)** 设计模式是软件工程中的一种最佳实践,它是在特定情境下解决常见问题的模板。代理模式是其中一种行为设计模式,它的核心思想是为一个对象提供一个替身或者代理,以控制对...

    深入浅出设计模式之代理模式

    根据提供的标题“深入浅出设计模式之代理模式”与描述“将《Head First 设计模式》(中文版)按章节进行了分割,每章一个文件,方便大家下载”,我们可以推测出这部分内容主要聚焦于介绍和解释代理模式这一重要的设计...

    设计模式之代理模式视频教学

    代理模式是一种在软件设计中广泛使用的行为设计模式,它的核心思想是为...通过观看"设计模式之代理模式视频教学",你可以系统地学习代理模式的理论知识和实践技巧,提升自己的设计能力,更好地应对复杂的软件开发挑战。

    大话设计模式之代理模式

    大话设计模式之代理模式 经典代码 C#类

    Java设计模式之代理模式

    Java设计模式之代理模式 1.代理模式 1.1 静态代理 1.2 动态代理 1.3.代理模式使用原因和应用方面

    .net实现设计模式之代理模式

    代理模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,特别是在.NET框架下。代理模式的核心思想是为一个对象提供一个替代品或代表,这个替代品能够控制对原对象的访问,使得客户端代码可以通过代理对象与...

    Java设计模式之代理模式(结构)

    ### Java设计模式之虚拟代理模式详解 #### 一、引言 在软件工程领域,设计模式作为一种被广泛接受的最佳实践,对于提高代码质量和可维护性起着至关重要的作用。其中,“代理模式”作为结构型设计模式之一,在解决...

    设计模式之代理模式demo

    代理模式是一种常用的设计模式,它在软件开发中起到了中介或者代表的作用。代理模式的主要目的是为其他对象提供一种代理以控制对这个对象的访问。通过引入代理,我们可以增加新的功能,如缓存、日志记录、访问控制等...

    JAVA设计模式之代理模式实例

    代理模式是设计模式的一种,它提供了一种对目标对象进行增强或者控制访问的方式。在本实例中,我们将深入探讨Java中的代理模式及其应用。 代理模式的核心思想是为一个对象创建一个代理对象,这个代理对象在客户端和...

    面向对象23种设计模式之代理模式

    代理模式是面向对象设计模式中的一个关键概念,它在软件工程中扮演着重要角色,用于在客户端和目标对象之间创建一种代理关系,以提供额外的功能或控制。在代理模式中,代理类作为真实对象的代表,它可以在客户端与...

    设计模式之代理模式Proxy

    代理模式是设计模式中的一种结构型模式,它在对象交互中起到了中介的作用,允许通过代理对象来控制对原对象的访问。代理模式的核心思想是为一个对象提供一个替身,以便增加新的功能或者控制对原对象的访问。这种模式...

    Java设计模式之代理模式[收集].pdf

    Java设计模式之代理模式[收集].pdf

Global site tag (gtag.js) - Google Analytics