设计模式(十二)代理

这篇具有很好参考价值的文章主要介绍了设计模式(十二)代理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、定义

给某一个对象提供一个代理或占位符,并由代理对象控制对原对象的访问。代理模式是一种结构型模式。

二、描述

代理模式的结构比较简单,其核心是代理类,为了让客户端能够一致性地对待真实对象和代理对象,在代理模式中引入了抽象层。包含以下三个角色:
设计模式(十二)代理
1、Subject(抽象主题角色):它声明真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题,客户端通常需要针对抽象主题角色进行编程。
2、Proxy(代理主题角色):它包含了对真实主题的引用,从而可以在任何时候操作真实主题对象;在代理主题角色中提供了一个与真实主题角色相同的接口,以便在任何时候都可以代替真实主题;代理主题角色还可以控制对真实主题的使用,负责在需要的时候创建和删除真实主题对象,并对真实主题对象的使用加以约束。通常,在代理主题角色中,客户端在调用所引用的真实主题操作之前或之后还需要执行其他操作,而不仅仅是单纯地调用真实主题对象中的操作。
3、RealSubject(真实主题角色):它定义了代理角色所代表的真实对象,在真实主题角色中实现了真实的业务操作,客户端可以通过代理主题角色间接调用真实主题角色中定义的操作。

三、例子

X公司公司承接了某信息咨询公司的收费商务信息查询系统的开发任务,该系统的基本需求如下:
(1)在进行商务信息查询之前用户需要通过身份验证,只有合法用户才能够使用该查询系统。
(2)在进行商务信息查询时,系统需要记录查询日志,以便根据查询次数收取查询费用。
X公司开发人员已经完成了商务信息查询模块的开发任务,他们希望能够以一种松耦合的方式向原有系统增加身份验证和日志记录功能,客户端代码可以无区别地对待原始的商务信息查询模块和增加新功能之后的商务信息查询模块,而且可能在将来还要在该信息查询模块中增加一些新的功能。
设计模式(十二)代理ISearcher:抽象查询接口,充当抽象主题类

public interface ISearcher
{
    string DoSearch(string userID, string keyword);
}

RealSearcher:具体查询器,充当真实主题类

public  class RealSearcher
{
    /// <summary>
    /// 模拟查询商务信息
    /// </summary>
    /// <returns></returns>
    public string DoSearch(string userID, string keyword)
    {
        Console.WriteLine("{0} 使用关键词 {1}", userID, keyword);
        return "返回具体内容";
    }
}

AccessValidator、Logger:身份验证类、日志记录类,业务类

public class AccessValidator
{
    /// <summary>
    /// 模拟实现登录验证
    /// </summary>
    /// <param name="userID"></param>
    /// <returns></returns>
    public bool Validate(string userID)
    {
        Console.WriteLine("在数据库中验证用户 {0} 是否是合法用户?", userID);
        if (userID.Equals("杨过", StringComparison.OrdinalIgnoreCase))
        {
            Console.WriteLine("{0} 登录成功!", userID);
            return true;
        }
        else
        {
            Console.WriteLine("{0} 登录失败!", userID);
            return false;
        }
    }
}

public class Logger
{
    /// <summary>
    /// 模拟实现日志记录
    /// </summary>
    /// <param name="userID"></param>
    public void Log(string userID)
    {
        Console.WriteLine("更新数据库,用户 {0} 查询次数加1!", userID);
    }
}

ProxySearcher:代理查询类,充当代理主题类

public class ProxySearcher : ISearcher
{
    private RealSearcher searcher = new RealSearcher(); // 维持一个对真实主题的引用
    private AccessValidator validator;
    private Logger logger;

    public string DoSearch(string userID, string keyword)
    {
        if (Validate(userID))
        {
            string result = searcher.DoSearch(userID, keyword);
            this.Log(userID);
            return result;
        }

        return null;
    }

    /// <summary>
    /// 创建访问验证对象并调用其Validate()方法进行身份验证
    /// </summary>
    /// <returns></returns>
    public bool Validate(string userID)
    {
        validator = new AccessValidator();
        return validator.Validate(userID);
    }

    /// <summary>
    /// 创建日志记录器并调用Log()方法实现日志记录
    /// </summary>
    /// <param name="userID"></param>
    public void Log(string userID)
    {
        logger = new Logger();
        logger.Log(userID);
    }
}

Program:客户端测试类

Searcher searcher = new ProxySearcher();
if (searcher != null)
{
    string result = searcher.DoSearch("杨过", "玉女心经");
}
Console.ReadLine();

设计模式(十二)代理

四、总结

1、优点

(1)代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
(2)客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性。

2、缺点

(1)由于这客户端的真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢,例如保护代理。
(2)实现代理模式需要额外的工作,而且有些代理模式的实现过程较为复杂,例如远程代理。文章来源地址https://www.toymoban.com/news/detail-746140.html

到了这里,关于设计模式(十二)代理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式之美-实战二:如何对接口鉴权这样一个功能开发做面向对象分析?

            面向对象的三个环节:面向对象分析(OOA)、面向对象设计(OOD)、面向对象编程(OOP)。只知道OOA、OOD、OOP只能说有一个宏观了解,我们更重要的还是要知道“如何做”,也就是,如何进行面向对象分析、设计与编程。         本文结合一个真实的开发案例,从基

    2024年02月09日
    浏览(46)
  • 软件设计模式系列之十二——外观模式

    在软件设计中,经常会遇到需要与复杂子系统进行交互的情况。为了简化客户端与子系统之间的交互,提高系统的可维护性和可用性,外观模式应运而生。外观模式(Facade Pattern)是一种结构型设计模式,它提供一个统一的界面,用于访问系统中的一组相关接口,从而隐藏了

    2024年02月08日
    浏览(41)
  • 软件工程(十二) 设计模式之创建型模式

    我们传统的23种设置模式如下 创建型模式:用于创建对象 工厂方法(Factory Method) 模式 抽象工厂(Abstract Factory) 模式 原型(Protptype) 模式 单例(Singleton) 模式 构建器模式 结构型模式:建立更大的结构 适配器(Adapter)模式 桥接(Bridge)模式 组合(Composite)模式 装饰(Decorator)模

    2024年02月11日
    浏览(40)
  • 软件设计模式系列之二十二——状态模式

    状态模式是一种行为型设计模式,它允许对象在内部状态发生改变时改变其行为,使得对象的行为看起来像是改变了其类。状态模式将对象的状态抽象成一个独立的类,让对象在不同状态下具有不同的行为,而且可以在运行时切换状态。这种方式使得状态的管理更加清晰,避

    2024年02月08日
    浏览(39)
  • 设计模式(二十二)模板方法

    定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类不改变一个算法的结构即可重定义该算法的特定步骤。模板方法是一种类行为型模式 模板方法模式结构比较简单,其核心是抽象类和其中的模板方法的设计,包含以下两个角色: 1、AbstractClas

    2024年01月22日
    浏览(34)
  • 设计模式(十二):结构型之享元模式

    设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二、三):创建型之工厂方法和抽象工厂模式 设计模式(四):创建型之原型模式 设计模式(五):创建型之建造者模式 设计模式(六):结构型之代理模式 设计模式(七):结构型之适配器模式 设计模式(八):结构型之装

    2024年02月08日
    浏览(55)
  • 设计模式十二:享元模式(Flyweight Pattern)

    当我们需要创建大量相似对象时,享元模式可以帮助我们节省内存空间和提高性能。该模式通过共享相同的数据来减少对象的数量。 在享元模式中,有两种类型的对象:享元(Flyweight)和非享元(Unshared Flyweight)。享元对象是可共享的,它包含内部状态和外部状态。内部状态

    2024年02月14日
    浏览(46)
  • 设计模式二十二:策略模式(Strategy Pattern)

    定义一系列算法,将每个算法封装成独立的对象,并使这些对象可互相替换。这使得在运行时可以动态地选择算法,而不必改变使用算法的客户端代码。策略模式的主要目标是将算法的定义与使用分离,使得客户端可以根据需要灵活地选择和切换不同的算法,而不影响到客户

    2024年02月11日
    浏览(39)
  • JAVA设计模式第十二讲:大厂实践 - 美团: 设计模式二三事

    设计模式是众多软件开发人员经过长时间的试错和应用总结出来的,解决特定问题的一系列方案。现行的部分教材在介绍设计模式时,有些会因为案例脱离实际应用场景而令人费解,有些又会因为场景简单而显得有些小题大做。本文是设计模式第十二讲,会结合在美团金融服

    2024年02月11日
    浏览(42)
  • 【设计模式】第十二章:观察者模式详解及应用案例

    【设计模式】七大设计原则 【设计模式】第一章:单例模式 【设计模式】第二章:工厂模式 【设计模式】第三章:建造者模式 【设计模式】第四章:原型模式 【设计模式】第五章:适配器模式 【设计模式】第六章:装饰器模式 【设计模式】第七章:代理模式 【设计模式

    2024年02月13日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包