系列文章

[Head First设计模式]山西面馆中的设计模式——装饰者模式

[Head First设计模式]山西面馆中的设计模式——观察者模式

[Head First设计模式]山西面馆中的设计模式——建造者模式

[Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式

[Head First设计模式]一个人的平安夜——单例模式

引言

闲着没事,终于又拿起Head First设计模式 翻了翻,脑海里也一直在想抢票的事,抢票中使用一些抢票工具,这个抢票工具是否就是一个中间代理呢?

什么是代理?

自己的理解就是有些事排个代表可以去做,自己也可以去做,这个代表就是代理,比如抢票这件事,抢票工具就是个代理,有没有它,自己一样可以去买票。

代理模式定义

代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问。

使用代理模式创建代表(Representative)对象,让代表控制某对象的访问,被代理的对象可以是远程对象,创建开销大的对象或需安全控制的对象。

代理模式的类图

Subject:它为RealSubject和Proxy提供了接口,通过实现同一接口,Proxy在RealSubject出现的地方取代它。

RealSubject是真正做事的对象,它是被proxy代理和控制访问的对象。

Proxy持有RealSubject的引用。在某些例子中,Proxy还会负责RealSubject对象的创建与销毁。客户和RealSubject的交互都必须通过Proxy。因为Proxy和RealSubject实现相同的接口Subject。所以任何用到RealSubject的地方,都可以用Proxy取代。Proxy也控制了对RealSubject的访问,在某些情况下,我们可能需要这样的控制。这些情况包括RealSubject是远程的对象,RealSubject创建开销大,或RealSubject需要被保护。

抢票的实例

接口

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Wolfy.代理模式
{
/// <summary>
/// 抽象类subject接口类 抢票工具 ,自己都继承该抽象类 都具有抢票方法
/// </summary>
public abstract class BaseWork
{
/// <summary>
/// 抢票方法
/// </summary>
public abstract void DoForceTick();
}
}

抢票工具类

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Wolfy.代理模式
{
public class TicketTool : BaseWork
{
MySelf myself;
public override void DoForceTick()
{
if (myself == null)
{
myself = new MySelf();
}
myself.DoForceTick();
}
}
}

自己

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Wolfy.代理模式
{
public class MySelf:BaseWork
{
public override void DoForceTick()
{
Console.WriteLine("抢一张北京西-郑州的火车票");
}
}
}

控制台

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Wolfy.代理模式
{
class Program
{
static void Main(string[] args)
{
//自己抢票
MySelf myself = new MySelf();
myself.DoForceTick();
//抢票工具
TicketTool tool = new TicketTool();
tool.DoForceTick();
Console.Read();
}
}
}

结果

总结

代理模式优点:

(1).职责清晰
真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
(2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的作用。
(3).高扩展性
代理模式的分类:远程(Remote)代理,虚拟(Virtual)代理,Copy-on-Write代理,智能引用(Smart Reference)代理。
 
如若对该模式的理解有误,请留言,讨论一下,共同学习=进步,谢谢
 
参考书:
Head First 设计模式

[Head First设计模式]抢票中的设计模式——代理模式的更多相关文章

  1. [Head First设计模式]山西面馆中的设计模式——观察者模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也不得安生,也发现生活中的很多场景,都可以用设计模式来模拟.原来设计模式就在 ...

  2. [Head First设计模式]山西面馆中的设计模式——建造者模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 引言 将学习融入生活中,是件很happy的事情,不会感 ...

  3. js架构设计模式——理解javascript中的MVVM开发模式

    理解javascript中的MVVM开发模式 http://blog.csdn.net/slalx/article/details/7856769 MVVM的全称是Model View ViewMod ...

  4. PHP 实战之设计模式:PHP 中的设计模式

    本文主要讨论下Web开发中,准确而言,是PHP开发中的相关的设计模式及其应用.有经验的开发者肯定对于设计模式非常熟悉,但是本文主要是针对那 些初级的开发者.首先我们要搞清楚到底什么是设计模式,设计模式 ...

  5. 设计模式(十三):从“FQ”中来认识代理模式(Proxy Pattern)

    我们知道Google早就被墙了,所以FQ才能访问Google呢,这个“FQ”的过程就是一个代理的过程.“代理模式”在之前的博客中不止一次的提及过,之前的委托回调就是代理模式的具体应用.今天我们就从“F ...

  6. 设计模式(十三): Proxy代理模式 -- 结构型模式

      设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路 ...

  7. Java 设计模式系列(十二)代理模式

    Java 设计模式系列(十二)代理模式 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. package com.github.binarylei.de ...

  8. JAVA设计模式 5【结构型】代理模式的理解与使用

    今天要开始我们结构型 设计模式的学习,设计模式源于生活,还是希望能通过生活中的一些小栗子去理解学习它,而不是为了学习而学习这些东西. 结构型设计模式 结构型设计模式又分为 类 结构型 对象 结构型 前 ...

  9. 【设计模式】学习笔记17:代理模式之保护代理与Java反射

    本文出自   http://blog.csdn.net/shuangde800 本笔记内容: 1. Java动态代理,反射机制 2. 保护代理 3. 应用保护代理实现的约会系统 ----------- ...

随机推荐

  1. python requests 安装

    在 windows 系统下,只需要输入命令 pip install requests ,即可安装. 在 linux 系统下,只需要输入命令 sudo  pip install requests ,即可 ...

  2. c#多态性

    class Program { static void Main(string[] args) { //声明一个派生类 devierExample de = new devierExample(); ...

  3. CML相关

    !!:执行上一条命令 !blah:执行最近的以 blah 开头的命令,如 !ls !blah:p:仅打印输出,而不执行 !$:上一条命令的最后一个参数,与 Alt + . 相同 !$:p:打印输出 ! ...

  4. mysql5.7.13-windows 免安装版配置简介

    1.下载mysql5.7.13-windows版本 (1)mysql5.7.13-win64版本百度云下载链接分享地址:链接:http://pan.baidu.com/s/1slMl4Ah 密码:w6 ...

  5. VIM 常用命令

    1.当vi打开时默认为命令模式,要转入输入模式,需要按a或者i键. 命令模式下: :wq  保存并且退出 :w   只保存不推出 :q   不保存退出 :q!  不保存强制退出 :wq! 保存并强制退 ...

  6. 【Bootstrap Demo】入门例子创建

    本文简单介绍下如何来使用 Bootstrap,通过引入 Bootstrap,来实现一个最基本的入门例子. 在前一篇博文[Bootstrap]1.初识Bootstrap 基础之上,我们完全可以更加方便快 ...

  7. 数据表格 - DataGrid - 查询

    toolbar头部工具栏 <script type="text/javascript"> $(function () { $("#datagrid" ...

  8. Error:Execution failed for task ':app:transformClassesWithDexForDebug'解决记录

    转载请标明出处: http://blog.csdn.net/lxk_1993/article/details/50511172 本文出自:[lxk_1993的博客]:   3个错误non-zero e ...

  9. 【JSON】JavaScript删除json元素

    1.json中的两种结构:对象{}和数组[] 2.直接delete json对象[元素名称].

  10. 【抓包工具】wireshark

    wireshark下载地址:http://download.csdn.net/detail/victoria_vicky/8819777 一.wireshark优劣势 wireshark劣势:只能查看 ...