zoukankan      html  css  js  c++  java
  • 设计模式——代理模式

    代理模式的作用是控制和管理访问

    转载请说明出处:http://blog.csdn.net/dawanganban

    先看一段代码:

    package com.test;
    /**
     * 抽象角色
     * @author Administrator
     *
     */
    abstract public class Subject {
    	abstract public void request();
    }

    package com.test;
    /**
     * 真实角色
     * @author 阳光小强
     *
     */
    public class RealSubject extends Subject{
    	public RealSubject(){
    		
    	}
    	
    	public void request(){
    		System.out.println("From real subject");
    	}
    }
    package com.test;
    /**
     * 客户端调用
     * @author 阳光小强
     *
     */
    public class Main {
    	public static void main(String[] args) {
    		Subject sub = new RealSubject();
    		sub.request();
    	}
    }
    
    上面代码应该很容易看懂,下面我们使用代理模式(新增一个ProxySubject类)

    package com.test;
    
    /**
     * 
     * @author 阳光小强
     *
     */
    public class ProxySubject extends Subject{
    	private RealSubject realSubject; //以真实角色作为代理角色的属性
    	
    	public ProxySubject(){
    		
    	}
    
    	@Override
    	public void request() {
    		preRequest();
    		
    		if(realSubject == null){
    			realSubject = new RealSubject();
    		}
    		realSubject.request();
    		
    		postRequest();
    	}
    	
    	private void preRequest(){
    		//something you want to do before requesting 
    	}
    	
    	private void postRequest(){
    		//something you want to do after requesting 
    	}
    
    }
    

    客户实际需要调用的是RealSubject类的request()方法,现在用ProxySubject来代理RealSubject类,同样达到目的,同时还封装了其他方法(preRequest(),postRequest()),可以处理一些其他问题。

     

    有时候我们需要代理的对象不确定,所以就需要动态代理,Java中的动态代理模式实现如下:

    package com.test;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    public class DynamicSubject implements InvocationHandler {  
          
        private Object dele;  
          
        public DynamicSubject(Object obj) {  
            this.dele = obj;  
        }  
          
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  
            doBefore();  
            //在这里完全可以把下面这句注释掉,而做一些其它的事情  
            Object result = method.invoke(dele, args);  
            after();  
            return result;  
        }  
          
        private void doBefore() {  
            System.out.println("before....");  
        }  
          
        private void after() {  
            System.out.println("after....");  
        }  
    }  
    package com.test;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Proxy;
    
    /**
     * 客户端调用
     * @author 阳光小强
     *
     */
    public class Main {
    	public static void main(String[] args) throws Exception {
    		RealSubject rs = new RealSubject(); //被代理的类
    		InvocationHandler ds = new DynamicSubject(rs); //初始化代理类
    		
    		Subject subject = (Subject) Proxy.newProxyInstance(rs.getClass().getClassLoader(), rs.getClass().getInterfaces(), ds);
    		subject.request();
    
    	}
    }

  • 相关阅读:
    android 中文 api (43) —— Chronometer
    SVN客户端清除密码
    Android 中文 API (35) —— ImageSwitcher
    Android 中文API (46) —— SimpleAdapter
    Android 中文 API (28) —— CheckedTextView
    Android 中文 API (36) —— Toast
    Android 中文 API (29) —— CompoundButton
    android 中文 API (41) —— RatingBar.OnRatingBarChangeListener
    Android 中文 API (30) —— CompoundButton.OnCheckedChangeListener
    Android 中文 API (24) —— MultiAutoCompleteTextView.CommaTokenizer
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468880.html
Copyright © 2011-2022 走看看