设计模式之代理模式---Proxy Pattern

模式的定义

代理模式(Proxy Pattern)也叫做委托模式,定义如下:

Provide a surrogate or placeholder for another object to control access to is.

为其他对象提供一种代理以控制对这个对象的访问。

类型

结构类

模式的使用场景

想想现实世界中,打官司为什么要找个律师?因为你不想参与中间过程的是是非非,只要完成自己的工作就可以,其它的事情比如事前调查,事后追查都可以由律师来负责,这就可以减少你的负担。代理模式使用的场景 非常多。

UML类图

角色介绍

Subject–抽象主题角色

抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义

RealSubject—具体主题角色

也叫做被委托角色,被代理角色。是业务逻辑的具体执行者

Proxy—-代理主题角色

也叫委托类,代理类。它负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实主题角色处理完毕前后做预处理和善后处理工作。

模式的通用源码

Subject—-抽象主题类:


public interface Subject {

    public void request();
}

RealSubject—-真实主题类:


public class RealSubject implements Subject {

    @Override
    public void request() {
        // TODO Auto-generated method stub
        System.out.println("RealSubject---request");
    }

}

Proxy—代理类:


public class Proxy implements Subject {

    private Subject subject;

    public Proxy(){
        this.subject = new Proxy();
    }

    public Proxy(Object... objects){

    }

    public Proxy(Subject subject){
        this.subject = subject;
    }

    @Override
    public void request() {
        // TODO Auto-generated method stub
        this.before();
        this.subject.request();
        this.after();
    }

    private void after() {
        // TODO Auto-generated method stub
        System.out.println("Proxy---after");
    }

    private void before() {
        // TODO Auto-generated method stub
        System.out.println("Proxy---before");
    }

}

Client类:

public class Client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Subject subject = new RealSubject();
        Proxy proxy = new Proxy(subject);
        proxy.request();
    }

}

输出结果:

Proxy---before
RealSubject---request
Proxy---after

优点

  • 职责清晰

    真实的角色就是实现实际的业务逻辑,不用关心其它的非本职责的事务,通过后期的代理完成一件事务,附带的结果是编程简洁清晰

  • 高扩展性

    具体的主题角色是随时都会发生变化,只要它实现了接口,甭管它如何变化,都逃不脱如来的手掌(接口),那我们的代理类完全就可以在不做任何修改的情况下使用。

  • 智能化

    这主要体现在动态代理上。

Android源码中的模式实现

android Proxy样例一

抽象对象类—ProxySelector:

./libcore/luni/src/main/java/java/net/ProxySelector.java
public abstract class ProxySelector {
   ......
   private static ProxySelector defaultSelector = new ProxySelectorImpl();
   ......
   public abstract List<Proxy> select(URI uri);
   public abstract void connectFailed(URI uri, SocketAddress address, IOException failure);
}

具体对象类—-PacProxySelector:

./frameworks/base/core/java/android/net/PacProxySelector.java

关键代码:

public class PacProxySelector extends ProxySelector {

    ......
    private IProxyService mProxyService;
    private final List<Proxy> mDefaultList;
    ......
    @Override
    public List<Proxy> select(URI uri) {
        if (mProxyService == null) {
            mProxyService = IProxyService.Stub.asInterface(
                    ServiceManager.getService(PROXY_SERVICE));
        }
        if (mProxyService == null) {
            Log.e(TAG, "select: no proxy service return NO_PROXY");
            return Lists.newArrayList(java.net.Proxy.NO_PROXY);
        }
        String response = null;
        String urlString;
        try {
            urlString = uri.toURL().toString();
        } catch (MalformedURLException e) {
            urlString = uri.getHost();
        }
        try {
            response = mProxyService.resolvePacFile(uri.getHost(), urlString);
        } catch (Exception e) {
            Log.e(TAG, "Error resolving PAC File", e);
        }
        if (response == null) {
            return mDefaultList;
        }

        return parseResponse(response);
    }

    ......
    @Override
    public void connectFailed(URI uri, SocketAddress address, IOException failure) {

    }
    ......
}

代理类—-Proxy:

./frameworks/base/core/java/android/net/Proxy.java
public final class Proxy {
   ......
   private static final ProxySelector sDefaultProxySelector;
   ......
   public static final void setHttpProxySystemProperty(String host, String port, String exclList,
            Uri pacFileUrl) {
        ......
        if (!Uri.EMPTY.equals(pacFileUrl)) {
            ProxySelector.setDefault(new PacProxySelector());
        } else {
            ProxySelector.setDefault(sDefaultProxySelector);
        }
    }

}

android Proxy样例二

抽象对象类—Thread:

具体对象类—-ProxyServer:

./frameworks/base/packages/services/Proxy/src/com/android/proxyhandler/ProxyServer.java

关键代码:

public class ProxyServer extends Thread {
    ......
    @Override
    public void run() {
        try {
            serverSocket = new ServerSocket(0);

            setPort(serverSocket.getLocalPort());

            while (mIsRunning) {
                try {
                    Socket socket = serverSocket.accept();
                    // Only receive local connections.
                    if (socket.getInetAddress().isLoopbackAddress()) {
                        ProxyConnection parser = new ProxyConnection(socket);

                        threadExecutor.execute(parser);
                    } else {
                        socket.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } catch (SocketException e) {
            Log.e(TAG, "Failed to start proxy server", e);
        } catch (IOException e1) {
            Log.e(TAG, "Failed to start proxy server", e1);
        }

        mIsRunning = false;
    }

}

代理类—-ProxyService:

./frameworks/base/packages/services/Proxy/src/com/android/proxyhandler/ProxyService.java
public class ProxyService extends Service {

    private static ProxyServer server = null;
`
    @Override
    public void onCreate() {
        super.onCreate();
        if (server == null) {
            server = new ProxyServer();
            server.startServer();
        }
    }
......
}

参考资料

(1).设计模式之禅—第12章 代理模式

(2)代理模式

https://github.com/simple-android-framework/android_design_patterns_analysis/tree/master/proxy/singwhatiwanna

时间: 2024-08-05 07:07:45

设计模式之代理模式---Proxy Pattern的相关文章

二十三种设计模式[12] - 代理模式(Proxy Pattern)

前言 代理模式,属于对象结构型模式.在<设计模式 - 可复用的面向对象软件>一书中将之描述为" 为其它对象提供一种代理以控制对这个对象的访问 ". 在代理模式中,通常使用一个类来代表另一个类的功能,并由这个代理对象去控制原对象的引用. 结构 Subjuet(公共接口):代理类和被代理类的公共接口,保证任何使用目标的地方都可以被代理类替换: RealSubject(被代理类):代理类所代表的目标类: Proxy(代理类):包含对目标类的引用,目标类的封装: 场景 在日常生活中

设计模式 - 代理模式(proxy pattern) 未使用代理模式 详解

代理模式(proxy pattern) 未使用代理模式 详解 本文地址: http://blog.csdn.net/caroline_wendy 部分代码参考: http://blog.csdn.net/caroline_wendy/article/details/37698747 如果需要监控(monitor)类的某些状态, 则需要编写一个监控类, 并同过监控类进行监控. 但仅仅局限于本地, 如果需要远程监控, 则需要使用代理模式(proxy pattern). 具体方法: 1. 类中需要提供

设计模式三: 代理模式(Proxy) -- JDK的实现方式

设计模式三: 代理模式(Proxy) -- JDK的实现方式 简介 代理模式属于行为型模式的一种, 控制对其他对象的访问, 起到中介作用. 代理模式核心角色: 真实角色,代理角色; 按实现方式不同分为静态代理和动态代理两种; 意图 控制对其它对象的访问. 类图 实现 JDK自带了Proxy的实现, 下面我们先使用JDK的API来演示代理如何使用, 随后再探究Proxy的实现原理,并自己来实现Proxy. JDK代理类的使用: (InvocationHandler,Proxy) 使用JDK实现的代

设计模式之代理模式(Proxy)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

Android设计模式之代理模式 Proxy

一.概述 代理模式也是平时比较常用的设计模式之一,代理模式其实就是提供了一个新的对象,实现了对真实对象的操作,或成为真实对象的替身.在日常生活中也是很常见的.例如A要租房,为了省麻烦A会去找中介,中介会替代A去筛选房子,A坐享中介筛选的结果,并且交房租也是交给中介,这就是一个典型的日常生活中代理模式的应用.平时打开网页,最先开到的一般都是文字,而图片等一些大的资源都会延迟加载,这里也是使用了代理模式. 代理模式的组成: Abstract Subject:抽象主题-声明真实主题和代理主题共同的接口

大熊君说说JS与设计模式之------代理模式Proxy

一,总体概要 1,笔者浅谈 当我们浏览网页时,网页中的图片有时不会立即展示出来,这就是通过虚拟代理来替代了真实的图片,而代理存储了真实图片的路径和尺寸,这就是代理方式的一种. 代理模式是比较有用途的一种模式,而且变种较多(虚代理.远程代理.copy-on-write代理.保护代理.Cache代理.防火墙代理.同步代理.智能指引),应用场合覆盖从小结构到整个系统的大结构, 我们也许有代理服务器等概念,代理概念可以解释为:在出发点到目的地之间有一道中间层,意为代理. 代理对象角色内部含有对真实对象的

设计模式(结构型)之代理模式(Proxy Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之享元模式(Flyweight Pattern)>http://blog.csdn.net/yanbober/article/details/45477551 概述 代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难时可以通过一个

设计模式之(二)---代理模式Proxy Pattern

什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道 被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被 代理的人能干活呀. 比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,表现在程序上时这样的: 先定义一种类型的女人(接口): package com.fc.Proxy; public interface KindWoman { public void makeEyesWithMan(); //抛媚

代理模式(Proxy Pattern)

一.概述在软件开发中,有些对象由于创建成本高.访问时需要与其它进程交互等原因,直接访问会造成系统速度慢.复杂度增大等问题.这时可以使用代理模式,给系统增加一层间接层,通过间接层访问对象,从而达到隐藏系统复杂性.提高系统性能的目的.二.代理模式代理模式为其他对象提供一种代理以控制对这个对象的访问.其结构图如下: Subject定义了RealSubject和Proxy共用的接口,使得在任何使用RealSubject的地方都可以使用Proxy abstract class Subject { publ