设计模式(八)之静态代理模式

简介: 代理模式:为其他对象提供一种代理以控制对这个对象的访问。其通用设计图如下图所示:精髓是RealSubject类和Proxy类都实现Subject,使用Proxy类来限制对RealSubject类的访问

QQ图片20220424154831.jpg

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


其通用设计图如下图所示:精髓是RealSubject类和Proxy类都实现Subject,使用Proxy类来限制对RealSubject类的访问


QQ图片20220424154833.png


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


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


Proxy代理主题角色:也叫做委托类,代理类。它负责对真实角色的应用,将抽象类中定义的方法委托给真实角色实现,自己执行。


职责清晰:真实角色就是实现实际的业务逻辑,不用关心其他非本职的事物。


高扩展性:真实角色可以随时更换或扩展,只需要实现接口就行,而代理不需要有任何变化


借用大话设计模式中的例子,董卓让卢布帮忙追貂蝉(貂蝉不认识董卓),第一次让卢布送了一个娃娃,第二次让吕布送了一个花,第三次让吕布送了一件巧克力,貂蝉对吕布说:布,我们在一起吧。吕布说,这些东西是董卓让我送你的呀,貂蝉说:那又有什么关系呢,我喜欢的是你呀~他们两个就愉快地在一起了。


故事很狗血,但是董卓让吕布给貂蝉送礼物,就是一种代理。至于代理的结果,在代码中我们是可控的,人就不好说了。


不废话了,这个例子是用代理模式怎么实现呢?


1:代理接口ISeeker.cs


namespace Proxy
{
    /// <summary>
    /// 送礼物接口
    /// </summary>
    public interface ISeeker
    {
        void GiveDolls();
        void GiveFlowers();
        void GiveChocolate();
    }
}


2:追求者类 Suitor.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Proxy
{
    /// <summary>
    /// 追求者类
    /// </summary>
    public class Suitor:ISeeker
    {
        /// <summary>
        /// 定义一个被追求者的对象
        /// </summary>
        public Girl mm;
        /// <summary>
        /// 构造函数(传入被追求者类,这里主要用来获取被追求者的名字,或者直接传被追求者的名字也可以)
        /// </summary>
        /// <param name="mm"></param>
        public Suitor(Girl mm)
        {
            this.mm = mm;
        }
        /// <summary>
        /// 送娃娃
        /// </summary>
        public void GiveDolls()
        {
            Console.WriteLine(mm.name + ",送你的娃娃");
        }
        /// <summary>
        /// 送花
        /// </summary>
        public void GiveFlowers()
        {
            Console.WriteLine(mm.name + ",送你的花");
        }
        /// <summary>
        /// 送巧克力
        /// </summary>
        public void GiveChocolate()
        {
            Console.WriteLine(mm.name + ",送你的巧克力");
        }
    }
}


3:代理类:proxy.cs  实现送礼物接口


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Proxy
{
    /// <summary>
    /// 代理类:同样实现送礼物接口
    /// </summary>
    public class proxy:ISeeker
    {
        /// <summary>
        /// 定义一个追求者对象(精髓)
        /// </summary>
        public ISeeker lvbu;
        /// <summary>
        /// 构造函数(实例化一个追求者对象,但是这个对象用来代理追求者追姑娘)
        /// </summary>
        /// <param name="mm"></param>
        public proxy(Girl mm)
        {
            lvbu = new Suitor(mm);
        }
        public void GiveDolls()
        {
            lvbu.GiveDolls();
        }
        public void GiveFlowers()
        {
            lvbu.GiveFlowers();
        }
        public void GiveChocolate()
        {
            lvbu.GiveChocolate();
        }
    }
}


4:被追求者类:Gril.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Proxy
{
    /// <summary>
    /// 被追求者类   
    /// </summary>
    public class Girl
    {
        public string name;
        public Girl(string name)
        {
            this.name = name;
        }
    }
}


5:高层模块调用  program.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Proxy
{
    class Program
    {
        static void Main(string[] args)
        {
            // 实例化一个被追求者
            Girl mm = new Girl("饭饭");
            // 实例化一个代理对象
            proxy lvbu = new proxy(mm);
            // 代理对象送姑娘礼物
            lvbu.GiveDolls();
            lvbu.GiveFlowers();
            lvbu.GiveChocolate();
            Console.ReadKey();
        }
    }
}


实现效果如下图所示:


QQ图片20220424154837.png


以上我们就实现了简单的代理模式。


代理模式分两种,动态代理和静态代理。


我们上边实现的是静态代理,代理类是我们自己定义的。


动态代理,代理类的代码是动态生成的,这个相对来说难度要高一些,以后遇到再看。


静态代理总结:


优点:可以做到在符合开闭原则的情况下对目标对象进行功能扩展。


缺点:我们得为每一个服务都得创建代理类,工作量太大,不易管理。同时接口一旦发生改变,代理类也得相应修改。



目录
相关文章
|
7月前
|
设计模式 Java 数据库连接
【设计模式】【结构型模式】代理模式(Proxy)
一、入门 什么是代理模式? 代理模式(Proxy Pattern)是一种结构型设计模式,允许你提供一个代理对象来控制对另一个对象的访问。 代理对象在客户端和目标对象之间起到中介作用,可以在不改变目标对
187 10
|
11月前
|
设计模式 缓存 Java
「全网最细 + 实战源码案例」设计模式——代理模式
代理模式(Proxy Pattern)是一种结构型设计模式,通过代理对象控制对目标对象的访问并添加额外功能。它分为静态代理和动态代理,后者包括JDK动态代理和CGLIB动态代理。JDK动态代理基于接口反射生成代理类,而CGLIB通过继承目标类生成子类。代理模式适用于延迟初始化、访问控制、远程服务、日志记录和缓存等场景,优点是职责分离、符合开闭原则和提高安全性,缺点是增加系统复杂性。
265 25
|
设计模式 Java
Java一分钟之-设计模式:装饰器模式与代理模式
【5月更文挑战第17天】本文探讨了装饰器模式和代理模式,两者都是在不改变原有对象基础上添加新功能。装饰器模式用于动态扩展对象功能,但过度使用可能导致类数量过多;代理模式用于控制对象访问,可能引入额外性能开销。文中通过 Java 代码示例展示了两种模式的实现。理解并恰当运用这些模式能提升代码的可扩展性和可维护性。
183 1
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
|
12月前
|
设计模式 前端开发 数据安全/隐私保护
前端必须掌握的设计模式——代理模式
代理模式(Proxy Pattern)是一种结构型设计模式,通过引入“替身”对象来间接访问真实对象,从而解耦并提升性能和安全性。例如,知名艺人复出后,经纪人作为代理筛选商单,确保只处理符合团队利益的请求。代码实现中,定义接口`IService`,艺人和经纪人都实现该接口,经纪人在访问时进行过滤和转发。代理模式常用于权限控制、性能优化等场景,如前端中的Tree-shaking和ES6的Proxy构造方法。
前端必须掌握的设计模式——代理模式
|
设计模式 缓存 安全
设计模式——代理模式
静态代理、JDK动态代理、Cglib 代理
设计模式——代理模式
|
设计模式 缓存 Java
【十一】设计模式~~~结构型模式~~~代理模式(Java)
文章详细介绍了代理模式(Proxy Pattern),这是一种对象结构型模式,用于给对象提供一个代理以控制对它的访问。文中阐述了代理模式的动机、定义、结构、优点、缺点和适用环境,并探讨了远程代理、虚拟代理、保护代理等不同代理形式。通过一个商务信息查询系统的实例,展示了如何使用代理模式来增加身份验证和日志记录功能,同时保持客户端代码的无差别对待。此外,还讨论了代理模式在分布式技术和Spring AOP中的应用,以及动态代理的概念。
【十一】设计模式~~~结构型模式~~~代理模式(Java)
|
设计模式 Java 数据安全/隐私保护
Java设计模式-代理模式(7)
Java设计模式-代理模式(7)
118 2
|
设计模式
设计模式的基础问题之代理模式在工作中的问题如何解决
设计模式的基础问题之代理模式在工作中的问题如何解决
123 0
|
设计模式 算法 Go
iLogtail设计模式问题之代理模式在iLogtail中是如何应用的
iLogtail设计模式问题之代理模式在iLogtail中是如何应用的

热门文章

最新文章