| ? ? 前段時間學習了一些設計模式,最近在做項目的過程中恰巧用到了其中的一個--模板方法模式。這個模式在程序設計過程中可是為小編省去了不少的代碼量呢。具體是怎樣應用的呢?接下來小編為您分享。 |
? ? 前面博文中小編已經分享了模板方法模式的理論點,下面將分享如何把這些理論點應用到實際的項目開發過程中。
※功能需求
? ? 在程序設計過程中,有兩個以上的窗口是實現組合查詢功能,且基本結構都包括字段名、操作符、要查詢的內容,以及操作符之間的組合關系,查出結果后將其導出、且導出的文件類型為Excel表。
? ? 在實現上面的功能時,考慮到這些窗口有類似的實現流程,所以就采用了一個設計模式----模板方法模式來實現功能需求。
1、首先建立一個模板,即父窗體。
把不同窗體中具有的相同結構都放在父窗體中,且在父窗體的代碼中編寫它們公有的事件和方法,以及實現特定功能的模板方法----虛方法,涉及到的具體的實現功能的查詢方法需要在具體實現功能的窗體中去寫[類似于接口一樣,只提供抽象的方法,具體實現方法在D層中來實現。這里采用虛方法,在子窗體中進行重寫]。在這個模板里,小編寫的方法和事件有以下這些:
namespace UI
{public partial
class frmGroupFindFather : Form
{public frmGroupFindFather(){InitializeComponent();}private void btnQuerry_Click(object sender
, EventArgs e
){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()); 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();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();}private void txtCbotent1_TextChanged_1(object sender
, EventArgs e
){if (CboFiled1
.Text
!= "" && CboMark1
.Text
!= "" && txtCbotent1
.Text
!= ""){cboConbination1
.Enabled
= true;}}private void cboConbination1_SelectedIndexChanged_1(object sender
, EventArgs e
){if (cboConbination1
.Text
!= ""){CboFiled2
.Enabled
= true;CboMark2
.Enabled
= true;txtCbotent2
.Enabled
= true;}}private void txtCbotent2_TextChanged(object sender
, EventArgs e
){if (CboFiled2
.Text
!= "" && CboMark2
.Text
!= "" && txtCbotent2
.Text
!= ""){cboConbination2
.Enabled
= true;}}private void cboConbination2_SelectedIndexChanged_1(object sender
, EventArgs e
){if (cboConbination2
.Text
!= ""){CboFiled3
.Enabled
= true;CboMark3
.Enabled
= true;txtCbotent3
.Enabled
= true;}}public virtual
void addcontent(ComboBox file
,ComboBox mark
){ }#region 以下三個方法是根據字段的內容添加符號內容
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
public virtual string
GetDbTableName(){return "";}public virtual string
GetEndlishFromFiled(string cbo
){return "";}
注:父窗體的其他層編碼方式與一般窗體編碼形式類似,區別較大的就是DAL層。在這里,小編使用了存儲過程。
2、然后創建具體實現特定功能窗口,即子窗體。
在子窗體中對父窗體里的虛方法進行重寫,滿足不同子窗體實現不同的、具體的功能。下面以Line_Info表為例:
public override
void addcontent(ComboBox cbofiled
, ComboBox cbomark
){switch (cbofiled
.Text
){case "用戶名":case "性別":case "狀態":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;}}public override string
GetDbTableName(){return "Line_Info";}public override string
GetEndlishFromFiled(string cbo
){switch (cbo
){case "用戶名":return "UserID"; case "性別":return "sex";case "狀態":return "status";case "卡號":return "cardno";case "或":return "OR";case "且":return "AND";default:return "";}}
注:其余的事件和方法在父窗體中已有定義,在子窗體中無需再寫了。
| ? ? 看了上面的分享,是不是感覺模板方法模式能為我們程序設計節省不少代碼呢。在程序設計過程中,恰當的運用設計模式能達到事半功倍的效果呢。 |
希望本文能對您有所幫助哦^.^
總結
以上是生活随笔為你收集整理的在一个程序设计里,不同的功能窗口有着相似的功能实现方式,可采用设计模式---模板方法模式的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。