freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

軟件設(shè)計(jì)的五大原則-資料下載頁(yè)

2025-08-15 23:47本頁(yè)面
  

【正文】 f f ( )L a m p– Button依賴(lài)于抽象的接口ButtonServer(向該接口發(fā)消息)。 ButtonServer提供一些抽象的方法, Button類(lèi)通過(guò)這些接口可以開(kāi)啟或關(guān)掉一些東西。 – Lamp也依賴(lài)于 ButtonServer接口(從此接口派生),提供具體的實(shí)現(xiàn)。 部分代碼: // include class Button{ ButtonServer * bs。 public: void poll( )。 }。 // void Button::poll( ){ if(/* mechanism for detecting turnOn mand */) bsturnOn( )。 else if((/* mechanism for detecting turnOff mand */) bsturnOff( )。 } // class ButtonServer{ public: virtual void turnOn()=0。 virtual void turnOff()=0。 }。 // class Lamp:public ButtonServer{ public: void turnOn()。 void turnOff()。 }。 // void Lamp::turnOn(){ /*codes for turn on a specific device*/ } void Lamp::turnOff(){ /*codes for turn off a specific device*/ } ? 分析: – 上述設(shè)計(jì)使得 Button可以控制所有愿意實(shí)現(xiàn) ButtonServer接口的設(shè)備,甚至是一個(gè)尚未開(kāi)發(fā)出來(lái)的設(shè)備。 質(zhì)疑: – 這樣的設(shè)計(jì)是不是強(qiáng)加了這樣一個(gè)約束 ——所有需要被 Button控制的對(duì)象一定要實(shí)現(xiàn) ButtonServer類(lèi)。 – 如果我的設(shè)備還希望能夠被另一個(gè)對(duì)象控制,比如 Switch控制,怎么辦? – 這種設(shè)計(jì)是不是將 Button對(duì) Lamp的依賴(lài)轉(zhuǎn)嫁成了 Lamp對(duì) Button的依賴(lài)呢?(畢竟Lamp只能被一種 Button控制也是不好的) 抗辯: – 上述質(zhì)疑不成立。 Button依賴(lài)于 ButtonServer接口,但是接口并不依賴(lài)于 Button,也就是說(shuō)任何知道如何操作 ButtonServer接口的對(duì)象都可以操作 Lamp。 – 也許需要改進(jìn)的僅僅是 ButtonServer這樣一個(gè)有些 “ 誤導(dǎo)性 ” 的名字,我們可以將這個(gè)名字該得更加抽象一些,例如: SwitchableDevice 5. 接口隔離原則( ISP) ? 陳述: – 不應(yīng)該強(qiáng)迫客戶(hù)依賴(lài)于他們不用的方法 – 一個(gè)類(lèi)的不內(nèi)聚的 “ 胖接口 ” 應(yīng)該被分解成多組方法,每一組方法都服務(wù)于一組不同的客戶(hù)程序。 ? 先說(shuō)一個(gè)例子: class Door{ public: virtual void Lock( )=0。 virtual void Unlock( )=0。 virtual bool IsDoorOpen( )=0。 }。 ? Door可以加鎖、解鎖、而且可以感知自己是開(kāi)還是關(guān); ? Door是抽象基類(lèi),客戶(hù)程序可以依賴(lài)于抽象而不是具體的實(shí)現(xiàn) 增加功能 如果門(mén)打開(kāi)時(shí)間過(guò)長(zhǎng),它就會(huì)報(bào)警。(比如賓館客房的門(mén)) 為了實(shí)現(xiàn)上述新增功能,我們要求 Door與一個(gè)已有的 Timer對(duì)象進(jìn)行交互 class Timer{ public: void Register(int timeout,TimerClient* client)。 }。 class TimerClient{ public: virtual void TimerOut( )。 }。 ?如果一個(gè)對(duì)象希望得到超時(shí)通知,它可以調(diào)用 Timer的 Register函數(shù)。 ?該函數(shù)有兩個(gè)參數(shù),一個(gè)是超時(shí)時(shí)間,另一個(gè)是指向TimerClient對(duì)象的指針,此對(duì)象的 TimerOut函數(shù)會(huì)在超時(shí)時(shí)被調(diào)用 我們?nèi)绾螌?TimerClient和 TimedDoor聯(lián)系起來(lái)? 問(wèn)題 一種常見(jiàn)的解決方案如下: T i m e r i n t e r f a c e T i m e r C l i e n tD o o r+ T i m e o u tT i m e d D o o r?問(wèn)題 ——接口污染 在 Door接口中加入新的方法( Timeout),而這個(gè)方法僅僅只為它的一個(gè)子類(lèi)帶來(lái)好處。 ——如果每次子類(lèi)需要一個(gè)新方法時(shí)它都被加到基類(lèi)接口中,基類(lèi)接口將很快變胖。 胖接口將導(dǎo)致 SRP, LSP被違反,從而導(dǎo)致脆弱、僵化 ? 客戶(hù)的反作用力: – 通常接口的變化將導(dǎo)致 client的改變 – 但是很多時(shí)候,接口之所以變化是因?yàn)榭蛻?hù)需要他們變化 ? Client對(duì) interface具有反作用力! class Timer{ public: void Register(int timeout, int timeOutId, TimerClient* client)。 }。 class TimerClient{ public: virtual void TimerOut(int timeOutId )。 }。 TimedDoor的多個(gè)超時(shí)請(qǐng)求問(wèn)題,導(dǎo)致 Timer接口做出下面的調(diào)整: TimedDoor對(duì) Timer接口的影響會(huì)傳遞到 Door接口,從而導(dǎo)致所有 Door都受到此影響,而且這一影響還會(huì)影響到 Door的所有 Clients——牽一發(fā)動(dòng)全身 ? 解決之道: – 使用委托 T i m e r i n t e r f a c e T i m e r C l i e n t+ T i m e o u tD o o r T i m e r A d a p t e r+ T i m e o u tT i m e d D o o r+ D o o r T i m e O u tD o o r C r e a t e s Class TimedDoor:public Door{ public: virtual void DoorTimeOut(int timeOutID)。 }。 class DoorTimeAdapter:public TimerClient{ TimedDooramp。 itsTimedDoor。 public: DoorTimerAdapter(TimedDooramp。 theDoor):itsTimedDoor(theDoor){} vitual void TimeOut(int timeOutId){ (timeOutId)。 } }。 ? 解決之道(續(xù)): – 使用多繼承 T i m e r i n t e r f a c e T i m e r C l i e n t+ T i m e o u tT i m e d D o o r+ T i m e O u tD o o rClass TimedDoor:public Door, public TimerClient{ public: virtual void DoorTimeOut(int timeOutID)。 }
點(diǎn)擊復(fù)制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1