• 设计模式——代理模式


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

    转载请说明出处: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;
    /**
     * client调用
     * @author 阳光小强
     *
     */
    public class Main {
    	public static void main(String[] args) {
    		Subject sub = new RealSubject();
    		sub.request();
    	}
    }
    
    上面代码应该非常easy看懂。以下我们使用代理模式(新增一个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;
    
    /**
     * client调用
     * @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();
    
    	}
    }

  • 相关阅读:
    Flask之threading.loacl方法
    websocket之简易聊天室
    websocket介绍
    Flask之jinja2模板语言
    Flask之基础
    Linux之项目的部署
    Linux之nginx负载均衡
    Linux之nginx
    Linux之redis-cluster
    Linux之redis-sentinel
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6801065.html
Copyright © 2020-2023  润新知