界面與後臺邏輯完全分離,單例模式,接口
阿新 • • 發佈:2019-01-02
數據源 toa 聲明 urn one 保留 div code 接口
界面與後臺邏輯完全分離的方法可以防止我們繞過很多坑,避免很多錯誤,下面我自己總結下:
首先我們實現前臺界面是這樣的一個界面:實現點擊添加的時候,把文本框的東西添加到list中,點擊顯示和添加後顯示的是一樣,點擊新窗體的時候,實現form1 的數據。其實我們可以用一個中間的變量,傳給新窗體,我們現在不用這種方法,我們用如下方法:
我們準備數據源,添加一個Testdata類,一開始的時候,我們不繼承接口,只是單純的一個Testdata類,這個數據是測試數據,插入代碼:
public class Testdata : ITruedata//測試數據 { List<string> _datas = new List<string>() { "test 1","test 2"}; public void Add(string item) { _datas.Add("test" + item); } public string[] Select() { return _datas.ToArray(); } }
form1的後臺代碼邏輯,為了方便,我把整個代碼拷貝下來,添加了註釋說明,輸入如下代碼:
/// <summary> /// 界面與數據完全分離。form1到form2,保留數據, /// </summary> public partial class Form1 : Form { public Form1() { InitializeComponent(); }
//方法改變只要更改這個聲明即可,不需要修改其他的,實現了完全分離 ITruedata data = MyClass.data; ITruedata data1 = MyClass.data1;/// <summary> /// 添加按鈕 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnAdd_Click(object sender, EventArgs e) { //load data.Add(DateTime.Now.ToString()); //show listBox1.DataSource = data.Select(); } /// <summary> /// 顯示按鈕 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnShow_Click(object sender, EventArgs e) { listBox1.DataSource = data.Select(); } /// <summary> /// 新窗體按鈕 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnWin_Click(object sender, EventArgs e) { Form2 fm = new Form2(); fm.ShowDialog(); } /// <summary> /// 添加2 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { data1.Add(DateTime.Now.ToString()); //show listBox1.DataSource = data.Select(); } /// <summary> /// 新窗體2 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button2_Click(object sender, EventArgs e) { Form2 fm = new Form2(); fm.ShowDialog(); } }
我們在form2中,只有一個列表,我們把form1界面的值傳給form2,
form2的代碼:
public partial class Form2 : Form { public Form2() { InitializeComponent(); } ITruedata data =MyClass.data; private void Form2_Load(object sender, EventArgs e) { //load var data1 = data.Select(); //show listBox1.DataSource = data1; } }
我們把數據類提取成接口,只聲明不實現,在派生類下實現:
public interface ITruedata //數據接口 { void Add(string item); string[] Select(); }
我們可以把測試數據改為真實的數據,Truedata一開始的時候也是單純的一個類,我們不加繼承接口,假如真實的數據是這樣的:
public class Truedata : ITruedata//真 { List<string> _datas = new List<string>() { "i‘m 1","i‘m 2"}; public void Add(string item) { _datas.Add(item); } public string[] Select() { return _datas.ToArray(); } }
最重要的一點,就是建一個類,聲明靜態的,保證只實例化一次,也可以用單例模式,這樣才能保證新窗體的數據不改變,
public class MyClass { ////舊的不提取接口 //public static Truedata data1 = new Truedata(); ////新的 //public static Testdata data = new Testdata(); //提取接口 //舊的 public static ITruedata data1 = new Truedata(); //新的 public static ITruedata data = new Testdata(); }
總結如下圖:上面的黑色的是很多個窗體,bag是單例模式或者是接口,下面是各種數據庫的連接,這樣可以實現一個程序可以實現多個數據庫的切換,湊時間我寫一個實現多個數據庫連接的例子
最下面這個圖,就是我以上的的代碼總結。
界面與後臺邏輯完全分離,單例模式,接口