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();
    
    	}
    }

  • 相关阅读:
    BZOJ2988 : DIVISORS
    BZOJ1255 : Pku2332 One is good, but two is better
    BZOJ2411 : 黄牌
    BZOJ2887 : 旅行
    BZOJ2353 : 矩形压缩
    BZOJ2997 : 想法计数
    BZOJ2092 : [Poi2010]Lamp
    Potyczki Algorythmiczne 2019
    2019-2020 ICPC Asia Hong Kong Regional Contest
    The 2019 China Collegiate Programming Contest Harbin Site
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468880.html
Copyright © 2011-2022 走看看