欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式 之 代理模式

程序员文章站 2022-05-04 22:21:52
...

 

 

下载 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