最近在敲大話設計模式中的c#**.我是在看uml圖去敲**的.由於uml圖中沒有畫出客戶端的圖.首先你先設計出各個類.就好像是你要做飯先把各個料備好.導致寫客戶端的**時,很是費力.不清楚該怎麼寫.沒有一點的章法.總是蒙幾句.最後執行出來了,感覺就是
對的,也不知道自己是怎麼寫出來的.讓我從頭寫一次.和上次的感覺還是一樣的.我仔細分析了一下.
關於為什麼不會寫客戶端.我感覺這不是乙個單純的編碼問題.也不是你對語言的理解不深刻.
其實是你對程式的過程理解不深刻,對各個類的職能不理解.對物件導向不理解.
我這裡只討論控制台程式.
比如乙個程式你不會寫客戶端,其實你就是不知道客戶是如何呼叫它的.
這個物件導向的技術有很大關係.你的程式已近都把你將要用的類,功能編寫完畢了.那麼客戶端是什麼呢?
其實就是你如何去例項化這些類,那些類該例項化,在那個時候例項化.讓他們變成能工作的具體物件.然後
是如何利用這些物件的方法.也就是功能.
我們往往感到困惑的地方就是如何例項化這些類.很多的時候客戶端要體現oo的多型特徵.要用父類去實
例化子類,如果你直接運用了子類例項化自己.其實反映出來的就是你對多型的不理解.為什麼要用多型,
個人理解一是:為了程式的靈活性,父類可以例項化很多的子類,不用乙個乙個的判斷我要用到那個子類,
然後再去例項化,減輕了客戶端的負擔.二是: 為了方便呼叫,呼叫的時候,我客戶端不需要知道你到底是那個
子類的方法,只需要呼叫父類的同樣的方法,就能控制子類.
能快速高效的把客戶端寫好,證明這個程式的思路你就已近理解了.下面舉乙個例子來說明一下:
就拿設計模式中的《介面卡模式》來說(c#)
1: //抽象父類球員,每個人都有進攻,防守方法
2: abstractclass player
3:
9: publicabstract
void attack();
10: publicabstract
void defense();
11: }
1: //具體球員前鋒類
2: class forwards : player
3:
7:
8: publicoverride
void attack()
9: 進攻", name);
11: }
12: publicoverride
void defense()
13:
16:
17: }
1: //具體球員後衛類,繼承player
2: class guard : player
3:
7: publicoverride
void attack()
8: 進攻 ", name);
10: }
11: publicoverride
void defense()
12:
15: }
1: //外籍球員類,注意沒有繼承player,說明他直接和其他隊員不能溝通
2: class foreigncenter
3:
8: set
9: }
10: publicvoid jingong()
11: 進攻 ", name);
13: }
14: publicvoid fangshou()
15: 防守 " ,name);
17: }
18: }
1: //外籍球員的翻譯人員.繼承player,說明是他和其他球員溝通
2: class translator : player
3:
11: publicoverride
void attack()
12:
15: publicoverride
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投入執行一兩年後,反應速度急遽下降,在進行乙個簡單的儲存或刪除業務時都要花較長時間,甚至讓使用的醫務人員也難以忍受,這時就應該考慮採用胖客戶端了。所謂胖客戶端,這裡是指將常用的...