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

    定义

    给某一对象提供一个代理对象,并由代理对象控制对原对象的引用。

    静态代理

    有些情况下,一个客户不想或者不能够直接引用一个对象,可以通过代理对象在客户端和目标对象之间起到中介作用。代理模式中的角色有:

    1、抽象对象角色

    声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象

    2、目标对象角色

    定义了代理对象所代表的目标对象

    3、代理对象角色

    代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象

    举例

    抽象对象角色;

    package pattern.proxy;
    /**
     * 抽象对象角色
     * @author Lynn
     *
     */
    public interface Server {
    	String getPageTitle(String url);
    }
    
    

    目标对象角色

    package pattern.proxy;
    /**
     * 目标对象角色
     * @author Lynn
     *
     */
    public class BaiduServer implements Server {
    
    	@Override
    	public String getPageTitle(String url) {
    		// TODO Auto-generated method stub
    		if("https://www.baidu.com/".equals(url)) {
    			return "百度首页";
    		}else if("https://wenku.baidu.com/".equals(url)) {
    			return "百度文库";
    		}else {
    			return "无标题";
    		}
    		
    	}
    
    }
    
    

    代理对象角色

    package pattern.proxy;
    
    /**
     * 代理對象角色;
     * @author Lynn
     *
     */
    public class NginxProxyServer implements Server {
    
    	private Server server;
    
    	public NginxProxyServer(Server server) {
    		this.server = server;
    	}
    
    	@Override
    	public String getPageTitle(String url) {
    		// TODO Auto-generated method stub
    		return server.getPageTitle(url); //实际调用的时目标对象的方法;
    		
    	}
    
    }
    
    
    

    动态代理

    动态代理的核心就是将公共的逻辑抽象到InvocationHandler中

    package pattern.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    public class NginxInvocationHandler implements InvocationHandler {
    
    	private Object object;
    	public NginxInvocationHandler(Object object) {
    		this.object = object;
    	}
    	@Override
    	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    		// TODO Auto-generated method stub
    		return method.invoke(object, args);
    	}
    
    }
    
    

    测试

    package pattern.proxy;
    
    import java.lang.reflect.Proxy;
    
    import org.junit.Test;
    
    public class TestProxy {
    	@Test
    	public  void testStaticProxy() {
    		Server server = new BaiduServer();
    		Server proxyServer = new NginxProxyServer(server);
    		System.out.println(proxyServer.getPageTitle("https://www.baidu.com/"));;
    		
    	}
    	@Test
    	public void testInvocationHandler() {
    		Server server = new BaiduServer();
    		NginxInvocationHandler handler = new NginxInvocationHandler(server);
    		Server proxy =(Server)Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{Server.class}, handler);
    		System.out.println(proxy.getPageTitle("https://www.baidu.com/"));
    	}
    }
    
    
    

    参考

    https://www.cnblogs.com/xrq730/p/4907999.html
    https://github.com/crossoverJie/JCSprout/blob/master/MD/SpringAOP.md

    多思考,多尝试。
  • 相关阅读:
    对用户控件(ascx)属性(property)赋值
    The Controls collection cannot be modified because the control contains code blocks (i.e. <% ... %>).
    图片淡入淡出切换效果
    在用户控件(ASCX)创建用户控件(ASCX)
    Login failed for user 'xxx'
    一些较好的书
    儿子购买的书
    怀念以前做网管的日子
    Linux下selinux简单梳理
    Rsync同步时删除多余文件 [附:删除大量文件方法的效率对比]
  • 原文地址:https://www.cnblogs.com/LynnMin/p/9534417.html
Copyright © 2011-2022 走看看