软件构造学习笔记-第九周、第十周
因為本周五開始五一假期,所以只有一節軟件構造課。因為內容還屬于創建模式、結構模式、行為模式。將該堂課的內容整合到本博客中。本周的重點是程序開發模式,在寫代碼之前首先充分考慮采用哪種模式更有利于開發、維護。采用合適的設計模式幫助理清思路,明確目標,有“事半功倍”之效果。編寫可復用代碼需要更多的精力投入。
框架層面的復用
1.可分為白盒框架和黑盒框架
白盒框架:通過子類型和重寫方法實現擴展,對應模板模式
黑盒框架:通過插件接口實現擴展(本質上是委托),對應策略模式和觀察模式
2.復用白盒框架后,通過創建子類進行調用。
復用黑盒調用后,通過框架程序進行調用。
3.白盒框架和黑盒框架可復用代碼的位置
黑盒的可復用代碼在框架中,插件是自定義部分
白盒框架的可用代碼是子框架的父類
結構模式
1.適配器Adapter
① 使用具有中轉功能的接口,將不匹配的接口統一(將某個類或接口轉換為用戶期望的其他形式)
②Rectangle類是adapter,LegacyRectangle是adaptee
2.裝飾器Decorator
①讓類的操作產生更多的特性,對每一個特性構造子類,通過委派機制增加到對象上。
②例子:stack的三種附加功能
上面是接口,左邊是被擴充的類,右邊是裝飾。裝飾類中將基礎操作,比如push、pop、size操作,通過引用委托到左邊的被擴充類完成。
裝飾類委托的類不同,可以實現層層裝飾的效果。比如在實現SecureStack時,將其父類StackDecorator指向UndoStack,則實現的SecureStack就同時具有了UndoStack功能。如果同時,將UndoStack的父類指向LockedStack,UndoStack就具有了LockedStack功能。
裝飾類只能使用接口中的操作。
具體例子:
注:t無法使用undo方法,只能使用接口中的push、pop、size方法。
3.外觀模式Facade
①組合接口成一個統一的接口,Lab3中有體現。
4.代理(Proxy)模式
①某個對象比較私密/敏感/浪費資源,不希望被客戶端直接訪問。設置proxy在二者間建立防火墻。本應該直接訪問真實對象,但是代價太大,所以創建并訪問代理對象(和真實對象有同樣的接口)以降低代價。需要真實對象時再通過委托訪問真實對象。
②代理模式的例子
③適配器模式和代理模式的區別
適配器模式的目的是消除不兼容,以客戶端期望的統一的方式建立聯系。接口不同。
代理模式的目的是隔離對復雜對象的訪問,降低代價。接口相同。
行為模式
1.策略模式Strategy
①某個接口(通用)有多個實現,使用委托,根據不同實際情況進行調用切換。
2.模板模式Template method
①使用繼承和重寫實現。一個類作為模板,用子類進行繼承和擴充。共性的步驟在抽象類內公共實現,差異化的步驟在各個子類中實現。
3.迭代器Iterator
①用迭代器對集合進行操作??蛻舳讼M闅v被放入容器/集合類的一組ADT對象,無需關心容器的具體類型。即是不管對象被放進哪里,都提供同樣的遍歷方式。
②迭代器是可變類。使用時集合中的當前對象有兩個引用,一個來自集合,另一個來自迭代器。所以不使用迭代器遍歷時不能刪除元素,即只能使用迭代器的remove進行刪除。
4.觀察者(Observer)模式
①類似于廣播的一對多模式。Sbuject維護一個Observer的集合,應該具有Attach、Detach(添加和刪除Observer)的操作,和Notify(改變Observer,Subject調用Observer的功能)的操作。
②觀察者模式的例子
其中Observer的Subject屬性可以去掉,代表可以觀測任意“偶像”
③Java提供Observable接口和Observer接口。
5.訪問者(Visitor)模式
①本質上將數據和作用于數據上的某些特定操作分離開來。
②為ADT預留一個將來可擴展功能的“接入點”(Element的accept方法),外部實現的功能代碼可以在不改變ADT本身的情況下通過委托接入ADT。
③分為Visitor類和Element類。針對不同子類型的element,分別實現visit操作。Element類的accept(Visitor)與特定的Visitor子類聯系起來,允許其對自己的數據操作。
④存在雙向委托,即Visitor和Element接口相互調用。
⑤例子
⑥Visitor模式在特定ADT上執行特定操作,但是該操作不在ADT內部實現,而實委托到獨立的Visitor對象。客戶端可以靈活地擴展/改變Visitor的操作而不影響ADT。
⑦策略模式和訪問者模式的區別
二者都是通過委托建立兩個對象的動態聯系。但是Visitor強調的是外部定義某種對ADT的操作,該操作和ADT自身關系不大,只是訪問ADT,故ADT內部只需要開放accept(Visitor)即可,客戶端在外部調用。策略模式強調對ADT內部某些功能相應算法的靈活替換,這些算法是ADT功能的重要組成部分,只不過是委托到外部而已。
Visitor是站在外部客戶端角度,靈活增加對ADT的不同操作;Strategy站在內部ADT的角度,靈活變化對其內部功能的不同配置。
創建模式
1.工廠模式(虛擬構造器)
①當客戶端不知道要創建哪個具體類的實現,或者不想在客戶端代碼中指明要具體創建的實例時,使用工廠方法。定義一個用于創建對象的接口,讓其子類覺得實例化哪一個類,從而使一個類的實例化延遲到其子類。
②該模式中,每一個工廠只創建某一種類型的產品。
③工廠方法舉例:
常規情況下 Product p = new ProductTwo();
工廠模式下 Product p = new ConcreteTwo.makeObject();
④將工廠類的方法設置成static,則不需要創建工廠類實例也能創建產品。
2.抽象工廠模式
①提供接口以創建一組互相依賴的對象,但不需要指明其具體類。抽象工廠負責創建每個組成部分,遵循各組成部分之間的固定搭配。例如窗口分為1類型和2類型,滾動條分為1類型和2類型。提供兩個工廠類,一個創建窗口1和滾動條1,另一個創建窗口2和滾動條2。抽象工廠方法可以同時創建窗口和滾動條,并且實現它們的固定組合(類似于套餐)。
②該模式中,每一個工廠創建多種類型的產品。
③本質上是把多類的工廠方法組合在一起,特點是遵循固定搭配規則。
可維護性的度量與構造原則
1.軟件維護的種類:糾錯性、適應性、完善性、預防性
2.提高可維護性的方法:
從原則上通過模塊化。
OO設計原則(SOLID、GRASP)
OO設計模式
基于狀態的構造技術
基于語法的構造技術(正則表達式)
模塊化設計
1.模塊化設計的原則:直接映射、盡可能少的接口、盡可能小的接口、顯式接口、信息隱藏
2.耦合和內聚
3.OO設計原則-SOLID
①單一責任原則
不應該有多于一個的原因讓ADT發生變化,否則就應該拆分開。責任就是變化的原因,即一個類承擔一個責任。
②開放-封閉原則
對擴展性的開發,對修改的封閉。模塊的行為是可擴展的,從而該模塊可表現出新的行為以滿足需求的變化。但是模塊自身的代碼是不應被修改的,擴展模塊行為的一般途徑是修改模塊的內部實現,如果一個模塊不能被修改,那么它通常被認為是具有固定的行為。
針對多個實現抽象出一個具體的接口,如果有新的實現,繼承該接口即可。從而支持了對擴展的開放。
③Liskov替換原則***
子類型必須能夠替換其父類型,派生類必須能夠通過其基類的接口使用,客戶端無需了解二者之間的差異。
④依賴轉置原則
盡量依賴接口,而不是接口的具體實現類。抽象的模塊不應該依賴于具體的模塊,具體應該依賴于抽象。
⑤接口分離原則
只提供客戶端必需的接口。
總結
以上是生活随笔為你收集整理的软件构造学习笔记-第九周、第十周的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 竹壳茶的功效与作用、禁忌和食用方法
- 下一篇: 炒年糕的功效与作用、禁忌和食用方法