zoukankan      html  css  js  c++  java
  • 设计模式:结构型->代理模式

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

    听起来没那么好懂的样子

    代理模式的基本思路

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

     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() 方法生成。

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

  • 相关阅读:
    numpy.clip(a, a_min, a_max, out=None)(values < a_min are replaced with a_min, and those > a_max with a_max.)
    pytorch使用过程中遇到的一些问题
    conda管理包
    python argparse模块
    pytorch中设定使用指定的GPU
    Linux下dpkg的用法
    python pdb模块
    ubuntu SSH 连接、远程上传下载文件
    Linux中执行shell脚本命令的4种方法总结
    python linux安装anaconda
  • 原文地址:https://www.cnblogs.com/take-it-easy/p/14605004.html
Copyright © 2011-2022 走看看