• 代理模式


    代理模式的定义

    代理模式(Proxy Pattern)是一个使用率非常高的模式,其定义如下:

    Provide a surrogate or placeholder for another object to control access to it.(为其他对象提供

    一种代理以控制对这个对象的访问。)

    代理模式也叫做委托模式,它是一项基本设计技巧。许多其他的模式,如状态模式、策

    略模式、访问者模式本质上是在更特殊的场合采用了委托模式,而且在日常的应用中,代理

    模式可以提供非常好的访问控制。

    ● Subject抽象主题角色

    抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求。

    ● RealSubject具体主题角色

    也叫做被委托角色、被代理角色。它才是冤大头,是业务逻辑的具体执行者。

    ● Proxy代理主题角色

    也叫做委托类、代理类。它负责对真实角色的应用,把所有抽象主题类定义的方法限制

    委托给真实主题角色实现,并且在真实主题角色处理完毕前后做预处理和善后处理工作。

    我们首先来看Subject抽象主题类的通用源码

     抽象主题类

    public interface Subject {

         //定义一个方法

         public void request();

    }

    在接口中我们定义了一个方法request来作为方法的代表,RealSubject对它进行实现

     真实主题类

    public class RealSubject implements Subject {

         //实现方法

         public void request() {

                 //业务逻辑处理

         }

    }

    RealSubject是一个正常的业务实现类,代理模式的核心就在代理类上,

    代理类

    public class Proxy implements Subject {

         //要代理哪个实现类

         private Subject subject = null;    

         //默认被代理者

         public Proxy(){

                 this.subject = new Proxy();

         }

         //通过构造函数传递代理者

         public Proxy(Object...objects ){

        }

         //实现接口中定义的方法

         public void request() {

                 this.before();

                 this.subject.request();

                 this.after();

         }

         //预处理

         private void before(){

                 //do something

         }

         //善后处理

         private void after(){

                 //do something

         }

    }

    一个代理类可以代理多个被委托者或被代理者,因此一个代理类具体代理哪个真实主题

    角色,是由场景类决定的。当然,最简单的情况就是一个主题类和一个代理类,这是最简洁

    的代理模式。在通常情况下,一个接口只需要一个代理类就可以了,具体代理哪个实现类由

    高层模块来决定,也就是在代理类的构造函数中传递被代理者

    代理的构造函数

    public Proxy(Subject _subject){

         this.subject = _subject;

    }

    代理模式的优点

    ● 职责清晰

    真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理

    完成一件事务,附带的结果就是编程简洁清晰。

    ● 高扩展性

    具体主题角色是随时都会发生变化的,只要它实现了接口,甭管它如何变化,都逃不脱

    如来佛的手掌(接口),那我们的代理类完全就可以在不做任何修改的情况下使用。

    ● 智能化

    代理模式的扩展

     普通代理

    在网络上代理服务器设置分为透明代理和普通代理,是什么意思呢?透明代理就是用户

    不用设置代理服务器地址,就可以直接访问,也就是说代理服务器对用户来说是透明的,不

    用知道它存在的;普通代理则是需要用户自己设置代理服务器的IP地址,用户必须知道代理

    的存在。我们设计模式中的普通代理和强制代理也是类似的一种结构,普通代理就是我们要

    知道代理的存在,也就是类似的GamePlayerProxy这个类的存在,然后才能访问;强制代理则

    是调用者直接调用真实角色,而不用关心代理是否存在,其代理的产生是由真实角色决定

    强制代理

    强制代理在设计模式中比较另类,为什么这么说呢?一般的思维都是通过代理找到真实

    的角色,但是强制代理却是要“强制”,你必须通过真实角色查找到代理角色,否则你不能访

    问。甭管你是通过代理类还是通过直接new一个主题角色类,都不能访问,只有通过真实角

    色指定的代理类才可以访问,也就是说由真实角色管理代理角色。这么说吧,高层模块new

    了一个真实角色的对象,返回的却是代理角色

    代理是有个性的

    一个类可以实现多个接口,完成不同任务的整合。也就是说代理类不仅仅可以实现主题

    接口,也可以实现其他接口完成不同的任务,而且代理的目的是在目标对象方法的基础上作

    增强,这种增强的本质通常就是对目标对象的方法进行拦截和过滤。

    动态代理

    动态代理是在实现阶段不用关心代理谁,而在运行阶段

    才指定代理哪一个对象。

    现在有一个非常流行的名称叫做面向横切面编程,也就是AOP(Aspect

    Oriented Programming),其核心就是采用了动态代理机制

    动态代理实现代理的职责,业务逻辑Subject实现相关的

    逻辑功能,两者之间没有必然的相互耦合的关系。通知Advice从另一个切面切入,最终在高

    层模块也就是Client进行耦合,完成逻辑的封装任务。

  • 相关阅读:
    delphi shr和shl的作用
    delphi socket 编程 使用多线程
    mysql 移除服务,并在cmd下切换目录
    delphi 结构体和TList的用法
    delphi 使用工控机控件 iThreadTimes 出现问题, 导致主程序创建页面的时候, 阻塞消息, 不能正常执行。
    Unicode 和 UTF-8 的区别
    Python 模块 re (Regular Expression)
    Python的函数式编程
    反向解析与PTR(Pointer Record)
    simhash算法
  • 原文地址:https://www.cnblogs.com/future-zmy/p/6254453.html
Copyright © 2020-2023  润新知