重识外观模式

第二次对外观做出理解,第一次总结为《机房(个人重构)——外观模式》,第一次的总结没有任何问题,不过在合作中对它有了另一层次的认识。

为形成对比,我还以之前上下机为例子:

【1】之前类图:


以及实现代码:

Imports Entity  
Imports BLL  
''' <summary>  
'''  该类用于在上机时,检查卡号是否存在,是否注销,余额是否大于最小限度,  
'''   
''' </summary>  
''' <remarks></remarks>  
Public Class FacCheckCard  
    Public Function CheckCard(enStudent As Entity.StudentEntity) As Boolean  
        Dim enBasicData As New Entity.BasicDataEntity  
        Dim limitMoney As New BLL.SetBasicDataBLL()  
        Dim check As New BLL.PublicBLL()  
        Dim isOnline As New BLL.QueryRecordBLL()  
        Dim mylistData As List(Of BasicDataEntity)  
        Dim isRight As Boolean  
        Dim mylist As List(Of StudentEntity)  
        Dim enOnline As New Entity.OnlineEntity  
        isRight = check.CheckCard(enStudent)  
        If isRight = True Then '如果该卡号存在  
            isRight = check.CheckStatus(enStudent)  
            If isRight = True Then '如果该卡号没有注销  
                mylist = check.CheckBalance(enStudent)  
                mylistData = limitMoney.DataRecord(enBasicData)  
                If Int(mylist(0).balance) < Int(mylistData(0).limitMoney) Then '判断上机余额是否大于最低限额  
                    MsgBox("余额小于最少上机余额" & Trim(mylistData(0).limitMoney) & "元")  
                    Return False  
                    Exit Function  
                Else  
                    Return True  
                End If  
            Else  
                MsgBox("该卡号已经注销!核实后再上机")  
                Return False  
                Exit Function  
            End If  
        Else  
            MsgBox("该卡号不存在,请核实后再上机")  
            Return False  
            Exit Function  
        End If  
  
    End Function  
End Class  

就之前的外观模式分析,这样没有任何问题,而且外观的确达到了隔离系统功能的提供者和使用者,还就此例说明:使用者要下机,而在下机的整个过程中,first,判断卡号是否存在,second,判断卡号是否注销,third,判断该卡号是否正在上机,就这三个功能而言,在功能的提供者也就是BLL层中分别对应三个方法,为隔离UIBLL层,加入外观层的一个类,在这个具体方法中封装了三个方法,只是三个方法并没有在B层进行进一步的判断,而是直接返回初始结果,在外观层中对业务逻辑层的每一个方法的返回结果进行了判断,这也就是业务逻辑放到了外观。

如此之来,外观用上了,作用也达到了,可是出现一个问题:在B层差不多只进行了return类似的语句,相应的逻辑判断几乎没有,这些工作都交给了外观层来解决,而当初加入外观层的目的是用来解耦的,而解耦的最好方法就是接口,而这里外观提供的好像并不是一个接口,而是类似于B层的一个类,用了外观,反而把B层给架空了,这样的感觉就好像外观层在直接调用数据访问层。

所以,重点问题在外观固然要存在,但是外观的存在的意义要着实分清,其不应含过多的业务逻辑,只是简单的对B层方法进行封装,真正的效果应该是这样的。(在网上当的例子)

【2】在外观层不加业务逻辑的类图:

简单说明一下,这是一个买药的过程,包括(挂号,付钱,取药)三部曲。

转换成代码表示:

外观层:


BLL层:


这样的表示方法好像更符合一些外观存在的实际作用。

外观层的目的,是隔离系统功能的提供者和使用者,更明确的说,是隔离业务逻辑的软件用户界面,这一层没有任何需要处理的逻辑,只是作为后台逻辑处理和前端用户界面的缓冲区,它虽然没有实现任何逻辑,但是,它的引入,能使系统更加有条理,更加简明。

针对外观模式,每个人都有每个人的理解,我想,最好的学习就是一次次不断的实践,应用到实际项目当中。或许我的理解还有所欠缺,还望读者斧正!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")