(超详细,超易懂)设计模式(十三):代理模式,悟空与观音的关系

如果你也喜欢C#开发或者.NET开发,可以关注我,我会一直更新相关内容,并且会是超级详细的教程,只要你有耐心,基本上不会有什么问题,如果有不懂的,也可以私信我加我联系方式,我将毫无保留的将我的经验和技术分享给你,不为其他,只为有更多的人进度代码的世界,而进入代码的世界,最快捷和最容易的就是C#.NET,准备好了,就随我加入代码的世界吧!

一、简介

        代理模式是一种结构型设计模式,它允许通过创建一个代理对象来控制对原始对象的访问。代理对象充当了客户端和原始对象之间的中介,并可以在访问原始对象之前或之后执行一些额外的操作。

        代理模式的主要目的是实现对原始对象的控制,可以用于控制对对象的访问权限、实现延迟加载、提供缓存机制等。代理模式可以分为静态代理和动态代理两种。

        静态代理是指在编译时已经确定代理对象和被代理对象的关系,代理对象和被代理对象都必须实现相同的接口或继承相同的抽象类。

        动态代理是指在运行时动态生成代理对象,不需要提前指定被代理对象的具体类型。动态代理可以使用Java的反射机制来实现,在运行时生成代理类并将方法调用转发给被代理对象。

二、为什么要学习代理模式

        2.1 隐藏真实对象

        代理模式可以隐藏真实对象的实现细节,客户端只需要与代理对象进行交互,而无需直接与真实对象交互。这样可以提高系统的安全性,减少外部对真实对象的直接访问,同时也可以保护真实对象的重要属性和方法。

        2.2 延迟加载

        代理模式可以延迟加载真实对象,只有在需要时才创建和初始化真实对象。这可以提高系统的性能,减少不必要的资源消耗。

        2.3 控制访问权限

        代理模式可以控制客户端对真实对象的访问权限。例如,可以通过代理对象添加额外的验证逻辑,只允许特定的客户端访问真实对象。

        2.4 缓存数据

        代理模式可以缓存真实对象的数据,以提高系统的性能。例如,可以通过在代理对象中缓存一些常用的数据,避免频繁从真实对象中获取数据。

        2.5 远程访问

        代理模式可以通过网络或其他方式实现远程访问真实对象。例如,可以通过代理对象将客户端的请求发送到远程服务器上的真实对象进行处理。

三、代理模式在项目中有哪些实际应用

        3.1 远程代理

        远程代理允许客户端通过网络间接访问远程对象。这在分布式系统和云计算环境中非常常见。

        3.2 虚拟代理

        虚拟代理用于延迟加载对象,即当需要对象时,通过代理创建并加载对象。

        3.3 安全代理

        安全代理用于控制对敏感资源的访问。代理可以验证调用者的权限,并决定是否允许对资源的访问。

        3.4 缓存代理

        缓存代理用于缓存对象的数据,以提高性能。当客户端请求对象数据时,代理首先检查缓存中是否存在数据,如果存在则直接返回,否则从目标对象中获取数据并缓存。

        3.5 日志记录代理

        日志记录代理用于记录对象的操作日志。代理可以在调用目标对象之前或之后记录各种信息,例如时间戳、参数值等。

        3.6 智能代理

        智能代理在调用目标对象之前或之后执行额外的逻辑。例如,代理可以在调用目标对象之前验证输入参数的有效性,并在调用之后执行其他操作。

四、代理模式在代码中的实现与讲解

        观音菩萨扮演了悟空的代理,她派遣悟空保护唐僧取经,代表佛祖来完成任务。观音菩萨作为悟空与佛祖之间的中间人,传达佛祖的意图,代表佛祖管理和指导悟空的行动。

        以下是使用C#代理模式实现悟空与观音的关系例子的代码:

using System;

// 定义一个接口,表示悟空和观音都需要实现的方法
public interface ISubject
{
    void DoAction();
}

// 实现接口的具体类,这里分别是悟空和观音
public class MonkeyKing : ISubject
{
    public void DoAction()
    {
        Console.WriteLine("悟空正在保护唐僧取经...");
    }
}

public class Guanyin : ISubject
{
    private MonkeyKing monkeyKing; // 观音代理的悟空

    public void DoAction()
    {
        if (monkeyKing == null)
        {
            monkeyKing = new MonkeyKing(); // 观音生成悟空的实例
        }

        BeforeAction(); // 执行悟空行动前的操作
        monkeyKing.DoAction(); // 通过悟空实例执行行动
        AfterAction(); // 执行悟空行动后的操作
    }

    private void BeforeAction()
    {
        Console.WriteLine("观音菩萨传达佛祖的意图给悟空...");
    }

    private void AfterAction()
    {
        Console.WriteLine("悟空保护唐僧取经完成,观音菩萨接收到结果并汇报给佛祖...");
    }
}

// 测试代码
class Program
{
    static void Main(string[] args)
    {
        Guanyin guanyin = new Guanyin();
        guanyin.DoAction();
    }
}

        上述代码中,我们定义了一个接口ISubject,其中有一个DoAction方法,表示悟空和观音都需要实现的行动。MonkeyKing类实现了ISubject接口,表示悟空,其中的DoAction方法表示悟空保护唐僧取经的行动。Guanyin类也实现了ISubject接口,表示观音,其中包含了一个MonkeyKing类型的私有成员变量monkeyKing,表示观音代理的悟空实例。在DoAction方法中,我们首先判断monkeyKing是否为空,如果为空,则生成悟空实例,并在执行悟空行动前后分别执行一些操作。在Main方法中,我们创建了Guanyin实例guanyin并调用了DoAction方法,从而实现了观音代理悟空的过程。

        这个例子中,通过观音代理悟空的方式,展示了代理模式的应用。观音代表佛祖来指导悟空的行动,并在执行前后进行一些操作,确保唐僧的安全和顺利取经。

五、代理模式需要注意的地方

        5.1 授权控制

        代理模式常用于授权场景,需要确保代理对象具备执行真实对象所需要的权限。在设计代理模式时,需要考虑并实现适当的授权控制机制,以确保代理对象的合法操作。

        5.2 真实对象的复用

        代理模式通常会包含一个真实对象,代理对象通过调用真实对象的方法来实现功能。在使用代理模式时,可以考虑如何更好地复用真实对象,以避免创建过多的真实对象实例。

        5.3 透明性

        代理模式通常会隐藏真实对象的实现细节,使得客户端无需关心真实对象的具体实现。在实现代理模式时,需要注意保持透明性,确保代理对象与真实对象的接口一致,并提供相同的功能。

        5.4 性能影响

        代理模式的引入可能会对系统性能产生一定的影响,特别是在代理对象需要执行一些开销较大的操作时。在使用代理模式时,需要进行性能评估,并确保代理对象的性能与需求相匹配。

        5.5 生命周期管理

        代理对象通常会与真实对象有一定的生命周期关联,需要确保代理对象的创建和销毁时机与真实对象的一致。在实现代理模式时,需要考虑代理对象的生命周期管理,并确保在真实对象不再需要时及时销毁代理对象。

  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值