前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#设计模式——(结构型-代理设计模式)

C#设计模式——(结构型-代理设计模式)

原创
作者头像
用户10053120
发布2022-10-11 16:32:58
3900
发布2022-10-11 16:32:58
举报
文章被收录于专栏:C# 设计原则

一、应用场景

替隔壁班的老万同学追自己班的女同学

二、代理设计模式定义

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

代码语言:javascript
复制
        public interface ISubject
        {
            void GiveSmoking();
            void GiveBea();
            void GiveJK();
        }
        public class ClassFlower
        {
            public string Name { set; get; }
        }
        public class ReadSubject:ISubject
        {
            public ClassFlower ClassFlower;
            public ReadSubject(ClassFlower classFlower)
            {
                this.ClassFlower = classFlower;
            }
            public void GiveBea()
            {
                Console.WriteLine(this.ClassFlower.Name+"同学,请你喝酒!");
            }

            public void GiveJK()
            {
                Console.WriteLine(this.ClassFlower.Name + "同学,请你穿JK!");
            }

            public void GiveSmoking()
            {
                Console.WriteLine(this.ClassFlower.Name + "同学,请你抽烟!");
            }
        }
        public class Proxy : ISubject
        {
            private ReadSubject readSubject;
            public Proxy(ReadSubject readSubject)
            {
                this.readSubject = readSubject;
            }
            public void GiveBea()
            {
                this.readSubject.GiveBea();
            }

            public void GiveJK()
            {
                this.readSubject.GiveJK();
            }

            public void GiveSmoking()
            {
                this.readSubject.GiveSmoking();
            }
        }
代码语言:javascript
复制
            ClassFlower classFlower = new ClassFlower();
            classFlower.Name = "韩梅梅";
            ISubject subject = new Proxy(new ReadSubject(classFlower));
            subject.GiveSmoking();
            subject.GiveBea();
            subject.GiveJK();

三、代理的分类

  • 安全代理, 用来控制真实对象的访问权限;

举例:有一个订单系统,要求是:一旦订单被创建,只有订单的创建人能修改订单中的数据,其他人不能修改;

相当于有一个订单对象,要控制外部对这个订单对象的访问权限,满足条件的可以访问,不满足的不能访问。

订单:订单产品名称、订单产品数量、订单创建用户。

  • 远程代理

为一个对象在不同的地址空间,提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实;

客户端调用web服务,会生成WebReference文件和文件夹,WebReference就是代理,使得客户端可以实现远程访问功能。

  • 虚拟代理

如果要创建开销很大的对象,可以通过代理来存放实例化需要很长时间的真实对象。

打开一个很大的网页,除了文字先出现外,图片和视频都是慢慢出现的。

查询某个部门下所有的员工信息,性别,姓名,年龄,毕业院校,部门,照片

安全代理设计模式的代码:

代码语言:javascript
复制
        //封装了实体对象和代理对象的公共接口
        public interface IOrder
        {
            //获取订单的产品名称
            string GetProductName();
            //设置订单中产品名称
            void SetProductName(string productName, string user);
            //获取订单中产品数量
            int GetOrderNumber();
            //设置订单中产品数量
            void SetOrderNumber(int count, string user);
            //获取创建订单的用户
            string GetOrderUser();
            //设置创建订单的用户
            void SetOrderUser(string orderUserName, string user);
        }
        //真正的订单类
        public class RealOrder : IOrder
        {
            //订单产品名称
            public string ProductName { get; set; }
            //订单产品数量
            public int ProductCount { get; set; }
            //订单创建用户
            public string OrderUser { get; set; }
            public RealOrder(string productName,int productCount,string orderUSer)
            {
                this.ProductName = productName;
                this.ProductCount = productCount;
                this.OrderUser = orderUSer;
            }
            public int GetOrderNumber()
            {
                return this.ProductCount;
            }

            public string GetOrderUser()
            {
                return this.OrderUser; 
            }

            public string GetProductName()
            {
                return this.ProductName ;
            }

            public void SetOrderNumber(int count, string user)
            {
                this.ProductCount = count ;
            }

            public void SetOrderUser(string orderUserName, string user)
            {
                this.OrderUser = orderUserName;
            }

            public void SetProductName(string productName, string user)
            {
                this.ProductName = productName ;
            }
        }
        //订单的代理
        public class ProxyOreder : IOrder
        {
            //封装一个实体对象的引用
            private RealOrder realOrder;
            public ProxyOreder(RealOrder realOrder)
            {
                this.realOrder = realOrder;
            }
            public int GetOrderNumber()
            {
                return this.realOrder.GetOrderNumber();
            }

            public string GetOrderUser()
            {
                return this.realOrder.GetOrderUser();
            }

            public string GetProductName()
            {
                return this.realOrder.GetProductName();
            }

            public void SetOrderNumber(int count, string user)
            {
                //对权限进行判断,有权限可以访问,没权限不能访问
                if (user!=null&&user.Equals(this.realOrder.OrderUser))
                {
                    this.realOrder.SetOrderNumber(count, user);
                }
                else
                {
                    Console.WriteLine("你无权修改订单数据");
                }

            }

            public void SetOrderUser(string orderUserName, string user)
            {
                //对权限进行判断,有权限可以访问,没权限不能访问
                if (user != null && user.Equals(this.realOrder.OrderUser))
                {
                    this.realOrder.SetOrderUser(orderUserName, user);
                }
                else
                {
                    Console.WriteLine("你无权修改订单数据");
                }
            }

            public void SetProductName(string productName, string user)
            {
                //对权限进行判断,有权限可以访问,没权限不能访问
                if (user != null && user.Equals(this.realOrder.OrderUser))
                {
                    this.realOrder.SetProductName(productName, user);
                }
                else
                {
                    Console.WriteLine("你无权修改订单数据");
                }
            }
        }
代码语言:javascript
复制
            IOrder order = new ProxyOreder(new RealOrder("笔记本电脑", 100, "张三"));
            order.SetOrderNumber(1000, "张三");
            Console.WriteLine(order.GetOrderNumber());

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档