2012.12.16 学习日记-代理模式

本文介绍了代理模式,包括其定义、角色组成,并通过举例解释了代理模式在远程代理、虚拟代理、保护代理、缓冲代理和智能引用代理等场景的应用。重点讨论了在保护代理中的作用,即控制对对象的访问权限,确保只有特定用户能访问某些方法。同时,提到了将通过代理类实现权限控制的代码示例。
摘要由CSDN通过智能技术生成

本学期十五周快完了,大物考试,一步步逼近,临时抱佛脚中啊。上半学期的计算机科学基础考的太差,不过也对这种双语课程的开课模式不太认同,学校课程开设上连续性不大,让学生普遍迷茫,也更让我认识到学习技术还真得靠自学啊~诶,不扯多了,今天要学习的是代理模式,周末准备暂停学习新模式,复习学习的四个模式,每个模式再实践一下,毕竟写代码的能力还是太差委屈委屈


代理模式(Proxy Pattern)

定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理模式由三个角色组成:

1.虚拟角色类:通过接口或虚拟类声明真实角色中的业务方法

2.代理角色类:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。

3.真实角色类:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。


类图:



现实生活中,代购、通过代理去上脸书、推特,通过经销商买东西都可以看作是代理模式。而代理模式的应用非常多,比如下面这些:

(1) 远程代理(Remote Proxy):为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又称为大使(Ambassador)

(2) 虚拟代理(Virtual Proxy):如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。

(3) 保护代理(Protect Proxy):控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。

(4) 缓冲代理(Cache Proxy):为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。

(5) 智能引用代理(Smart Reference Proxy):当一个对象被引用时,提供一些额外的操作,例如将对象被调用的次数记录下来等。

(以上其实不是好理解.......)



实例一: 在一个论坛中已注册用户和游客的权限不同,已注册的用 户拥有发帖、修改自己的注册信息、修改自己的帖子等功 能;而游客只能看到别人发的帖子,没有其他权限。使用 代理模式来设计该权限管理模块。 在本实例中我们使用代理模式中的保护代理,该代理用于控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。

这里需要使用的是以上应用中的保护代理。代理类可以对用户访问权限进行控制,因此有些用户无法调动真实业务类的某些方法,当用户权限改变之后,则可以访问这些方法。


实现代码:

AbstractPermission.cs

 abstract class AbstractPermission
    {
        public abstract void modifyUserInfo();
        public abstract void viewNote();
        public abstract void publishiNote();
        public abstract void modifyNote();
        public abstract void setLevel(int level);
    }
RealPermission.cs

class RealPermission : AbstractPermission
    {
        public override void modifyUserInfo()
        {
            Console.WriteLine("修改个人信息");
        }
        public override void viewNote()
        {
        }
        public override void modifyNote()
        {
            Console.WriteLine("修改发贴内容!");
        }

        public override void publishiNote()
        {
            Console.WriteLine("发布新贴!");
        }

        public override void setLevel(int level)
        {
           
        }
    }
PermissionProxy.cs

class PermissionProxy : AbstractPermission
    {
        private RealPermission permission = new RealPermission();
        private int level = 0;

        public override void modifyUserInfo()
        {
            if (level == 0)
            {
                Console.WriteLine("对不起,你没有权限修改个人信息!");
            }
            else if (level == 1)
            {
                permission.modifyUserInfo();
            }
        }

        public override void viewNote()
        {
            Console.WriteLine("查看帖子!");
        }

        public override void publishiNote()
        {
            if (level == 0)
            {
                Console.WriteLine("对不起,你没有权限发布新贴!");
            }
            else if (level == 1)
            {
                permission.publishiNote();
            }
        }

        public override void modifyNote()
        {
            if (level == 0)
            {
                Console.WriteLine("对不起,你没有权限修改帖子内容!");
            }
            else if (level == 1)
            {
                permission.modifyNote();
            }
        }

        public override void setLevel(int level)
        {
            this.level = level;
        }
    }
Program.cs

class Program
    {
        static void Main(string[] args)
        {
            PermissionProxy proxy = new PermissionProxy();
            proxy.viewNote();
            proxy.publishiNote();
            proxy.modifyNote();
            proxy.modifyUserInfo();
            Console.WriteLine("-----------------------------------------");
            proxy.setLevel(1);
            proxy.viewNote();
            proxy.publishiNote();
            proxy.modifyNote();
            proxy.modifyUserInfo();

            Console.ReadKey();
        }
    }

代理模式在一定程度上降低了系统的耦合度, 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值