c#设计模式之代理模式(Proxy Pattern)
引言
代理这个词语,大家在现实世界已经频繁的接触过,例如火车站代理售票点,因为这些代理售票点的存在,我们不必要去火车站的售票处就可以查询或者取到火车票.代理点本身是没有能力生产车票的,我们在代理处享受到的其实就是火车站售票处的服务,同时我们还能够在代理点享受到火车站售票处没有的服务,例如代理点有个自动售货机,我们还能够享受到购物的服务.这就是代理的优势所在
在设计模式中也有那么一种模式,与代理这个定义紧密相连,下面我将以最简洁的代码展示它
/// <summary>
/// 业务抽象
/// </summary>
public interface ISubject
{
void GetTicket();
}
业务抽象
/// <summary>
/// 真正的逻辑对象
/// </summary>
public class RealSubject : ISubject
{
public void GetTicket()
{
Console.WriteLine(".....取票动作.....");
}
}
真实业务
/// <summary>
/// 真正业务对象的代理
/// </summary>
class ProxySubject:ISubject
{
private static ISubject _subject = null; void ProxySubject_Init()
{
if (_subject == null)
{
_subject = new RealSubject();
}
} public void GetTicket()
{
if (_subject == null)
{
ProxySubject_Init();
}
//AOP:日志,缓存,权限,延迟,异常
_subject.GetTicket();
}
}
代理业务
class Program
{
static void Main(string[] args)
{
var proxy = new ProxySubject();
proxy.GetTicket();
Console.ReadKey();
}
}
打印
观察上述代码我们发现它有以下特点
1上端调用的不是真实的业务对象,而是它的一个代理,真实的业务逻辑被隔离
2在代理之内,我们还能额外的定义其他的逻辑,而不影响真实的业务逻辑
这就是一个代理模式
当我们不想或不能直接调用一个业务逻辑对象,我们可以在它之上添加一个代理, 用来屏蔽具体的业务逻辑或者增加额外的业务
代理模式
因为代理本身就是一个比较简洁的思想,所以代理模式的类图也比较简单,如下:
代理模式中有三种角色:
主题的抽象角色(ISubject):真实主题和代理主题的抽象
真实的主题角色(RealSubject):真实主题,提供最根本的业务逻辑
主题的代理角色(ProxySubject):真实主题的代理,能够引用真实主题,同时添加一些额外的功能
注意:提供业务逻辑的是真实主题,而不是代理,代理只是起到引用的作用,同时可以增加一些额外的功能
相交装饰器模式
在设计模式里面,有一种设计模式叫做装饰器模式,它能够动态的为对象添加功能,
如果对这两种模式都有所了解的话,会发现他们其实有很多共同之处,同样都是具体对象与辅助对象依赖抽象的方式
例如,我们想为对象添加一个日志的功能:我们既可以选择为它添加一个代理来实现,也可以选择添加一个装饰器来实现,这个时候我们可能会迷惑,添加的到底是代理还是装饰器
对于它们的区别,从他们出发的场景来比较是最好的,从出发场景来看,装饰器模式注重的是对原有对象功能的扩展,而代理模式注重的是对原有对象的控制或屏蔽,个人觉得这是他们最大的区别
适用场景
当我们不想或不能直接调用一个业务逻辑对象,我们可以在它之上添加一个代理, 用来屏蔽具体的业务逻辑或者增加额外的业务
优点:
1降低了系统的耦合度,这是设计模式比较共通的优点;
2能够屏蔽真实的业务逻辑,同时还能额外增加功能
缺点
使用了代理模式,需要增加代理类,必然会增加系统的复杂程度
出自:博客园-半路独行
原文地址:https://www.cnblogs.com/banluduxing/p/9267705.html
本文出自于http://www.cnblogs.com/banluduxing 转载请注明出处。
c#设计模式之代理模式(Proxy Pattern)的更多相关文章
- 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)
原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...
- 二十四种设计模式:代理模式(Proxy Pattern)
代理模式(Proxy Pattern) 介绍为其他对象提供一个代理以控制对这个对象的访问. 示例有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对 ...
- 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)【转】
介绍 为其他对象提供一个代理以控制对这个对象的访问. 示例 有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对象的访问. MessageModel ...
- 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 设计模式 - 代理模式(proxy pattern) 未使用代理模式 具体解释
代理模式(proxy pattern) 未使用代理模式 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 部分代码參考: http://blog.csdn. ...
- 代理模式(Proxy pattern)
代理模式(proxy pattern):作用:为其他对象提供一种代理,以控制对这个对象的访问.代理对象在客户端对象和目标对象之间起中介的作用. 代理模式涉及到的角色: 抽象角色:声明真实对象和代理对象 ...
- 设计模式——代理模式(Proxy Pattern)
代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. UML图: 模型设计: Subject类: package com.cnblog.clarck; /** * Subject 类 ...
- 13.代理模式(Proxy Pattern)
using System; namespace Test { //抽象角色:声明真实对象和代理对象的共同接口. //代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象, //同时代理 ...
- 大熊君说说JS与设计模式之------代理模式Proxy
一,总体概要 1,笔者浅谈 当我们浏览网页时,网页中的图片有时不会立即展示出来,这就是通过虚拟代理来替代了真实的图片,而代理存储了真实图片的路径和尺寸,这就是代理方式的一种. 代理模式是比较有用途的一 ...
随机推荐
- django-渲染页面+locals
from django.shortcuts import render, redirect from django.views import View from django.http import ...
- 运维基础工具tmux介绍及使用
一.tmux是干什么的? 百度百科的解释很到位:tmux是指通过一个终端登录远程主机并运行后,在其中可以开启多个控制台的终端复用软件. 说白了就是复用软件,复用的什么软件呢? 你可以理解成复用shel ...
- centos7.3给搭建SVN服务器
centos7.3给搭建SVN服务器 1 安装svnserver yum install subversion 2 查看版本 svnserve --version 3 创建版本库 3.1 运行以下命令 ...
- ES6系列_3之变量的解构赋值
ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构. 解构有三种类型: 1.数组的解构赋值 (1)简单的数组解构 以前,我们给变量赋值是直接单个指定值,比如: let a=0; ...
- U3D 如何计算一个UI四个角的绝对坐标
//方式一,使用API获取 var rtrans = gameObject.GetComponent<RectTransform>(); Vector3[] worldcorners ...
- Struts 2 常用技术
目录 Struts 2 常用技术 1. 常用类和接口 1.1 getter 和 setter 方法 1.2 Action 接口 1.3 ActionSupport 类 1.4 通过 Act ...
- 归纳整理Linux下C语言常用的库函数----文件操作
在没有IDE的时候,记住一些常用的库函数的函数名.参数.基本用法及注意事项是很有必要的. 参照Linux_C_HS.chm的目录,我大致将常用的函数分为一下几类: 1. 内存及字符串控制及操作 2. ...
- ArcEngine调用FeatureToLine工具传参问题
FeatureToLine工具的in_features参数不能为内存图层,否则会报内存错误,正确的写法如下: FeatureToLine ftrToLine = new FeatureToLine() ...
- fiddler手机抓包
配置好之后,发现手机不能连接代理服务器,用netstat发现根本就没有手机的ip地址,于是猜想是不是防火墙的问题,关闭防火墙果然能连上,开启防火墙又连不上了,这就说明确实是防火墙的问题,关闭防火墙又很 ...
- Linux addr2line命令
一.简介 Addr2line (它是标准的 GNU Binutils 中的一部分)是一个可以将指令的地址和可执行映像转换成文件名.函数名和源代码行数的工具.这种功能对于将跟踪地址转换成更有意义的内容来 ...