1. 程式人生 > >界面與後臺邏輯完全分離,單例模式,接口

界面與後臺邏輯完全分離,單例模式,接口

數據源 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是單例模式或者是接口,下面是各種數據庫的連接,這樣可以實現一個程序可以實現多個數據庫的切換,湊時間我寫一個實現多個數據庫連接的例子

最下面這個圖,就是我以上的的代碼總結。

技術分享圖片

技術分享圖片

技術分享圖片

界面與後臺邏輯完全分離,單例模式,接口