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 三国杀案例:在五人局中,作为反贼的黄月英借黄忠的刀杀作为忠臣的夏侯惇,从这句话中我们可以总结出一个成语对不对 ...
最新文章
- 使用Nucleus SE实时操作系统
- android Java BASE64编码和解码一:基础
- python --- 基础多线程编程
- EasyUI 1.3.6 行号显示不全
- Spring Cloud【Finchley】-12使用Hystrix Dashboard实现Hystrix数据的可视化监控
- SAP CRM呼叫中心里的Java stack
- java程序员招聘现场
- JAVA自学笔记25
- php的ob_flush和flush(转)
- 《TensorFlow 2.0深度学习算法实战教材》学习笔记(一、人工智能绪论)
- 最短路径Dijkstra算法(邻接矩阵)
- matlab 概率论,matlab.概率论.doc
- 在汇编语言调用c语言程序,C/C++调用汇编语言实例:目录表程序
- html简介百度百科,outerHTML
- php后缀名的mime类型_PHP实现获取文件mime类型多种方法解析
- QCA6174A方案PCI-E接口双频蓝牙WiFi二合一模块8274B-PR
- GateWay 网关服务
- linux shrink dev sd,Virt相关命令(转)
- 排球比赛计分程序的典型用户和场景
- Redis源码-String:Redis String命令、Redis String存储原理、Redis String三种编码类型、Redis字符串SDS源码解析、Redis String应用场景
热门文章
- Java学习-7.复用类
- 智能家居Homekit解决方案
- Ubuntu 系统中网络总是断掉重新连接
- c语言限制字符串长度范围,字符串长度C语言版
- c语言tab什么意思_我的C语言入门笔记~!
- 【历史上的今天】7 月 20 日:人类登上月球;数据仓库之父诞生;Mac OS X Lion 发布
- rust月球服务器名字_月亮的十大未解之谜
- Git操作失败提示fatal: Unable to create 'E:/GitDemos/todolist/.git/index.lock': File exists...
- aws部署web_运营酿酒厂解释了Amazon Web Services(AWS)
- 一文看懂BDTC 2018:探秘大数据新应用(附PPT下载)