日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

在一个程序设计里,不同的功能窗口有着相似的功能实现方式,可采用设计模式---模板方法模式

發(fā)布時間:2023/12/20 asp.net 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在一个程序设计里,不同的功能窗口有着相似的功能实现方式,可采用设计模式---模板方法模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
? ? 前段時間學(xué)習(xí)了一些設(shè)計模式,最近在做項目的過程中恰巧用到了其中的一個--模板方法模式。這個模式在程序設(shè)計過程中可是為小編省去了不少的代碼量呢。具體是怎樣應(yīng)用的呢?接下來小編為您分享。
? ? 前面博文中小編已經(jīng)分享了模板方法模式的理論點,下面將分享如何把這些理論點應(yīng)用到實際的項目開發(fā)過程中。
※功能需求
? ? 在程序設(shè)計過程中,有兩個以上的窗口是實現(xiàn)組合查詢功能,且基本結(jié)構(gòu)都包括字段名、操作符、要查詢的內(nèi)容,以及操作符之間的組合關(guān)系,查出結(jié)果后將其導(dǎo)出、且導(dǎo)出的文件類型為Excel表。
? ? 在實現(xiàn)上面的功能時,考慮到這些窗口有類似的實現(xiàn)流程,所以就采用了一個設(shè)計模式----模板方法模式來實現(xiàn)功能需求。

1、首先建立一個模板,即父窗體。
把不同窗體中具有的相同結(jié)構(gòu)都放在父窗體中,且在父窗體的代碼中編寫它們公有的事件和方法,以及實現(xiàn)特定功能的模板方法----虛方法,涉及到的具體的實現(xiàn)功能的查詢方法需要在具體實現(xiàn)功能的窗體中去寫[類似于接口一樣,只提供抽象的方法,具體實現(xiàn)方法在D層中來實現(xiàn)。這里采用虛方法,在子窗體中進(jìn)行重寫]。在這個模板里,小編寫的方法和事件有以下這些:

namespace UI {public partial class frmGroupFindFather : Form{public frmGroupFindFather(){InitializeComponent();}//查詢private void btnQuerry_Click(object sender, EventArgs e){//判斷在容器panel上的控件 屬性值 enabled為true的控件里的內(nèi)容不能為空foreach (Control c1 in panel2.Controls){if ((c1 is ComboBox||c1 is TextBox)&&c1 .Enabled ==true){if (c1 .Text.Trim()==""){MessageBox.Show("請將信息填寫完整!", "提示");return;}}}GroupFindtemplateFacade FGroupFind = new GroupFindtemplateFacade();//實例化外觀層GroupFindtemplate groupInfo = new GroupFindtemplate();//實例化實體層//為實體層賦值groupInfo.Dbtable = GetDbTableName();groupInfo.CboFiled1 =GetEndlishFromFiled( CboFiled1.Text.Trim()); //字段需要采用中英轉(zhuǎn)換的方法groupInfo.CboFiled2 =GetEndlishFromFiled( CboFiled2.Text.Trim());groupInfo.CboField3 = CboFiled3.Text.Trim();groupInfo.CboMark1 = CboMark1.Text.Trim();groupInfo.CboMark2 = CboMark2.Text.Trim();groupInfo.CboMark3 = CboMark3.Text.Trim();groupInfo.Cbotent1 = txtCbotent1.Text.Trim();groupInfo.Cbotent2 = txtCbotent2.Text.Trim();groupInfo.Cbotent3 = txtCbotent3.Text.Trim();groupInfo.Relationship1 = GetEndlishFromFiled(cboConbination1.Text.Trim());groupInfo.Relationship2 = GetEndlishFromFiled(cboConbination2.Text.Trim());bool flag = false;flag = FGroupFind.GroupFindtemplate(groupInfo);if (flag==true){MessageBox.Show("查找成功!");DataTable dt = new DataTable();dt = FGroupFind.GroupFindTable(groupInfo);dgv.DataSource = dt;dgv.AllowUserToAddRows = false;}else{MessageBox.Show("無法查詢您輸入的信息,請重新輸入!");}}//清空private void btnClear_Click(object sender, EventArgs e){Clear();//調(diào)用封裝好的清空方法DataTable Table = null;dgv.DataSource = Table;LoadControl();//控件初始化方法}//清空的方法private void Clear(){foreach (Control c1 in panel2.Controls){if (c1 is ComboBox||c1 is TextBox ){c1.Text = "";}}cboConbination1.Text = "";cboConbination2.Text = "";}//控件初始化方法private void LoadControl(){CboFiled2.Enabled = false;CboFiled3.Enabled = false;CboMark2.Enabled = false;CboMark3.Enabled = false;txtCbotent2.Enabled = false;txtCbotent3.Enabled = false;cboConbination1.Enabled = false;cboConbination2.Enabled = false;}//窗體加載的方法private void frmGroupFindFather_Load(object sender, EventArgs e){LoadControl();//調(diào)用控件初始化方法}//當(dāng)?shù)谝恍械奈谋咎畛渫暾?#xff0c;第一個組合關(guān)系被激活private void txtCbotent1_TextChanged_1(object sender, EventArgs e){if (CboFiled1.Text != "" && CboMark1.Text != "" && txtCbotent1.Text != ""){cboConbination1.Enabled = true;}}//當(dāng)選擇第一個組合關(guān)系時 出現(xiàn)第二行信息框private void cboConbination1_SelectedIndexChanged_1(object sender, EventArgs e){if (cboConbination1.Text != ""){CboFiled2.Enabled = true;CboMark2.Enabled = true;txtCbotent2.Enabled = true;}}//當(dāng)?shù)诙械奈谋咎畛渫暾?#xff0c;第二個組合關(guān)系被激活private void txtCbotent2_TextChanged(object sender, EventArgs e){if (CboFiled2.Text != "" && CboMark2.Text != "" && txtCbotent2.Text != ""){cboConbination2.Enabled = true;}}//當(dāng)選擇第二個組合關(guān)系時 出現(xiàn)第三行信息框private void cboConbination2_SelectedIndexChanged_1(object sender, EventArgs e){if (cboConbination2.Text != ""){CboFiled3.Enabled = true;CboMark3.Enabled = true;txtCbotent3.Enabled = true;}}//構(gòu)造一個沒有任何返回值的虛方法 來根據(jù)字段內(nèi)容出現(xiàn)相應(yīng)的下拉內(nèi)容public virtual void addcontent(ComboBox file,ComboBox mark){ }#region 以下三個方法是根據(jù)字段的內(nèi)容添加符號內(nèi)容public void CboFiled1_SelectedIndexChanged(object sender, EventArgs e){addcontent(CboFiled1, CboMark1);}public void CboFiled2_SelectedIndexChanged(object sender, EventArgs e){addcontent(CboFiled2, CboMark2);}public void CboFiled3_SelectedIndexChanged(object sender, EventArgs e){addcontent(CboFiled3, CboMark3);}#endregion//定義一個數(shù)據(jù)庫中不同表的名字的虛方法 在子窗體中進(jìn)行重寫,需要查詢哪個表 就返回該表的表名public virtual string GetDbTableName(){return "";}//轉(zhuǎn)換中文字符為英文字符,在字窗體就進(jìn)行重寫public virtual string GetEndlishFromFiled(string cbo){return "";}

:父窗體的其他層編碼方式與一般窗體編碼形式類似,區(qū)別較大的就是DAL層。在這里,小編使用了存儲過程。


2、然后創(chuàng)建具體實現(xiàn)特定功能窗口,即子窗體。

在子窗體中對父窗體里的虛方法進(jìn)行重寫,滿足不同子窗體實現(xiàn)不同的、具體的功能。下面以Line_Info表為例:

//方法重寫:根據(jù)字段 添加操作符public override void addcontent(ComboBox cbofiled, ComboBox cbomark){switch (cbofiled.Text){case "用戶名":case "性別":case "狀態(tài)":cbomark.Text = "";cbomark.Items.Clear();cbomark.Items.Add("=");cbomark.Items.Add("<>");break;case "卡號":cbomark.Text = "";cbomark.Items.Clear();cbomark.Items.Add("=");cbomark.Items.Add("<>");cbomark.Items.Add(">");cbomark.Items.Add("<");break;}}//方法重寫:獲取數(shù)據(jù)庫中表的名字的方法public override string GetDbTableName(){return "Line_Info";}//方法重寫:將中文轉(zhuǎn)換成數(shù)據(jù)庫中相應(yīng)字段的方法public override string GetEndlishFromFiled(string cbo){switch (cbo){case "用戶名":return "UserID"; case "性別":return "sex";case "狀態(tài)":return "status";case "卡號":return "cardno";case "或":return "OR";case "且":return "AND";default:return "";}}

:其余的事件和方法在父窗體中已有定義,在子窗體中無需再寫了。

? ? 看了上面的分享,是不是感覺模板方法模式能為我們程序設(shè)計節(jié)省不少代碼呢。在程序設(shè)計過程中,恰當(dāng)?shù)倪\用設(shè)計模式能達(dá)到事半功倍的效果呢。

希望本文能對您有所幫助哦^.^

總結(jié)

以上是生活随笔為你收集整理的在一个程序设计里,不同的功能窗口有着相似的功能实现方式,可采用设计模式---模板方法模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。