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

    多思考,多尝试。
  • 相关阅读:
    依赖注入(DI)和Ninject
    Dapper.NET——轻量ORM
    优化SQL查询:如何写出高性能SQL语句
    Razor语法
    sublime Text 3 官方版 3114 注册码
    数据库索引,存储过程,视图,事务
    Action向视图传值的6种方式
    C#知识点提要
    算法总结
    c++ 构造函数,拷贝构造函数,析构函数与赋值操作符
  • 原文地址:https://www.cnblogs.com/LynnMin/p/9534417.html
Copyright © 2011-2022 走看看