关闭

Java基础之代理模式

标签: java
244人阅读 评论(0) 收藏 举报
分类:

Java中代理模式是使用比较广泛的一个模式;下面,我们来用一个VPN上网的一个简单例子来说明一下吧!


/*============================
 * 代理模式:----常用的设计模式
 * 
 *============================*/

interface NetWork{
	public void browse();
}

class Real implements NetWork{//定义接口标准
	public void browse(){
		System.out.println("Real ...Operation");
	}
};


class Proxy implements NetWork{//代理中调用真实的服务
	private NetWork netWork;
	public Proxy(NetWork network){
		this.netWork=network;
	}
	//检查用户名
	public void check(){
		System.out.println("do check u passwd username");
	}
	
	public void browse(){
		this.check();//验证
		this.netWork.browse();//真实的操作
	}
};


public class ProxyDemo6 {//客户端调用代理服务
     public static void main(String[] args){
    	 NetWork net=null;    	 
    	 net=new Proxy(new Real());//指定代理操作
         net.browse();
     }
}

代理服务中,我们主要是解决核心业务外的功能,比如登录的验证,加密等操作;核心业务是代理业务中的一环;采用这种模式最经典的就是登录;


动态代理

/**===========================
 * 动态代理Demo
 * 
 *==========================*/

package demoRefle0001;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 实现接口
 * @author R
 *
 */
interface Subject {
	public String  say(String name,int age);//定义say接口
}

class RealSubject implements Subject{
   public String say(String name,int age){
	   return "姓名: "+name+"年龄:"+age;
   }	
   
}
/**
 * 动态代理
 * @author R
 *
 */
class MyInvocationHandler implements InvocationHandler{
    private Object obj;
    
    /*
     * 代理要 绑定的类
     */
    public Object bind(Object obj){
      this.obj=obj;//真实主题类
      System.out.println("1 这里是代理调用");
      return Proxy.newProxyInstance(obj.getClass().getClassLoader(), 
    		                        obj.getClass().getInterfaces(), 
    		                        this);
    }
    /**
     *Object proxy  代理对象
     *Method  method 代理方法 
     *object[] args 方法参数 
     */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("2 这里是代理调用");
		Object temp = method.invoke(this.obj, args);//获取调用方法 和参数
		return  temp ;
	}
	
	
	
}

public class DemoDymProxy {
	   public static void main(String[] args){
		  //绑定代理
          Subject sub=(Subject)new MyInvocationHandler().bind(new RealSubject());
          System.out.println("0 这里是代理调用");
	  	  String info = sub.say("李兴华",30) ;//调用代理invoke方法
	  	  System.out.println(info) ;  
	   }
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:97921次
    • 积分:1871
    • 等级:
    • 排名:千里之外
    • 原创:86篇
    • 转载:49篇
    • 译文:2篇
    • 评论:17条
    博客公告