關於客戶端編寫的問題

2021-08-25 13:32:54 字數 4252 閱讀 3822

最近在敲大話設計模式中的c#**.我是在看uml圖去敲**的.由於uml圖中沒有畫出客戶端的圖.

導致寫客戶端的**時,很是費力.不清楚該怎麼寫.沒有一點的章法.總是蒙幾句.最後執行出來了,感覺就是

對的,也不知道自己是怎麼寫出來的.讓我從頭寫一次.和上次的感覺還是一樣的.我仔細分析了一下.

關於為什麼不會寫客戶端.我感覺這不是乙個單純的編碼問題.也不是你對語言的理解不深刻.

其實是你對程式的過程理解不深刻,對各個類的職能不理解.對物件導向不理解.

我這裡只討論控制台程式.

比如乙個程式你不會寫客戶端,其實你就是不知道客戶是如何呼叫它的.

這個物件導向的技術有很大關係.你的程式已近都把你將要用的類,功能編寫完畢了.那麼客戶端是什麼呢?

其實就是你如何去例項化這些類,那些類該例項化,在那個時候例項化.讓他們變成能工作的具體物件.然後

是如何利用這些物件的方法.也就是功能.

我們往往感到困惑的地方就是如何例項化這些類.很多的時候客戶端要體現oo的多型特徵.要用父類去實

例化子類,如果你直接運用了子類例項化自己.其實反映出來的就是你對多型的不理解.為什麼要用多型,

個人理解一是:為了程式的靈活性,父類可以例項化很多的子類,不用乙個乙個的判斷我要用到那個子類,

然後再去例項化,減輕了客戶端的負擔.二是: 為了方便呼叫,呼叫的時候,我客戶端不需要知道你到底是那個

子類的方法,只需要呼叫父類的同樣的方法,就能控制子類.

能快速高效的把客戶端寫好,證明這個程式的思路你就已近理解了.下面舉乙個例子來說明一下:

就拿設計模式中的《介面卡模式》來說(c#)

首先你先設計出各個類.就好像是你要做飯先把各個料備好.

1: //抽象父類球員,每個人都有進攻,防守方法
2:     abstract

class player

3:
9:         public

abstract

void attack();

10:         public

abstract

void defense();

11:     }
1: //具體球員前鋒類
2:     class forwards : player
3:
7:
8:         public

override

void attack()

9:          進攻", name);
11:         }
12:         public

override

void defense()

13:
16:
17:     }
1: //具體球員後衛類,繼承player
2:     class guard : player
3:
7:         public

override

void attack()

8:          進攻 ", name);
10:         }
11:         public

override

void defense()

12:
15:     }
1:  //外籍球員類,注意沒有繼承player,說明他直接和其他隊員不能溝通
2:     class foreigncenter
3:
8:             set
9:         }
10:         public

void jingong()

11:         進攻 ", name);
13:         }
14:         public

void fangshou()

15:         防守 " ,name);
17:         }
18:     }
1: //外籍球員的翻譯人員.繼承player,說明是他和其他球員溝通
2:     class translator : player
3:
11:         public

override

void attack()

12:
15:         public

override

void defense()

16:
19:     }
所以的料都備好以後.開始做飯:也就是寫客戶端.

首先要打球,我們就要有隊員.

(1)例項化隊員,隊員就包括前鋒,後衛,中鋒都要有

player f = new forwards("巴蒂爾");

player g = new guard("阿爾斯通");

這裡很明顯的一點就是用父類去例項化子類的構造方法.能讓人很好的理解.這些人都是球員.體現了多型.這樣做.當有特殊條件的時候,就可以用特殊條件例項化(見試驗二).方便吧.

(2)對於中鋒因為他是乙個外籍球員,我們當然不能和其他人一樣對待.注意剛才我們寫類的時候,中鋒沒有繼承player,而是翻譯

說明我們要例項化的時候,就是給外籍中鋒配乙個翻譯.

player ym = new translator("姚明");

這個翻譯讓姚明幹什麼,姚明就去幹什麼(這個本人感覺很像是**模式).

(3)然後就是下鍋了,誰有什麼本事就使出來.能髮甜的髮甜,發辣的發辣.

也就是呼叫他們的方法.

1: f.attack();
2: f.defense();
3: g.attack();
4: g.defense();
5: ym.attack();
6: ym.defense();
結果如下:

試驗一:

前面說用父類去例項化子類,那麼我們可不可以用子類例項化自己呢?當然可以,這個體現了"黎克特制代換原則".子類必需能替換它的父類.

**如下:

forwards f = new forwards("巴蒂爾");

guard g = new guard("阿爾斯通");

結果和剛才的一樣:

這就說明在客戶端的編寫過程中,其實能達到效果的不只是一種,你要選擇最方便,最有效的方式.

試驗二:

那麼用父類去例項化子類有什麼好處呢?當然 這個主要是體現多型性.在例項化的子模擬較多的時候是比較實用的

比如我們要選擇例項化了球員時 .這樣就有很好的價值了》

**

1:        player p=null;  //修改之處.將p初始化為null.
2:             console.writeline("請選擇球員");
3:             string type = console.readline();
4:
5:             switch (type)
6:
14:             p.attack();
15:             p.defense();
16:             player ym = new translator("姚明");
17:             ym.attack();
18:             ym.defense();
總結:在寫客戶端的時候,我們要清晰我們需要那些材料,然後用怎麼樣的順序,方法去例項化它.最後讓例項化的

關於客戶端編寫的問題

最近在敲大話設計模式中的c 我是在看uml圖去敲 的.由於uml圖中沒有畫出客戶端的圖.導致寫客戶端的 時,很是費力.不清楚該怎麼寫.沒有一點的章法.總是蒙幾句.最後執行出來了,感覺就是 對的,也不知道自己是怎麼寫出來的.讓我從頭寫一次.和上次的感覺還是一樣的.我仔細分析了一下.關於為什麼不會寫客戶...

Python編寫FTP客戶端

之前寫過一篇ftp服務端的文章,這篇介紹一下客戶端吧。在使用虛擬機器的時候,由於虛擬機器工具沒安裝成功,所以我決定用ftp在主機與虛擬機器之間傳送檔案,在虛擬機器上開啟ftp服務,然後把客戶端放在主機上,當然也可以顛倒過來。服務端請參考 python實現ftp伺服器 import ftplib im...

關於胖客戶端

目前his系統由於業務複雜,要進行大量的運算,而且his系統在執行一段時間後,資料量激增,資料庫占用空間增長很快,導致his投入執行一兩年後,反應速度急遽下降,在進行乙個簡單的儲存或刪除業務時都要花較長時間,甚至讓使用的醫務人員也難以忍受,這時就應該考慮採用胖客戶端了。所謂胖客戶端,這裡是指將常用的...