zoukankan      html  css  js  c++  java
  • 三层架构和例子

    前言

    首先要说说为什么要有这玩意,如果不分层的话岂不是更快的连接数据库??答案确实是更快,不分层速度会有提升。但是综合考虑,分层了比不分层有点多了太多,虽然有牺牲,但是三层会有相当大的拓展性以及特别多的优点。我们使用三层的目的是为了“高内聚,低耦合”的思想。下边就来说一说三层架构的优点,以及缺点。

    优点和缺点

    优点

    1、开发人员可以只关注整个结构中的其中某一层;

    2、可以很容易的用新的实现来替换原有层次的实现;

    3、可以降低层与层之间的依赖;

    4、有利于标准化;

    5、利于各层逻辑的复用;

    6、拓展性强;

    7、安全性高;

    8、项目结构更清楚,分工更明确,有利于后期的维护和升级。

    缺点

    1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。

    2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。

    三层简述

    1、显示层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得,这里我就先简单的理解为主要就是软件的窗体界面类。

    UI作用:

    向用户展示现特定业务数据;

    采集用户的输入信息和操作;

    将有需要的信息在显示曾显示出来。

    UI设计原则:用户至上,兼顾简洁

    2、业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。B层是联系U层和D层的桥梁,进行他们之间的数据交互。

    作用:

    从DAL中获得数据进行逻辑操做,以供UI显示用;

    从UI中获得用户指令和数据,执行业务逻辑;

    从UI中获得用户指令和数据,通过DAL写入数据源;

    3、数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、查找等。接受B层的命令,对数据进行处理。

    作用:

    从数据源加载数据(Select);

    向数据源写入数据(Insert/Update);

    从数据源删除数据(Delete);

    将数据返回B层;

    4、实体层(Enitity):贯穿于上面三层,在三层之间传递数据

    好处:减少系统出错的可能,提高开发效率

    例子

    饭店将整个业务分解为三部分来完成,每一部分各负其责,服务员只管接待顾客、向厨师传递顾客的需求;厨师只管烹炒不同口味、不同特色的美食;后勤工作人员只管提供美食原料;他们三者分工合作共同为顾客提供满意的服务。在饭店为顾客提供服务期间,服务员、厨师、后勤工作人员,三者中任何一者的人员发生变化时都不会影响其他俩者的正常工作,只对变化者进行重新调整即可正常营业。

    我们用三层结构开发的软件系统于此类似,表示层只提供软件系统与用户交互的接口;业务逻辑层是表示层和数据访问层之间的桥梁,负责数据处理和传递;数据访问层只负责数据的存取工作。

    如果服务员、厨师、采购员这三种任何一人离职或者请假,我们都可以立马找别人来补上,任何一个出现问题都不会影响其他人,这也充分的体现了“高内聚、低耦合”的思想。

    具体流程

    引用关系

    LoginBLL引用LoginDAL、LoginModel
    LoignDAL引用LoginModel
    LoginUI引用LoginBLL、LoginModel
    LoginModel不用引用

    代码

    D层

    Dbutil

    用于数据库的登录连接
    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
      
      
    namespace Login.DAL  
    {  
        class Dbutil  
        {  
            public static string ConnString = @"Server=Banana_PC;Database=test;User ID=sa;Password=123";  
        }  
    }  
    

    ScoreDAO

    每登录一次加十分
    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
    using System.Data.SqlClient;  
      
    namespace Login.DAL  
    {  
        public class ScoreDAO  
        {  
            public void UpdateScore(string userName, int value)  
            {  
                using (SqlConnection conn = new SqlConnection(Dbutil.ConnString))  
                {  
                    SqlCommand cmd = conn.CreateCommand();  
                    cmd.CommandText = @"INSERT INTO SCORES_INFO(UserName,Score) Values(@UserName,@Score)";  
                    cmd.Parameters.Add(new SqlParameter("@UserName", userName));  
                    cmd.Parameters.Add(new SqlParameter("@Score", value));  
      
                    conn.Open();  
                    cmd.ExecuteNonQuery();  
                }  
            }  
        }  
    }  
    

    UserDAO

    用于登录用户
    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
    using System.Data.SqlClient;  
      
    namespace Login.DAL  
    {  
        public class UserDAO  
        {  
            public Login.Model.UserInfo SelectUser(string userName, string passWord)  
            {  
                using (SqlConnection conn = new SqlConnection(Dbutil.ConnString))  
                {  
                    SqlCommand cmd = conn.CreateCommand();  
                    cmd.CommandText =  
                        @"SELECT ID, UserName, Password, Email FROM USERS_INFO WHERE UserName=@UserName AND Password=@PassWord";  
                    cmd.CommandType = System.Data.CommandType.Text;  
                    cmd.Parameters.Add(new SqlParameter("@UserName", userName));  
                    cmd.Parameters.Add(new SqlParameter("@PassWord", passWord));  
      
                    conn.Open();  
                    SqlDataReader reader = cmd.ExecuteReader();  
                    Login.Model.UserInfo user = null;  
                    while (reader.Read())  
                    {  
                        if (user == null)  
                        {  
                            user = new Login.Model.UserInfo();  
                        }  
                        user.ID = reader.GetInt32(0);  
                        user.UserName = reader.GetString(1);  
                        user.Password = reader.GetString(2);  
                        if (!reader.IsDBNull(3))  
                        {  
                            user.Email = reader.GetString(3);  
                        }  
                    }  
                    return user;  
                }  
            }  
        }  
    }  
    

    U层

    用于登录,无其他任何功能
    using System;  
    using System.Collections.Generic;  
    using System.ComponentModel;  
    using System.Data;  
    using System.Drawing;  
    using System.Linq;  
    using System.Text;  
    using System.Windows.Forms;  
      
    namespace LoginUI  
    {  
        public partial class Form1 : Form  
        {  
            public Form1()  
            {  
                InitializeComponent();  
            }  
      
            private void btnLogin_Click(object sender, EventArgs e)  
            {  
                string userName = txtUsername.Text.Trim();  
                string password = txtPassword.Text;  
                Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();  
                Login.Model.UserInfo user = mgr.UserLogin(userName, password);  
                MessageBox.Show("登录用户:" + user.UserName);  
            }  
      
        }  
    }  
    

    B层

    进行数据的操作
    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
      
    namespace Login.BLL  
    {  
        public class LoginManager  
        {  
            public Login.Model.UserInfo UserLogin(string userName, string password)  
            {  
                Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();  
                Login.Model.UserInfo user = uDao.SelectUser(userName, password);  
      
                if (user != null)  
                {  
                    Login.DAL.ScoreDAO sDao = new DAL.ScoreDAO();  
                    sDao.UpdateScore(userName, 10);  
                    return user;  
                }  
                else  
                {  
                    throw new Exception("登陆失败");  
                }  
            }  
        }  
    }  
    

    Model

    用于数据的存储
    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
      
    namespace Login.Model  
    {  
        public class UserInfo  
        {  
            public int ID { get; set; }  
            public string UserName { get; set; }  
            public string Password { get; set; }  
            public string Email { get; set; }  
        }  
    }  
    

    实例图解

    总结

    对于三层架构的学习还是很乱,还需要继续学习,后一篇博客将是加上工厂模式的七层架构,自己也要理清楚变量、方法、类之间的关系,现在理解的真的不是很透彻,还需要多次的学习。
  • 相关阅读:
    浅谈ConcurrentHashMap实现原理
    HashMap底层实现原理及扩容机制
    浅谈fail-fast机制
    《从Lucene到Elasticsearch:全文检索实战》学习笔记五
    《从Lucene到Elasticsearch:全文检索实战》学习笔记四
    JVM垃圾回收算法解析
    《从Lucene到Elasticsearch:全文检索实战》学习笔记三
    《从Lucene到Elasticsearch:全文检索实战》学习笔记二
    python print()内置函数
    《从Lucene到Elasticsearch:全文检索实战》学习笔记一
  • 原文地址:https://www.cnblogs.com/DiaoLintong/p/8137665.html
Copyright © 2011-2022 走看看