C#设计模式之代理模式
代理模式
文章目录
- 代理模式
- 模式分类
- 模式产生得原因
- 模式灵感的来源
- 模式类图
- 代码实现
- 代理模式总结
- 代理模式的优点:
- 代理模式的缺点:
本篇博客将介绍代理模式,代理模式是常用的结构型设计模式之一,当用户无法直接访问某个对象或者访问某个对象存在困难时,可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,所访问的真实对象和代理对象会使用相同的接口。
模式分类
结构型设计模式。
模式产生得原因
在软件开发中,由于某些原因,我们不想或者不能直接访问一个对象,此时我们可以通过一个被称为代理的第三者来实现间接访问,这就是代理模式。代理对象在客户端和目标对象之间会起到中介的作用,他去掉客户不想看到的内容和服务或者增添客户需要的额外的新服务。
模式灵感的来源
近年来,代购已逐步成为电子商务的一个重要分支。代购就是找人帮忙购买所需要的商品,用户可能不能直接接触到所需要的商品,比如这个商品本地没有后者只有海外才有,或者说用户不想自己去买于是就呼叫代购来帮自己到某某某超市购买一些物品,这些都是代购,而这种用户不能或者不想直接购买商品的行为,就被抽象成了代理模式。
模式类图
由上图可知,代理模式分为3个对象:
Subject(抽象主题角色):
它声明了真实主题角色和代理主题角色的共同接口,这样客户端只需要根据抽象主题接口进行编程即可。
Proxy(代理主题角色):
代理主题角色包含一个对于真实主题角色的引用的维护,当客户端要调用一些方法时,代理主题角色将会调用真实主题角色中的同名方法。当然代理主题角色中是可以添加额外操作的。例如在保护代理中,代理角色就需要对访问真是主题的请求做甄别。
ConcreteSubject(真实主题角色):
它定义了代理角色所代表的真实对象,在真实对象中实现了真实的业务操作,客户端通过代理角色间接调用真实角色中的业务逻辑。
代码实现
例子:在一个论坛中已注册的用户和游客的权限不同,已注册的用户拥有发帖,修改自己的注册信息,修改自己帖子等功能,而游客只能查看别人发的帖子,没有其他权限,使用代理模式设计论坛的权限管理模块。
User用户基类:
namespace Proxy.Proxy.Question6
{public abstract class User{public string Name;public string Right;public User(string name, string right){Name = name;Right = right;}public abstract void Look();public virtual void Post(){}public virtual void ModifyContent(){}public virtual void ModifyInfo(){}}
}
IMember会员接口:
namespace Proxy.Proxy.Question6
{public interface IMember{void Post();void ModifyContent();void ModifyInfo();}
}
Proxy用户代理类:这里代理使用了虚拟代理的思想,延迟到使用时在创建真实的用户类,这里由于功能比较基础,所以就将逻辑都写在了代理类中,实际上应该将真实逻辑分摊在真实对象上。
using System;
using System.Diagnostics;namespace Proxy.Proxy.Question6
{public class Proxy : User{private User _user;private bool _isMember;public override void Look(){_user.Look();}public override void Post(){if (!_isMember){Console.WriteLine($"无权使用此功能");return;}_user.Post();Console.WriteLine($"{_user.Name}用户使用Post功能");}public override void ModifyContent(){if (!_isMember) {Console.WriteLine($"无权使用此功能");return;}_user.ModifyContent();Console.WriteLine($"{_user.Name}用户使用ModifyContent功能");}public override void ModifyInfo(){if (!_isMember) {Console.WriteLine($"无权使用此功能");return;}_user.ModifyInfo();Console.WriteLine($"{_user.Name}用户使用ModifyInfo功能");}public Proxy(string name, string right) : base(name, right){if (right.Equals("Member")){_user = new Member(name, right);_isMember = true;}else{_user = new Custom(name,right);}}}
}
Custom游客类:
namespace Proxy.Proxy.Question6
{public class Custom : User{public override void Look(){}public Custom(string name, string right) : base(name, right){}}
}
Member会员类:
namespace Proxy.Proxy.Question6
{public class Member : User, IMember{public override void Look(){}public override void Post(){}public override void ModifyContent(){}public override void ModifyInfo(){}public Member(string name, string right) : base(name, right){}}
}
代理模式总结
代理模式的优点:
- 代理模式能够协调调用者和被调用者,在一定程度上降低系统的耦合性。
- 客户端可以针对抽象主题角色进行编程,增加和更换代理类无需改变源代码,系统具有较好的灵活性和可拓展性。
代理模式的缺点:
- 由于在客户端和真实主题之间增加了代理角色,因此有些类型的代理模式可能会造成处理速度变慢。
- 实现代理模式需要额外的工作,而有些代理模式的实现过程较为复杂,比如远程代理。
C#设计模式之代理模式相关推荐
- 【设计模式】代理模式 ( 动态代理 | 模拟 Java 虚拟机生成对应的 代理对象 类 )
文章目录 前言 一.模拟 JVM 生成对应的 代理对象 二.模拟 JVM 生成对应的 代理对象 完整流程展示 1.目标对象接口 2.被代理对象 3.调用处理程序 4.模拟 JVM 生成的代理对象类 5 ...
- C++设计模式之代理模式
这篇文章主要介绍了C++设计模式之代理模式,本文讲解了什么是代理模式.代理模式的使用场合.代理模式的实现代码等内容,需要的朋友可以参考下 前言 青春总是那样,逝去了才开始回味:大学生活也是在不经意间就 ...
- python中代理模式分为几种_Python设计模式之代理模式实例详解
本文实例讲述了Python设计模式之代理模式.分享给大家供大家参考,具体如下: 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问 #!/usr/bin/env py ...
- 设计模式笔记——代理模式
设计模式笔记--代理模式 代理模式介绍 代理模式通常是介于请求方和提供方的一个中介系统,请求方是发送请求的一方,提供方是根据请求提供相应资源的一方 Web中的代理服务器就是一个例子,客户端向代理服务器 ...
- 「设计模式(五) - 代理模式」
「设计模式(五) - 代理模式」 一.处处可见的"代理" "代理"在平常生活司空见惯,点外卖,租房子找中介,买飞机票等等.基本上用手机就能完成,也就是不直接接触 ...
- Javascript 设计模式之代理模式【讲师辅导】-曾亮-专题视频课程
Javascript 设计模式之代理模式[讲师辅导]-969人已学习 课程介绍 随着 javascript ES6/7 的发布,很多老版本的设计模式的实现,今天来看是错误的,将被彻底. ...
- 设计模式之一代理模式
代理模式(代理设计模式) 代理模式的定义与特点 代理模式的结构与实现 代理模式(代理设计模式) 在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代 ...
- 23种设计模式7_代理模式之一静态代理
23种设计模式7_代理模式之一静态代理 1 基本介绍 代理模式:为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模 ...
- Java中的设计模式:“代理模式”的理解
代理模式定义: 为其他对象提供一种代理以控制对这个对象的访问.在面向对象中,有时候直接访问一些对象比较麻烦,所以代理模式就是在这个对象上加上一个访问该对象的访问层.类似于很多明星的事务实际都是交给经纪 ...
- 三国杀与设计模式之代理模式(Proxy)
本人原博地址:http://blog.saymagic.cn/blog.php?id=17 三国杀案例:在五人局中,作为反贼的黄月英借黄忠的刀杀作为忠臣的夏侯惇,从这句话中我们可以总结出一个成语对不对 ...
最新文章
- centos6.9安装Tomcat8.0.36
- Tkinter模块常用参数(python3)
- Python--Redis实战:第三章:Redis命令:第七节:其他命令
- 65个漂亮的WordPress博客主题
- Java读取HttpServletRequest的post数据流
- 解决GD中文乱码问题
- c语言递归汉诺塔次数,c语言递归解决汉诺塔参数变化的疑惑
- php 数组任意位置插入值
- Dxg——Bat批处理 开发笔记整理分类合集【所有的相关记录,都整理在此】
- DVWA high暴力破解
- maya镜头批渲染插件 v1.0.8 更新下载及教程
- 多个数的最小公倍数求法
- 如何提高BT的下载速度?
- 三方TabNavigator“斗艳”(Flex、JQuery UI和DoJo)
- 【CS231n】斯坦福大学李飞飞视觉识别课程笔记(六):线性分类笔记(上)
- Spring学习手记(二)——控制台调度任务
- 目标检测,FFmpeg中第一个基于深度学习模型的视频分析功能
- 手机怎么查看pe服务器信息,宏视监控手机版服务器
- 可以跟风不看好瑞幸,但真该相信浑水这份方法论偏差的报告吗?
- 力扣杯2023春-个人赛、战队赛
热门文章
- Elasticsearch分析器(analyzer)以及与spring boot整合
- 简历上的哪些内容才是 HR 眼中的干货?
- Java NIO 学习:通道(Channel)
- lol哪个服务器能玩无限火力,lol无线火力玩什么快乐?无限火力最快乐的英雄排行...
- 神马竞价账户基本结构?
- c# 通过反射获取类的属性和属性类型
- Centos7的yum安装报错Error: Nothing to do
- 我用kafka两年踩过的一些非比寻常的坑(宝贵经验)
- 获取订单状态_SAP刘梦_新浪博客
- 写给程序猿的把妹指南:概述篇