前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式学习——代理模式(Proxy Pattern)

设计模式学习——代理模式(Proxy Pattern)

作者头像
饮水思源为名
发布2018-11-22 10:56:06
6620
发布2018-11-22 10:56:06
举报
文章被收录于专栏:Android小菜鸡Android小菜鸡

概述

代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,所访问的真实对象与代理对象需要实现相同的接口。根据代理模式的使用目的不同,代理模式又可以分为多种类型,例如保护代理、远程代理、虚拟代理、缓冲代理等,它们应用于不同的场合,满足用户的不同需求。

远程代理(Remote Proxy) 给一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又称为大使(Ambassador)。

虚拟代理(Virtual Proxy) 如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。

保护代理(Protect Proxy) 控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。

缓冲代理(Cache Proxy) 为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。

智能引用代理(Smart Reference Proxy) 当一个对象被引用时,提供一些额外的操作,例如将对象被调用的次数记录下来等。

代理模式结构图

简单理解:

代理模式是在不更改原功能、原代码的前提下,对被代理目标进行拓展。这样做的好处在于侵入性低,拓展性强。原目标不会有任何改变,避免出现修了水管破了顶的情况。

例子

用一个简单的理解来理解代理模式,Android中常用的点击事件,经常我们需要处理短时间重复点击以及请求状态中禁止重复请求的操作。我们可以写一个Proxy动态代理OnClickListener。

代码语言:javascript
复制
package com.wusy.adv;

import android.content.Context;
import android.view.View;
import android.widget.Toast;

/**
 * Created by XIAO RONG on 2018/10/24.
 */

public class ClickProxy implements View.OnClickListener{
    private static boolean isStartLoadingClick=false;
    private static boolean isStartSingleClick=false;
    private View.OnClickListener onClickListener;
    private Context mC;
    private long lastClickTime=0;
    private long times=1000;
    private boolean isLoading=false;
    public ClickProxy(View.OnClickListener onClickListener, Context context){
        this.onClickListener=onClickListener;
        this.mC=context;
    }


    @Override
    public void onClick(View v) {
        if (isStartLoadingClick){
            if(isLoading){
                Toast.makeText(mC,"正在加载,请稍后",Toast.LENGTH_SHORT).show();
                return;
            }else{
                isLoading=true;
            }
        }
        if(isStartSingleClick){
            if (System.currentTimeMillis() - lastClickTime >= times) {
                lastClickTime = System.currentTimeMillis();
            }else{
                Toast.makeText(mC,"您点得太快了",Toast.LENGTH_SHORT).show();
                return;
            }
        }
        onClickListener.onClick(v);
    }

    public void setLoading(boolean loading) {
        isLoading = loading;
    }
}

使用起来也非常简单,因为我们再Proxy中打印了Toast所以需要传入Context,同时需要判断是否正在处于加载中,所以提取了Proxy的对象。否则使用方式和普通的OnclickListener使用没有差别。

代码语言:javascript
复制
    private Button button;
    private ClickProxy clickProxy;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_proxy);
        button=findViewById(R.id.button);
        clickProxy=new ClickProxy(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(TextActivity.this,"点了button",Toast.LENGTH_SHORT).show();
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        clickProxy.setLoading(false);
                    }
                },500);
            }
        },this);
        button.setOnClickListener(clickProxy);
    }

参考文章

https://www.jianshu.com/p/d98e22c127ed https://blog.csdn.net/yanbober/article/details/45480965

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.10.24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 简单理解:
  • 例子
  • 参考文章
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档