1. 程式人生 > >【重構】組合查詢——模板模式

【重構】組合查詢——模板模式

#前言

在進行機房重構的時候,我們學了那麼久的設計模式,不斷理解,抽象具體化,都不如來一個實際的,操作一下!

俗話說:“實踐是檢驗真理的唯一標準!”所以今天我們將模板模式和組合查詢結合到一塊,你會發現組合查詢原來可以這麼簡單!

#模板模式

我們要使用模板設計模式,我們首先的知道它是什麼?

用我的語言來說就是,我們做的事都是重複,所以我們把重複的東西寫成類封裝起來,然後子類通過繼承和方法的重寫,實現父類定義的重複的操作,從而減少了程式碼量,提高了程式碼的複用性!

為什麼在組合查詢上用模板設計模式呢?

大家會發現,操作員的有三個使用到組合查詢的功能,而且其功能十分相似,這正好符合模板模式的使用條件。而且你會發現如果不用設計模式的話,有很多程式碼都是重複多餘的!

#窗體設計

這裡寫圖片描述

三個窗體,我們只需要設計一個父窗體就夠了,之後的子窗體直接繼承就好,控制元件也會隨之繼承下來!~

#子窗體的建立

在UI層新增——>Windows Forms——>繼承的窗體——>選擇要繼承的父窗體(so easy)

這裡寫圖片描述

這裡寫圖片描述

#父窗體程式碼展示

		#region 清空文字內容方法
        public void Clear(Control ctrl)
        {
            foreach (Control c in this.Controls)
            {
                if (c is TextBox)
                {
                    c.Text = "";
                }
                if (c is ComboBox)
                {
                    c.Text = "";
                }
            }
        }
        #endregion
		#region 清空按鈕
        private void button2_Click(object sender, EventArgs e)
        {
            Control a = new Control();
            this.Clear(a);
        }
        #endregion
		#region 定義一個獲取資料的虛虛方法
        public virtual  string GetDBName(string  ctr)
        {
            return "";
        }
        #endregion
        #region  獲取表格的名字虛方法
        public virtual string GetTable()
        {
            return "";
        }
        #endregion
      
       #region  二三行條件的設定
        private void comboBox7_SelectedIndexChanged_1(object sender, EventArgs e)
        {
            Filed2.Enabled = true;
            Sombol2.Enabled = true;
            txtNew2.Enabled = true;
            comboBox8.Enabled = true;
        }

        private void comboBox8_SelectedIndexChanged_1(object sender, EventArgs e)
        {
            Filed3.Enabled = true;
            Sombol3.Enabled = true;
            txtNew3.Enabled = true;
        }
        #endregion
        #region 時間控制元件和文字框的轉換
        private void Filed1_SelectedIndexChanged_1(object sender, EventArgs e)
        {
            if (Filed1.Text.Trim() == "上機日期" || Filed1.Text.Trim() == "下機日期"||Filed1 .Text .Trim ()=="上機時間"||Filed1 .Text .Trim ()=="下機時間")
            {
                txtNew1.Visible = false;
                dtp1.Visible = true;
                dtp1.Enabled = true;
                Sombol1.Items.Clear();
                Sombol1.Items.Add("=");
                Sombol1.Items.Add("<>");
                Sombol1.Items.Add("<");
                Sombol1.Items.Add(">");
            }
            else
            {
                txtNew1.Visible = true;
                txtNew1.Enabled = true;
                dtp1.Visible = false;
                Sombol1.Items.Clear();
                Sombol1.Items.Add("=");
                Sombol1.Items.Add("<>");
            }
        }
       #endregion
		#region 窗體載入
        private void FrmTeamInQuiryFather_Load(object sender, EventArgs e)
        {
            CenterToScreen();
            dtp1.Visible = false;
            dtp2.Visible = false;
            dtp3.Visible = false;
        }
        #endregion
        

        private void button1_Click_1(object sender, EventArgs e)
        {
            #region 判斷輸入資訊是否為空
            if (Filed1.Text != "")
            {
                if (Sombol1.Text == "" || txtNew1.Text == "")
                {
                    MessageBox.Show("第一行查詢語句不能為空!~");
                }
            }
            if (comboBox7.Text != "")
            {
                if (Filed2.Text == "" || Sombol2.Text == "" || txtNew2.Text == "")
                {
                    MessageBox.Show("第二行查詢語句不能為空!~");
                }
            }
            if (comboBox8.Text != "")
            {
                if (Filed1.Text == "" || Sombol3.Text == "" || txtNew1.Text == "")
                {
                    MessageBox.Show("第三行查詢語句不能為空!~");
                }
            }
            #endregion

            #region 給實體賦值
            Entity.Line line = new Entity.Line();
            line.Filed1 = GetDBName(Filed1.Text .Trim());
            line.Filed2 = GetDBName(Filed2.Text.Trim());
            line.Filed3 = GetDBName(Filed3.Text.Trim());
            
            line.Sybol1 = Sombol1.Text.Trim();
            line.Sybol2 = Sombol2.Text.Trim();
            line.Sybol3 = Sombol3.Text.Trim();

            line.Comdition1 = txtNew1.Text.Trim();
            line.Comdition2 = txtNew2.Text.Trim();
            line.Comdition3 = txtNew3.Text.Trim();

            line.Relation1 = GetDBName(comboBox7.Text.Trim());
            line.Relation2 = GetDBName(comboBox8.Text.Trim());

            line.gettablename = GetTable();

            BLL.BLL bll = new BLL.BLL();

            DataTable table = bll.TeamInQuiry (line);
            if (table .Rows .Count ==0)
            {
                MessageBox.Show("沒有符合條件的資訊!");
            }
            else
            {
                MessageBox.Show("查詢成功!");
                dataGridView1.DataSource = table;
            }

            #endregion 

#子窗體程式碼
學生基本資訊維護為例

		#region 新增選擇條件
        private void FrmBasicInfoMainTain_Load(object sender, EventArgs e)
        {
            Filed1.Items.Add("卡號");
            Filed1.Items.Add("學號");
            Filed1.Items.Add("性別");
            Filed1.Items.Add("系別");
            Filed1.Items.Add("年級");
            Filed1.Items.Add("班級");
            Filed1.Items.Add("姓名");

            Filed2.Items.Add("卡號");
            Filed2.Items.Add("學號");
            Filed2.Items.Add("性別");
            Filed2.Items.Add("系別");
            Filed2.Items.Add("年級");
            Filed2.Items.Add("班級");
            Filed2.Items.Add("姓名");

            Filed3.Items.Add("卡號");
            Filed3.Items.Add("學號");
            Filed3.Items.Add("性別");
            Filed3.Items.Add("系別");
            Filed3.Items.Add("年級");
            Filed3.Items.Add("班級");
            Filed3.Items.Add("姓名");

        }
        #endregion

        #region 條件對應英文
        public override  string GetDBName(string str)
        {
            switch (str)
            {
                case "卡號": return "cardno";
                case "姓名": return "name";
                case "性別": return "sex";
                case "系別": return "department";
                case "年級": return "grade";
                case "班級": return "class";
                case "或": return "or";
                case "且": return "and";
                default: return "";
            }            
;        }
        #endregion

        public override string GetTable()
        {
            return "student_Info";
        }

注:

  • 大家可以充分利用一下#region進行程式碼摺疊,使自己的程式碼更加整潔!

這裡寫圖片描述

給大家展示一下我的程式碼,大家可以借鑑一下!

#未完待續

之後的查詢用的儲存過程,在之後的部落格中會給大家分享!