代你进行身份验证——代理模式

2024-08-21 15:48

本文主要是介绍代你进行身份验证——代理模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       借着机房收费系统合作的机会,又把大话设计模式这本书拿了出来,我负责登录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),这样在接口方法比较多的时候,我们可以对接口进行灵活的操作,不需要向静态代理一样一发动全身。动态的出现,使我们的代理模式更加符合单一职责原则和开闭原则,增加了复用性。


四.小结:


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

 

 

 

这篇关于代你进行身份验证——代理模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093597

相关文章

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

遮罩,在指定元素上进行遮罩

废话不多说,直接上代码: ps:依赖 jquer.js 1.首先,定义一个 Overlay.js  代码如下: /*遮罩 Overlay js 对象*/function Overlay(options){//{targetId:'',viewHtml:'',viewWidth:'',viewHeight:''}try{this.state=false;//遮罩状态 true 激活,f

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者