代理模式

定义

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

静态代理

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

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

转载于:https://www.cnblogs.com/LynnMin/p/9534417.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值