设计模式:结构型->代理模式
结构型模式是用来设计程序的结构的。结构型模式就像搭积木,将不同的类结合在一起形成契合的结构。
听起来没那么好懂的样子
代理模式的基本思路
代理模式就是给一个对象提供一个代理,并由代理对象控制对原对象的引用。它使得客户不能直接与真正的目标对象通信。代理对象是目标对象的代表,其他需要与这个目标对象打交道的操作都是和这个代理对象在交涉。
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 一模一样,但两者的目的不同,装饰模式是为了 增强功能或添加功能,代理模式主要是为了加以控制。
以上是静态代理,
- 静态代理,代理类需要自己编写代码写成。
- 动态代理,代理类通过 Proxy.newInstance() 方法生成。
动态代理这部分有点难看懂的说。。。