十七、代理设计模式

1. 代理设计模式介绍

代理设计模式,从名字中我们就能知道其大致意思。我们生活中有很多“代理”,比如,租房中介,海外代购等。就是一种本来需要A做的事,让B去代做。

定义:

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

2. 代理设计模式使用场景

  • 当我们无法直接访问某一个对象时,可以通过一个代理对象间接访问。通常委托对象和代理对象有着相同的接口。
  • (1)、远程代理,为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
  • (2)、虚拟代理,是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。
  • (3)、安全代理,用来控制真实对象访问时的权限。
  • (4)、智能引用,当调用真实对象时,代理处理另外一些事。

3. 代理设计模式UML类图

角色介绍:

  • Subject: 抽象主题类,该类的主要职责是声明真实主题与代理的共同接口方法,该类既可以是一个抽象类,也可以是一个接口。
  • RealSubject:真实主题,该类定义类代理所表示的真实对象,由其执行具体的业务逻辑方法。
  • ProxySubject: 代理类,该类持有一个对真实主题的引用,在其所实现的接口方法中调用真实主题对应接口中的方法。
  • Client:测试类

4. 代理设计模式简单实现

  • (1)、抽象主题类:
public interface Subject {
    void visit();
}

抽象主题类中,只有一个visit()方法,代理对象和被代理代理对象均要实现这个方法。

  • (2)、真实主题:
public class RealSubject implements Subject {
    @Override
    public void visit() {
        System.out.println("Real Subject");
    }
}

真实对象中,继承自抽象主题类,在visit()方法中,实现具体逻辑。

  • (3)、代理主题:
public class ProxySubject implements Subject {
    private RealSubject mSubject;

    public ProxySubject(RealSubject mSubject) {
        this.mSubject = mSubject;
    }

    @Override
    public void visit() {
        //通过真实主题引用的对象调用真实主题中的逻辑方法
        mSubject.visit();
    }
}

ProxySubject代理类中有一个真实主题类的引用,同时代理主题类继承了和真实主题类一模一样的抽象类,实现了同样的方法。只不过在代理类中,visit()方法调用了真实主题类的visit()方法。

  • (4)、测试类:
public class Client {

    public static void main(String[] args) {
        //构建一个真实的主题对象
        RealSubject realSubject = new RealSubject();

        //通过一个真实的主题对象构造一个代理对象
        ProxySubject proxySubject = new ProxySubject(realSubject);

        //调用代理的相关方法
        proxySubject.visit();
    }
}

以上模式叫做静态代理,还有一种叫做动态代理模式。

静态代理模式就如上述所示,我们的代码在运行前类的class编译文件就已经存在;而动态代理类则与静态代理类相反,通过反射机制动态地生成代理者对象,代理对象将会在执行阶段执行。

方法如下:我们声明一个动态代理类:

public class DynamicProxy implements InvocationHandler {
    private Object object;//被代理对象的引用

    public DynamicProxy(Object object) {
        this.object = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(object, args);
        return result;
    }
}

在上述代码中,我们实现了动态代理接口InvocationHandler,这是java为我们提供的,我们只需要重写其调用方法invoke即可。

在以上代码中,我们声明了一个Object的引用,该引用将指向被代理类,而我们在invoke方法中调用具体的被代理方法,也就是真实方法。

接着我们修改Client类方法如下:

public class Client {

    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        //构造一个动态代理对象
        DynamicProxy dynamicProxy = new DynamicProxy(realSubject);
        //类加载器
        ClassLoader classLoader = dynamicProxy.getClass().getClassLoader();
        Subject subject = (Subject) Proxy.newProxyInstance(classLoader, new Class[]{Subject.class}, dynamicProxy);

        //调用代理对象的visit方法。
        subject.visit();
    }
}

5. 总结

  • 代理设计模式应用比较广泛,缺点较少。
时间: 2024-08-17 22:37:36

十七、代理设计模式的相关文章

代理设计模式

1. 什么是设计模式 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.毫无疑问,设计模式于己于他人于系统都是多赢的:设计模式使代码编制真正工程化:设计模式是软件工程的基石脉络,如同大厦的结构一样. 什么是代理设计模式 生活中大家一定遇到这样的情况了:比如说我要买一包纸,不妨就是心相印的吧,那一般人的话我应该不是去心相印的工厂里面直接去买吧,而是我们在心相印专卖店或者什

UI开发----target/action设计模式和代理设计模式以及手势识别器

//  Created By 郭仔  2015年04月16日21:50:33 眼睛有点痛,视力也在急速下降,心灵之窗,注意保护! ================================================ 耦合是衡量?一个程序写的好坏的标准之?一, 耦合是衡量模块与模块之间关联程度的指标 "?高内聚,低耦合"是?面向对象编程的核⼼心思想: ================ 设计模式思想很重要的 ================== target/action设计模

你真的了解iOS代理设计模式吗?

OS中消息传递方式 在iOS中有很多种消息传递方式,这里先简单介绍一下各种消息传递方式. 通知:在iOS中由通知中心进行消息接收和消息广播,是一种一对多的消息传递方式. 代理:是一种通用的设计模式,iOS中对代理支持的很好,由代理对象.委托者.协议三部分组成. block:iOS4.0中引入的一种回调方法,可以将回调处理代码直接写在block代码块中,看起来逻辑清晰代码整齐. target action:通过将对象传递到另一个类中,在另一个类中将该对象当做target的方式,来调用该对象方法,从

开发进阶11_代理设计模式_键盘的简单处理

代理设计模式: 1.使用场合 -> A想让B帮忙做一些事情,就让B成为A的代理 ->A想通知一下B发生了某些事情,或者想传递一些数据给B,就让B成为A的代理 ->B想监听A所做的一些事情,就让B成为A的代理 2.使用步骤 ->定义一份协议 ->B要遵守协议,实现相应的方法 ->A中要定义一个代理属性,id<协议> delegate ->创建B对象,设置A的delegate属性为B对象 键盘的简单处理: TextField:keyborad type属性

Objectvie - c代理设计模式

代理(delegate) 也称为委托,事情发生后,自己不处理,让别人来处理. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 代理设计模式的角色: 1.抽象角色:声明真实对象和代理对象的共同接口:再这里是协议protocol 2.代理角色:代理对象角色内容含有对真是对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以 便在任何时刻都能代替真实对象,同时代理对象可以再执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装. 3.真实角色:代理角色所代表的

IOS之Objective-C学习 代理设计模式

鉴于Objective-C是不支持多继承的,所以需要用协议来代替实现其他类的方法,所以有了代理设计模式. 代理,又称委托,delegation. 代理模式可以让一个单继承的类实现父类以外其他类的方法.代理也可以用于传值. 我们先来说说原理,最后再看看是如何传值的. 如图选取Objective-C File并选择Protocol创建文件后在该协议文件中写入方法. myProtocol.h @protocol myDelegation <NSObject> -(void)method1; -(vo

2016.01.13 代理设计模式

这几天都在用代码的形式在完成滑动解锁的功能,今天讲到了代理设计模式. ?代理设计模式 首先,设计模式是什么:一种完成特定功能的方式. 类别Category:给已有的类添加方法. 代理Delegate:1.配置 2.两个对象之间传递数据A(B) B-->A(A完成B的方法,但是B要将结果回调给A) 所有的设计模式都有一个固定的规范,所以代理设计模式也不例外: UnlockModel(功能类): 1.写一套代理(协议) 代理的方法就是回调的方式 @property TextSettingDelega

Proxy Design Pattern 代理设计模式

代理设计模式,这个模式很多用于服务器客户端之类的,上网也经常使用代理之类的,想起来感觉是很复杂的,不过这个设计模式本身是很简单的. 就是一个类调用另外一个类的函数,客户调用的是一个类,而实际的工作是由另外一个类做的. 体现这个设计模式的代码: #include <stdio.h> class RealObj { public: virtual void handleReq() = 0; }; class DoSomething : public RealObj { public: void h

ios代理设计模式

代理设计模式的作用:     1.A对象监听B对象的一些行为,A成为B的代理     2.B对象想告诉A对象一些事情,A成为B的代理   代理设计模式的总结:     如果你想监听别人的一些行为,那么你就要成为别人的代理     如果你想告诉别人一些事情,那么就让别人成为你的代理         代理设计模式的开发步骤     1.拟一份协议(协议名字的格式:控件名 + Delegate),在协议里面声明一些代理方法(一般代理方法都是@optional)     2.声明一个代理属性:@prop