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

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

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

代理模式的定义:

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

代理UML图解:

代理的好处:

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

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

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

代理的缺点:

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

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

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

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

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

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

实战代理模式(登陆):

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

<span style="font-size:18px;"><span style="font-size:18px;">Imports Entity
Public Interface ILoginProxy
    Function 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 ILoginProxy
    Dim worklogbll As New WorklogBLL
    Public Function TestUser(ByVal enUser As UserEntity) As List(Of UserEntity) Implements ILoginProxy.TestUser
        Return 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 ILoginProxy

    Public 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.TestUser
        If iUser.Selectuserbyidpwd(enUser).Count > 0 Then
            If iWork.Userisonwork(enUser).Count > 0 Then
                '工作记录大于0,证明正在上机,先下机,再上机
                enUser.Userlevel = iUser.Selectuserbyidpwd(enUser)(0).Userlevel
                iWork.Userupdatelogin(enUser)
                iWork.Userinsertlogin(enUser)
            Else
                '直接插入一条新的工作记录
                enUser.Userlevel = iUser.Selectuserbyidpwd(enUser)(0).Userlevel
                iWork.Userinsertlogin(enUser)
            End If
        End If
        Return iUser.Selectuserbyidpwd(enUser)
    End Function</span></span>
<span style="font-size:18px;"> Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim enUser As New UserEntity
        Dim Userinfo As New List(Of UserEntity)
        enUser.UserID = "4"
        enUser.Pwd = "2"

        Dim iLoginProxy As ILoginProxy
        iLoginProxy = New LoginProxy
        Userinfo = iLoginProxy.TestUser(enUser)
        MsgBox(Userinfo(0).Userlevel)
        If Userinfo.Count > 0 Then
            FrmHomepage.Show()
            Me.Hide()

            If Userinfo(0).Userlevel.Trim() = "一般用户" Then
                FrmHomepage.一般用户ToolStripMenuItem.Enabled = True
                FrmHomepage.操作员ToolStripMenuItem.Enabled = False
                FrmHomepage.管理员ToolStripMenuItem.Enabled = False
            ElseIf Userinfo(0).Userlevel.Trim() = "操作员" Then
                FrmHomepage.一般用户ToolStripMenuItem.Enabled = True
                FrmHomepage.操作员ToolStripMenuItem.Enabled = True
                FrmHomepage.管理员ToolStripMenuItem.Enabled = False
            ElseIf Userinfo(0).Userlevel.Trim() = "管理员" Then
                FrmHomepage.一般用户ToolStripMenuItem.Enabled = True
                FrmHomepage.操作员ToolStripMenuItem.Enabled = True
                FrmHomepage.管理员ToolStripMenuItem.Enabled = True
            End If

        End If

    End Sub</span>

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

Userinfo = iLoginProxy.TestUser(enUser)

小结:

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

时间: 2024-11-06 17:43:14

代你进行身份验证——代理模式的相关文章

Java设计模式(八)----代理模式

代理模式 1.生活中: 代理就是一个人或者一个组织代表其他人去做一件事的现实生活中的.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 2.官方: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用 一.静态代理 类图结构如下 在代理模式中的角色: ●抽象主题角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象. ●真实主题角色:定义了代理对象所代表的

zbb20180930 代理模式 -静态代理-jdk动态代理-cglib动态代理

CGLIB与JDK动态代理区别 区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理.而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理. 1.如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2.如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3.如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB

SqlServer2008登录由windows身份认证改sqlserver和windows身份验证模式的方法

1.右击数据库连接,如图: 2.点击属性 在安全性中将sqlserver和windows身份验证模式选中 3.在安全性中,登录名中找到sa,右击属性,常规中设置sa的密码,如下 4.接着,在状态中登录那块将登录由禁用改为启用 这样设置,然后用sqlserver和windows身份登录即可

使用NTLM的windows身份验证的nginx反向代理

一次项目中使用开源nginx反向代理NTLM的windows身份验证出现反复登陆框,最终分析属于keepalive 在NTLM认证过程中发生变化导致. 据此,将nginx.conf 配置修改如下 worker_processes auto; worker_rlimit_nofile 65535; events { worker_connections 65535; } http { include mime.types; default_type application/octet-stream

ASP.NET中的Forms身份验证模式

Forms身份验证:通过应用程序设置的登录界面进行用户身份验证,若验证成功则调转到验证之前请求的url. 原理图: 原文地址:https://www.cnblogs.com/JDotNet/p/3451263.html

3、Web Api 身份验证

由于接口传递的是企业内部数据,在数据安全性方面需要把控,因此当客户端调用接口时,必须提供身份标识,验证通过之后方可调用接口,以确保数据的安全性.由于WebApi的身份校验是面向切面编程的,即当你需要进行身份校验时,执行逻辑为:Client->Filter身份校验->接口,当校验通过时,即可正常调用 当校验不通过时,将返回401身份验证失败. 一.身份校验 Basic 1.在Api项目下创建Filter文件夹 2.编写验证程序 using System; using System.Net; us

ASP.NET Core 1.1 静态文件、路由、自定义中间件、身份验证简介

概述 之前写过一篇关于<ASP.NET Core 1.0 静态文件.路由.自定义中间件.身份验证简介>的文章,主要介绍了ASP.NET Core中StaticFile.Middleware.CustomizeMiddleware和Asp.NetCore Identity.但是由于所有的ASP.NET Core的版本有些老,所以,此次重写一次.使用最新的ASP.NET Core 1.1版本.对于ASP.NET Core 1.1 Preview 1会在以后的文章中介绍 目录 使用静态文件 使用路由

设计模式完结(12)-- 代理模式

代理模式与装饰模式区别: 装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问.换句话说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息. 因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例.并且,当我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器. 我们可以用另外一句话来总结这些差别:使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造

JDK动态代理和Cglib的动态代理

最简单的是静态代理方法,即代理模式,这里就不多啰嗦了.. 重点说一下JDK的动态代理和Cglib的动态代理吧 先说JDK的,需要被代理的类需要有接口,否则无法实现 package proxy.dynamic; public interface IBook { void add(); } 实现接口的类如下 package proxy.dynamic; public class Book implements IBook { @Override public void add() { System.