设计模式:结构型->代理模式

结构型模式是用来设计程序的结构的。结构型模式就像搭积木,将不同的类结合在一起形成契合的结构。

听起来没那么好懂的样子

 

代理模式的基本思路

代理模式就是给一个对象提供一个代理,并由代理对象控制对原对象的引用。它使得客户不能直接与真正的目标对象通信。代理对象是目标对象的代表,其他需要与这个目标对象打交道的操作都是和这个代理对象在交涉

 

 o Subject: 抽象主题角色o Proxy: 代理主题角色o RealSubject: 真实主题角色

 

代理者可以在实现功能后,加上一些打印日志等的功能。

举个例子:

Subject:网络请求接口

public interface IHttp {
    void request(String sendData);
    void onSuccess(String receivedData);
}

RealSubject:网络工具类

public class HttpUtil implements IHttp {
    @Override
    public void request(String sendData) {
        System.out.println("网络请求中...");
    }
​
    @Override
    public void onSuccess(String receivedData) {
        System.out.println("网络请求完成。");
    }
}

Proxy:代理类

public class HttpProxy implements IHttp {
    private final HttpUtil httpUtil;
​
    public HttpProxy(HttpUtil httpUtil) {
        this.httpUtil = httpUtil;
    }//关键代码,获取要代理的对象
​
    @Override
    public void request(String sendData) {
        System.out.println("发送数据:" + sendData);
        httpUtil.request(sendData);
    }
​
    @Override
    public void onSuccess(String receivedData) {
        System.out.println("收到数据:" + receivedData);
        httpUtil.onSuccess(receivedData);
    }
}

客户端做如下:

public class Client {
    @Test
    public void test() {
        HttpUtil httpUtil = new HttpUtil();
        HttpProxy proxy = new HttpProxy(httpUtil);
        proxy.request("request data");//使用代理
        proxy.onSuccess("received result");
    }
}

这就是代理模式的一个应用,除了 打印日志,它还可以用来做权限管理。读者看到这里可能已经发现了,这个代理类看起来和装饰模式的 FilterInputStream 一模一样,但两者的目的不同,装饰模式是为了 增强功能或添加功能,代理模式主要是为了加以控制。

 

以上是静态代理,

  1. 静态代理,代理类需要自己编写代码写成。
  2. 动态代理,代理类通过 Proxy.newInstance() 方法生成。

 

动态代理这部分有点难看懂的说。。。

 

posted @ 2021-04-01 10:05  将来的事  阅读(41)  评论(0编辑  收藏  举报