借着机房收费系统合作的机会,又把大话设计模式这本书拿了出来,我负责登录B层,就一直想着可以加什么设计模式。在第一次机房重构的时候,看着C#的代码写VB.NET一个星期才把三层敲完了,如今,在网上找了一个代理模式的例子,真是简单易懂啊。。学了这些东西之后,再返回来看设计模式,就是有不一样的感觉~

先来回顾一下什么是代理模式?还记得戴励追美眉的故事么?大家可以回想一下大话设计上的小故事。

一.理论回顾

1.1 代理模式的定义:

为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用

1.2 代理UML图解:

1.3 代理的好处:

1、分离业务逻辑与事务的处理。

2、添加一层中间层,起到保护目标对象的作用。

3、扩展性强,降低耦合度。

1.4 代理的缺点:

由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

1.5 什么时候需要用到代理模式:

1、客户端无法操作目标对象,在客户端建立一个远程对象的代理,这样在客户端操作远程对象,就像操作目标对象一样的效果。因为它们两个都实现了同一个接口。

2、除了当前此类的功能外,我们需要提供其他的功能。

二.实战应用

1.图解代理模式(机房登录怎么用):

在登录的时候需要一个登录的事务,进行一大串的身份验证,其实登录就三部分:输入用户名和密码(U层验证是否为空)→验证身份→登录成功关闭连接。这个时候验证身份有好几个方法,我们就可以把一套事务写出来放到实现类里面,写一个代理接口,代理类,在U层直接调用我们的代理类就可以了。一行代码就够了。这样以来,U层就不用看到B层是如何实现的,因为它是直接面向代理类的,它不需要知道B层是如何实现的。

2.实战代理模式(登陆):


我们需要三个类,代理接口ILoginProxy,代理类LoginProxy,实现登录的B层Worklogbll。

<span style="font-size:18px;"><span style="font-size:18px;">Imports Entity
Public Interface ILoginProxyFunction TestUser(enUser As UserEntity) As List(Of UserEntity)End Interface
</span></span>
<span style="font-size:18px;"><span style="font-size:18px;">Imports Entity
Public Class LoginProxy : Implements ILoginProxyDim worklogbll As New WorklogBLLPublic Function TestUser(ByVal enUser As UserEntity) As List(Of UserEntity) Implements ILoginProxy.TestUserReturn worklogbll.TestUser(enUser)End Function
End Class
</span></span>
<span style="font-size:18px;"><span style="font-size:18px;">'**********************************************
' 文  件  名:WorklogBLL
' 命名空间:BLL
' 内       容:
' 功       能:
' 文件关系:
' 作       者:周洲
' 小       组:XX
' 生成日期:2015/5/14 11:28:16
' 版  本  号:V1.0.0.0
' 修改日志:
' 版权说明:
'**********************************************
Imports Entity
Imports Factory
Public Class WorklogBLL : Implements ILoginProxyPublic facWork As New Factory.DataFactory   '实例化工厂Public facUser As New Factory.DataFactory    '实例化工厂Public iWork As IDAL.IWorklog = facWork.CreateWorklog    '定义接口Public iUser As IDAL.IUser = facUser.CreateUser    '定义接口''' <summary>''' 验证用户是否成功登陆的信息''' </summary>''' <param name="enUser">传ID的User实体</param>''' <returns></returns>''' <remarks></remarks>Public Function TestUser(enUser As UserEntity) As List(Of UserEntity) Implements ILoginProxy.TestUserIf iUser.Selectuserbyidpwd(enUser).Count > 0 ThenIf iWork.Userisonwork(enUser).Count > 0 Then'工作记录大于0,证明正在上机,先下机,再上机enUser.Userlevel = iUser.Selectuserbyidpwd(enUser)(0).UserleveliWork.Userupdatelogin(enUser)iWork.Userinsertlogin(enUser)Else'直接插入一条新的工作记录enUser.Userlevel = iUser.Selectuserbyidpwd(enUser)(0).UserleveliWork.Userinsertlogin(enUser)End IfEnd IfReturn iUser.Selectuserbyidpwd(enUser)End Function</span></span>
<span style="font-size:18px;"> Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickDim enUser As New UserEntityDim Userinfo As New List(Of UserEntity)enUser.UserID = "4"enUser.Pwd = "2"Dim iLoginProxy As ILoginProxyiLoginProxy = New LoginProxyUserinfo = iLoginProxy.TestUser(enUser)MsgBox(Userinfo(0).Userlevel)If Userinfo.Count > 0 ThenFrmHomepage.Show()Me.Hide()If Userinfo(0).Userlevel.Trim() = "一般用户" ThenFrmHomepage.一般用户ToolStripMenuItem.Enabled = TrueFrmHomepage.操作员ToolStripMenuItem.Enabled = FalseFrmHomepage.管理员ToolStripMenuItem.Enabled = FalseElseIf Userinfo(0).Userlevel.Trim() = "操作员" ThenFrmHomepage.一般用户ToolStripMenuItem.Enabled = TrueFrmHomepage.操作员ToolStripMenuItem.Enabled = TrueFrmHomepage.管理员ToolStripMenuItem.Enabled = FalseElseIf Userinfo(0).Userlevel.Trim() = "管理员" ThenFrmHomepage.一般用户ToolStripMenuItem.Enabled = TrueFrmHomepage.操作员ToolStripMenuItem.Enabled = TrueFrmHomepage.管理员ToolStripMenuItem.Enabled = TrueEnd IfEnd IfEnd Sub</span>

U层一句话就完成了登陆事务的处理,是不是很简单呀~

Userinfo = iLoginProxy.TestUser(enUser)

三.思维延伸

1.与其他模式的对比:

1.1 适配器VS代理

接口上有区别。适配器模式是为它所适配的对象提供一个不同的接口,目的为了由于接口不兼容的类可以一起工作。代理模式则是提供一个它具体执行类实现相同的一个接口,目的为了让具体细节进行隐藏。

1.2 装饰者VS代理

虽然实现部分与代理相似,例如都是实现了同一个接口,但是目的不同。装饰者模式利用继承的方法动态的给一个对象添加一些额外的职责。而代理模式中代理类和真实类虽然都去实现了接口,但是目的在于保护对real类的访问。

1.3 外观VS代理

实现方式上面不同。外观模式是产生一个新类封装内部的操作,目的在于减少外部调用成语和内部相应之间的耦合。代理是产生一个继承类,目的在于隐藏被历代对象实现的细节,利用了虚拟代理使操作上更加灵活,这里体现在实例化一个代理类,不用管real类中繁琐的实现过程。

引起争议的是:

我们的机房收费系统登陆BLL层,有人觉得外观也可以解耦啊,为什么一定要用到代理呢?个人观点,都可以用,外观在这里的用法解释就是对于U层调用B层的解耦,而用到代理的目的就在于对“登陆”一系列繁琐操作的real类的封装,二者都起到了解耦的作用,在实现上唯一的差别是,外观提供了一组接口,对系统进行了封装。代理则是一对一的实现proxy和real之间的关系。

2.静态代理VS动态代理

2.1 “动态”存在原因——“静态”有缺点

以上所有的代码用于都是基于静态代理的,动态代理为什么出现呢。一定是有静态代理hold不住的事情,当我需要添加一个新的方法的时候(比如我登陆如果发现错误,我需要记录错误日志),需要在接口写一遍,proxy类需要做改动,real类需要做改动,这样一来静态代理就显得很鸡肋了。。

2.2 动态代理的进步

动态代理很好的解决的上面添加新方法的尴尬问题。 将所有声明的接口方法都转移到调用处理器的一个集中方法中去处理(invoke),这样在接口方法比较多的时候,我们可以对接口进行灵活的操作,不需要向静态代理一样一发动全身。动态的出现,使我们的代理模式更加符合单一职责原则和开闭原则,增加了复用性。

四.小结:

运用设计模式,就一个道理:想你不敢想的,就实现了~  然后大胆的去做,我们总是否定着自己的想法,总觉得用什么设计模式都不合适吧,是不是太牵强了!其实,合作版机房就是一个练手的机会,大胆去想像就对了!只要你的立场坚定,我用某某设计模式就是为了解决哪个问题,就成功了!

代你进行身份验证——代理模式相关推荐

  1. 开启XP远程桌面的网络级身份验证(NLA)模式

    indows XP SP3下不支持网络级别身份验证,而Vista/Windows 7则支持. 那么,何谓网络级身份验证呢? 网络级别身份验证 (NLA,Network Level Authentica ...

  2. 【Spring6】| GoF之代理模式(JDK动态代理和CGLIB动态代理)

    目录 一:GoF之代理模式 1. 对代理模式的理解 2. 静态代理 3. 动态代理 3.1 JDK动态代理 3.2 CGLIB动态代理 一:GoF之代理模式 1. 对代理模式的理解 生活场景1:牛村的 ...

  3. 利用代码分别实现jdk动态代理和cglib动态代理_代理模式实现方式及优缺点对比...

    作者:爱宝贝丶来源:https://my.oschina.net/zhangxufeng/blog/1633187 代理模式最典型的应用就是AOP,本文结合主要讲解了代理模式的几种实现方式:静态代理和 ...

  4. 代理模式——静态代理,动态代理(JDK代理和CGLib代理)

    概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问. 这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. Java中的代理按照代理类生成时机不同又分为 ...

  5. 如何改变SQL SERVER的身份验证模式

    2007年07月09日 星期一 上午 10:10 1.点击"开始"-"运行",输入regedit,回车进入注册表编辑器       2.依次展开注册表项,浏览到 ...

  6. 什么是代理模式?代理模式有什么用?通过一个小程序分析静态代理和动态代理。自己简单实现动态代理。JDK动态代理和CGLIB动态代理的区别。

    1. 代理模式有什么用 ①功能增强,在实现目标功能的基础上,又增加了额外功能.就像生活中的中介一样,他跟两边客户会有私下的交流. ②控制访问,代理不让用户直接和目标接触.就像中间商一样,他们不会让我们 ...

  7. SharePoint 2010 中的BCS身份验证模式

    BCS(Business Connectivity Services)是SharePoint 2010中用于替换原先Microsoft Office SharePoint Server 2007企业版 ...

  8. 如何修改SQL Server 2000身份验证模式和系统管理员

    大家安装SQL Server 2000时,很多人都习惯性的一路下一步,最后就会以windows身份验证作为登录数据库服务器的方式,假如有一天你后悔了,想以sql server的验证方式登陆,那怎么办呢 ...

  9. Nginx详解+身份验证+虚拟主机+反向代理负载均衡

    一.差异对比 Apache Nginx 配置相对复杂 配置相对简单 原生支持动态和静态页面 支持静态页面 模块相对安全 高性能模块出产迅速.社区活跃 BUG相对较少,消耗资源较多 BUG相对较多,节省 ...

最新文章

  1. python建立文件数据库_Python创建CRNN训练用的LMDB数据库文件
  2. hm55主板支持最大内存_内存频率取决于CPU还是主板?内存频率看主板支持还是看CPU支持?...
  3. kubernetes(二)k8s组件
  4. new和delete
  5. Win7打印时文档被挂起的解决方法
  6. python是动态还是静态_python之静态方法和动态方法介绍
  7. canvas绘制字体-属性设置2
  8. Java抓取电脑屏幕
  9. HDU2050 折线分割平面【组合】
  10. C# 调用C/C++动态链接库,结构体中的char*类型
  11. 基于Linux平台Softimage XSI 演示
  12. 基于matlab的不规则面积图像测量,基于matlab的不规则面积图像测量.doc
  13. SRS学习-配置DVR
  14. 强力推荐素材收集和管理神器-Eagle工具
  15. myexcel初步使用
  16. 星岚技术 Win10 x64 纯净版 V2021.5【带驱动包】
  17. 【时间序列】ICML 2020 时间序列相关论文总结(附原文源码)
  18. 吴恩达机器学习(一)—— 简介
  19. 快递查询方法一键查询物流信息
  20. 随机模型,估计与控制 ——介绍

热门文章

  1. Firefox/Chrome下flash的wmode参数设为opaque或transparent时输入文本框中无法输入中文汉字的解决方法...
  2. IDM(Internet Download Manager)下载器使用
  3. 初级***DOS命令大全
  4. allegro如何导入DXF文件
  5. autojs教程:一起来养猪app脚本代码
  6. C++_enhance-Record11—异常的层次结构(继承在异常中的应用)
  7. python爬取小说写入txt_零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版...
  8. in 在将 nvarchar 值转换成数据类型 int 时失败
  9. Win 11环境下 Texlive中文字体缺失问题(Package fontspec Error: The font )
  10. 视频格式转换器android,佳佳Android视频格式转换器(Android视频转换软件)V12.0.1.0 免费版...