狠狠撸

狠狠撸Share a Scribd company logo
1 2014 HTC PROPRIETARY AND CONFIDENTIAL
2016
Design Pattern
Eric Lu
2 2014 HTC PROPRIETARY AND CONFIDENTIAL
Agenda
? Propose of this ppt
? What is Design Pattern
? UML
– Class Diagram
? Classify Design Patterns
– Creational
– Structural
– Behavioral
? Suggestions
3 2014 HTC PROPRIETARY AND CONFIDENTIAL
Propose of this ppt
? You will learn…
– What is Design Pattern
– What is Class Diagram
– Big picture of Design Patterns
? And
– Makes you interesting in Design Patterns!
4 2014 HTC PROPRIETARY AND CONFIDENTIAL
Design Pattern is …
? Why
– 重用公認優良設計,避免解決問題時重蹈覆轍
– 建立通用術語,分析設計時能有對問題的共識
– 幫我們分析,了解問題,避免過早處理細節
? What
– 在一個特定情境(context)中,針對重複出現問題所提出有效地解決方法
? When
– 套用時機
? 設計階段
– 了解客戶需求,完成分析工作(建立use case mode與domain model)後建立design model 時
? 實作階段
– 當設計階段套用design pattern的「作用力(force)」還不是很具體,只能先利用基本的物件導向
設計方法來設計物件與分配責任
– 在實作幾個功能(use case或user story)之後才慢慢發現可以藉由重構(refactoring)方法來套用
design pattern
? 設計時套用可能因為問題尚不清楚而過度設計,實作時重構比較保險 - Erich Gamma
– 選擇套用Scrum,一部分一部分重構
5 2014 HTC PROPRIETARY AND CONFIDENTIAL
Design Pattern is …
? How
– 藉由資料抽象(data abstraction)的方式來降低軟體的複雜度
? 封裝、繼承、多型(polymorphism)
? 類別(class)、抽象類別(abstract class定義通用)、介面(interface)
? 功能分解 (Divide & Conquer,主程式呼叫副程式完成工作 => 主程式只下達命令,副程式自己知道如
何完成工作)
? Expect
– 高內聚(tight cohesion)
? 副程式中的操作緊密相關
– 低偶合(weak coupling)
? 副程式間依賴性越低越好
– 目標
? 靈活性 : 當需求變動不須更改架構
? 強健性 : 更改可能產生bug ,降低更動的副作用
? 可維護性 : 權責區分細,影響範圍小,除錯容易
6 2014 HTC PROPRIETARY AND CONFIDENTIAL
Let’s Start ?
Wait a minute!!
7 2014 HTC PROPRIETARY AND CONFIDENTIAL
UML
? Purpose
– 描述現實問題
– 模式化複雜問題
? Class Diagram
– 封裝能見度(visibility)
? Public ( + )
? Protected ( # )
? Private ( - )
分析(Activity Diagram)
設計(Class Diagram)
部署(Deployment Diagrams)
8 2014 HTC PROPRIETARY AND CONFIDENTIAL
Class Diagram
? 記號
– Aggregation
– Composition
– Dependency
– Inheritance
? 有擁有關係
– 聚合 Aggregation (use-a)
? 部件可以單獨存在
? class Home { private Son eric;}
– 組合 Composition (has-a)
? 部件不能單獨存在
? 整體消失造成部份消失
? class Son { private Heart myheart;}
? 無擁有關係
– 相依 Dependency
? 傳遞訊息,功能面使用
? class Mother {
? void getMoney(){Father.getMoney();}
? void makeSleep(Son eric){eric.toSleep();}
? void shopping(){Money myMoney=new Money();}}
– 繼承 Inheritance (is-a)
? 上下階層
? class Son extends Father{}
9 2014 HTC PROPRIETARY AND CONFIDENTIAL
Classify Design Patterns
? 模式分類
– Creational: 建造類
? 如何 創建物件
? 如何有效率的產生、管理、操作物件
? Abstract Factory, Builder, Factory Method, Object Pool, Prototype, Singleton
– Structural:架構類
? 如何 結構關係
? 設計物件間的靜態結構,如何完成物件之間的繼承、實現與依賴關係,這關乎著系統設計出來是否健
壯(robust):像是易懂、易維護、易修改、耦合度低
? Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy, Private Class Data
– Behavioral:行為類
? 如何 達成行為
? 物件之間的合作行為構成了程式最終的行為,物件之間若有設計良好的行為互動,不僅使得程式執行
時更有效率,更可以讓物件的職責更為清晰、整個程式的動態結構(像是物件調度)更有彈性
? Chain of responsibility, Command, Interpreter, Iterator, Mediator, Memento, Observer, State, Strategy, Template.
Visitor
10 2014 HTC PROPRIETARY AND CONFIDENTIAL
Creational
創建物件
11 2014 HTC PROPRIETARY AND CONFIDENTIAL
Factory Method
? 延遲產出
– Context
? 有時候我們無法明確地知道要產生的類別,需使用那一種物件型態
– Problem
? 如何產生物件
– Force
? 讓次類別決定要實體化的類別為何
? 允許客戶端傳入參數來選擇所要產生的具體類別
– Solution
? 將產生物件的詳細步驟封裝於factory method,讓客戶端程式透過這個factory method來得到新的物件。
12 2014 HTC PROPRIETARY AND CONFIDENTIAL
Sample Factory Method
? How to Use
– Example in Android / JAVA
? 圖形介面框架中Button,有子類AppCompatButton,CompoundButton,如何實現由子類決定
– Consequence
13 2014 HTC PROPRIETARY AND CONFIDENTIAL
Factory Method
? How to Use
– Consequence
14 2014 HTC PROPRIETARY AND CONFIDENTIAL
Structural
結構關係
15 2014 HTC PROPRIETARY AND CONFIDENTIAL
Adapter
? 適應變化
– Context
? 有時候,即使一個已經存在的類別在功能上接近甚至完全符合客戶端的需求,但是卻因為與客戶端所
規範的介面不符,導致無法被直接重複使用
– Problem
? 重複使用一個既存的類別
– Force
? 把別人的物件整合到自己的 interface 中
? 當需要將兩個不合的物件一起使用,卻又不想更動到他們
– Solution
? 增加一個Adapter類,兼容兩個物件
16 2014 HTC PROPRIETARY AND CONFIDENTIAL
Adapter
? How to Use
– Example in Android / JAVA
? Iterator 中hasNext() next() remove() 操作不同collection
– Consequence
17 2014 HTC PROPRIETARY AND CONFIDENTIAL
Facade
? 統一門戶
– Context
? 為在系統太複雜的時候,user可能只需要各個子系統中部分功能,在不改變原有子系統前提下,將需
要功能提取出來
– Problem
? 如何使用子系統
– Force
? 為子系統中的一組介面提供一個一致的界面
– Solution 實作方法
? 提供一整組物件對外的介面,以統一對外界面並達到 loose couple 的功能
18 2014 HTC PROPRIETARY AND CONFIDENTIAL
Facade
? How to Use
– Example in Android / JAVA
? Database helper for DB Connection
– Consequence
19 2014 HTC PROPRIETARY AND CONFIDENTIAL
Behavioral
達成行為
20 2014 HTC PROPRIETARY AND CONFIDENTIAL
Command
? 封裝調用
– Context
? 有時候客戶端針對同一類型的事件或是請求動作,需要呼叫不同物件來處理,而這些物件的介面通常
都不相同。你可以將呼叫不同介面物件的方式直接寫在客戶端身上,但是這麼做每次只要有新的物件
加入都需要直接修改客戶端的程式碼,或是要繼承原有的客戶端然後在子類別內完成新增加的實作。
? 希望去除客戶端與被呼叫物件的耦合關係,增加系統的彈性,更進一步連選擇執行哪一個物件的某個
方法,以及在什麼執行點來啟動這個執行的動作這兩件事也可以彼此獨立
– Problem
? 如何發出請求給一個物件
– Force
? 避免在客戶端產生與型別有關的條件判斷式,但希望以相同的呼叫方式來呼叫不同介面的物件
? 動態配置實作請求的方式
– Solution
? 將請求封裝成物件。定義一個Command介面,包含一個execute方法。讓ConcreteCommand實作
Command介面,在execute方法中撰寫呼叫物件(Receiver)的程式碼。客戶端程式透過呼叫Command
介面的execute方法來發出請求給不同的物件
21 2014 HTC PROPRIETARY AND CONFIDENTIAL
Command
? How to Use
– Example in Android / JAVA
? Intent
– Consequence
22 2014 HTC PROPRIETARY AND CONFIDENTIAL
Template Method
? 封裝演算
– Context
? 將演算法骨架定義在一個方法中,而演算法本身用到的方法則定義在次類別中,讓次類別在不改變演
算法架構下重新定義某些步驟
– Problem
? 要如何表達擁有共同結構與行為,但卻有著些微行為差異的物件們
– Force
? 為了提供差異行為,如果讓子類別任意覆寫父類別的方法,則
– 父類別與子類別以及不同的子類別之間可能會存在重複程式碼
– 繼承架構所形成的程式碼將會不容易被理解
? 雖然將共同不變的行為定義在父類別之中可以達到重複使用程式碼的目的,若未加以特別區
隔則子類別還是可能在有意或無意的情況下覆寫定義在父類別中的共同行為
– Solution
? 在父類別中定義一個範本方法(template method)用以規範共用的行為。Template method將其執行過
程委託給數個hook method來完成,子類別可藉由覆寫這些hook method來達到提供不同行為的目的。
可將宣告成靜態template method以避免子類別將其覆蓋。
23 2014 HTC PROPRIETARY AND CONFIDENTIAL
Template Method
? How to Use
– Example in Android / JAVA
? 繼承
– Consequence
24 2014 HTC PROPRIETARY AND CONFIDENTIAL
Summarize
? 重點回顧
– Creational
? Factory
– Structural
? Adapter
? Fa?ade
? Decorator
– Behavioral
? Command
? Template Method
? Observer
25 2014 HTC PROPRIETARY AND CONFIDENTIAL
Suggestions
? 重構時再套用Design Pattern
? 找出變化,封裝變化(OCP Open-Closed Principle原則)
– 新的改變繼承自原有物件或界面縮小更動時影響
? 依介面設計程式(DIP Dependency-Inversion Principle原則)
– 上層class相依於底層改為上層與底層相依於一個界面
– 易於抽換底層與擴充
? 用物件聚合/合成代替類別繼承
– 可擴充性與程式碼的簡易性
– 合成搭配介面降低whole/part間耦合性
? 使用Switch時經常意味著可能該使用抽象
? DP並非絕對,當意義或功能上有更好方式,可依需求修改
? 學習遷移的重要性
? 訓練思考過程
26 2014 HTC PROPRIETARY AND CONFIDENTIAL
And More…
? 如果我已經知道以往所有DP,在自己設計/發掘DP時有哪些方向?
– 正確使用基本物件導向觀念,而不濫用
? Class、Object、Interface、Inheritance、Polymorphism、Composition、Delegation
– 物件導向設計原則 (SOLID)
? Single-Responsibility Principle、 Open-Closed Principle、 Liskov Substitution Principle、Narrow
Inheritance Interface Principle、Dependency-Inversion Principle
– 模組化設計原則
? Reuse-Release Equivalence Principle、Common-Reuse Principle、Common-Clouse Principle、Acyclic-
Dependencies Principe、Stable-Dependencies Principle
27 2014 HTC PROPRIETARY AND CONFIDENTIAL
物件導向設計原則(SOLID)
? SRP (Single Responsibility)
– 一個設計只做一件事 避免過多事項混雜
? OCP (Closed for Modification; Open for Extension)
– 使用Abstraction與Polymorphism 將靜態結構改為動態,增加擴充彈性與重用性
? LSP (Liskov Substitution)
– 當子類的instance可以取代父類,才有is-a的關係
? ISP (interface-segregation)
– 使用多個專門的接口比使用單一總接口要好
– 沒有客戶應該被迫依賴於它不使用方法
? DIP (Dependency-Inversion)
– 要求客戶端依賴於抽象耦合
2016.8.1 Design Pattern Eric
29 2014 HTC PROPRIETARY AND CONFIDENTIAL
References
? Class Diagram
– http://www.claudiodesio.com/ooa&d/UMLSR_EN/DSR/CLD.htm
? SOLID
– https://zh.wikipedia.org/wiki/SOLID_(%E9%9D%A2%E5%90%91%E5%AF%B9%E
8%B1%A1%E8%AE%BE%E8%AE%A1)
? 搞笑談軟工 (大部分觀念出自此 請支持原著)
– http://teddy-chen-tw.blogspot.tw
30 2014 HTC PROPRIETARY AND CONFIDENTIAL
xxx 模式
? 四字箴言
– Context (What) 情境
– Question (When to use)要解決的問題本身
– Force : 會想採用此方法的關鍵
– Solution 實作方法
– Consequence(Effect) 套用解決方案後結果 並說明限制優劣勢 應是中立
– How to Use
? Example in Android / JAVA?

More Related Content

Similar to 2016.8.1 Design Pattern Eric (20)

关於产物经理的角色与职责
关於产物经理的角色与职责关於产物经理的角色与职责
关於产物经理的角色与职责
Cloud Chen
?
20150206 aic machine learning
20150206 aic machine learning20150206 aic machine learning
20150206 aic machine learning
Meng-Ru (Raymond) Tsai
?
商业模式创新起手式
商业模式创新起手式商业模式创新起手式
商业模式创新起手式
基欽 劉
?
Discover agile(agile tour)-owen chen-iji
Discover agile(agile tour)-owen chen-ijiDiscover agile(agile tour)-owen chen-iji
Discover agile(agile tour)-owen chen-iji
Odd-e
?
狈产的敏捷
狈产的敏捷狈产的敏捷
狈产的敏捷
oulan
?
狈产的敏捷
狈产的敏捷狈产的敏捷
狈产的敏捷
Lanhui Ou
?
用户体验的 要素 很好的资料
用户体验的 要素 很好的资料用户体验的 要素 很好的资料
用户体验的 要素 很好的资料
grey0511
?
Part a02 a段架構師_發揮四項假設性思維_twok
Part a02 a段架構師_發揮四項假設性思維_twokPart a02 a段架構師_發揮四項假設性思維_twok
Part a02 a段架構師_發揮四項假設性思維_twok
ccp_cheng
?
Design Pattern
Design PatternDesign Pattern
Design Pattern
newegg
?
Getting Real
Getting RealGetting Real
Getting Real
rogerwang
?
2020 11-27 Taiwan DDD Conference
2020 11-27 Taiwan DDD Conference2020 11-27 Taiwan DDD Conference
2020 11-27 Taiwan DDD Conference
Guan-Rong Huang
?
Djt22 justinliu djt.
Djt22 justinliu djt.Djt22 justinliu djt.
Djt22 justinliu djt.
drewz lin
?
Djt22 justinliu djt.
Djt22 justinliu djt.Djt22 justinliu djt.
Djt22 justinliu djt.
drewz lin
?
Drupal 是好的生財工具嗎?網站標案經驗分享 台灣i運動資訊平台(Drupal as a Cash Cow for Prodution House? ...
Drupal 是好的生財工具嗎?網站標案經驗分享 台灣i運動資訊平台(Drupal as a Cash Cow for Prodution House? ...Drupal 是好的生財工具嗎?網站標案經驗分享 台灣i運動資訊平台(Drupal as a Cash Cow for Prodution House? ...
Drupal 是好的生財工具嗎?網站標案經驗分享 台灣i運動資訊平台(Drupal as a Cash Cow for Prodution House? ...
Souyi Yang
?
网路2.0时代情报蒐集术
网路2.0时代情报蒐集术网路2.0时代情报蒐集术
网路2.0时代情报蒐集术
基欽 劉
?
SCRUM
SCRUMSCRUM
SCRUM
ZongYing Lyu
?
专案开发实务
专案开发实务专案开发实务
专案开发实务
Chen Kuan-Ming (Eric)
?
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Java SE 7 技術手冊投影片第 05 章  - 物件封裝Java SE 7 技術手冊投影片第 05 章  - 物件封裝
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Justin Lin
?
厂肠谤耻尘深入浅出
厂肠谤耻尘深入浅出厂肠谤耻尘深入浅出
厂肠谤耻尘深入浅出
Taien Wang
?
数位科技工具在自我学习上的运用
数位科技工具在自我学习上的运用数位科技工具在自我学习上的运用
数位科技工具在自我学习上的运用
基欽 劉
?
关於产物经理的角色与职责
关於产物经理的角色与职责关於产物经理的角色与职责
关於产物经理的角色与职责
Cloud Chen
?
商业模式创新起手式
商业模式创新起手式商业模式创新起手式
商业模式创新起手式
基欽 劉
?
Discover agile(agile tour)-owen chen-iji
Discover agile(agile tour)-owen chen-ijiDiscover agile(agile tour)-owen chen-iji
Discover agile(agile tour)-owen chen-iji
Odd-e
?
狈产的敏捷
狈产的敏捷狈产的敏捷
狈产的敏捷
oulan
?
狈产的敏捷
狈产的敏捷狈产的敏捷
狈产的敏捷
Lanhui Ou
?
用户体验的 要素 很好的资料
用户体验的 要素 很好的资料用户体验的 要素 很好的资料
用户体验的 要素 很好的资料
grey0511
?
Part a02 a段架構師_發揮四項假設性思維_twok
Part a02 a段架構師_發揮四項假設性思維_twokPart a02 a段架構師_發揮四項假設性思維_twok
Part a02 a段架構師_發揮四項假設性思維_twok
ccp_cheng
?
Design Pattern
Design PatternDesign Pattern
Design Pattern
newegg
?
2020 11-27 Taiwan DDD Conference
2020 11-27 Taiwan DDD Conference2020 11-27 Taiwan DDD Conference
2020 11-27 Taiwan DDD Conference
Guan-Rong Huang
?
Djt22 justinliu djt.
Djt22 justinliu djt.Djt22 justinliu djt.
Djt22 justinliu djt.
drewz lin
?
Djt22 justinliu djt.
Djt22 justinliu djt.Djt22 justinliu djt.
Djt22 justinliu djt.
drewz lin
?
Drupal 是好的生財工具嗎?網站標案經驗分享 台灣i運動資訊平台(Drupal as a Cash Cow for Prodution House? ...
Drupal 是好的生財工具嗎?網站標案經驗分享 台灣i運動資訊平台(Drupal as a Cash Cow for Prodution House? ...Drupal 是好的生財工具嗎?網站標案經驗分享 台灣i運動資訊平台(Drupal as a Cash Cow for Prodution House? ...
Drupal 是好的生財工具嗎?網站標案經驗分享 台灣i運動資訊平台(Drupal as a Cash Cow for Prodution House? ...
Souyi Yang
?
网路2.0时代情报蒐集术
网路2.0时代情报蒐集术网路2.0时代情报蒐集术
网路2.0时代情报蒐集术
基欽 劉
?
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Java SE 7 技術手冊投影片第 05 章  - 物件封裝Java SE 7 技術手冊投影片第 05 章  - 物件封裝
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Justin Lin
?
厂肠谤耻尘深入浅出
厂肠谤耻尘深入浅出厂肠谤耻尘深入浅出
厂肠谤耻尘深入浅出
Taien Wang
?
数位科技工具在自我学习上的运用
数位科技工具在自我学习上的运用数位科技工具在自我学习上的运用
数位科技工具在自我学习上的运用
基欽 劉
?

2016.8.1 Design Pattern Eric

  • 1. 1 2014 HTC PROPRIETARY AND CONFIDENTIAL 2016 Design Pattern Eric Lu
  • 2. 2 2014 HTC PROPRIETARY AND CONFIDENTIAL Agenda ? Propose of this ppt ? What is Design Pattern ? UML – Class Diagram ? Classify Design Patterns – Creational – Structural – Behavioral ? Suggestions
  • 3. 3 2014 HTC PROPRIETARY AND CONFIDENTIAL Propose of this ppt ? You will learn… – What is Design Pattern – What is Class Diagram – Big picture of Design Patterns ? And – Makes you interesting in Design Patterns!
  • 4. 4 2014 HTC PROPRIETARY AND CONFIDENTIAL Design Pattern is … ? Why – 重用公認優良設計,避免解決問題時重蹈覆轍 – 建立通用術語,分析設計時能有對問題的共識 – 幫我們分析,了解問題,避免過早處理細節 ? What – 在一個特定情境(context)中,針對重複出現問題所提出有效地解決方法 ? When – 套用時機 ? 設計階段 – 了解客戶需求,完成分析工作(建立use case mode與domain model)後建立design model 時 ? 實作階段 – 當設計階段套用design pattern的「作用力(force)」還不是很具體,只能先利用基本的物件導向 設計方法來設計物件與分配責任 – 在實作幾個功能(use case或user story)之後才慢慢發現可以藉由重構(refactoring)方法來套用 design pattern ? 設計時套用可能因為問題尚不清楚而過度設計,實作時重構比較保險 - Erich Gamma – 選擇套用Scrum,一部分一部分重構
  • 5. 5 2014 HTC PROPRIETARY AND CONFIDENTIAL Design Pattern is … ? How – 藉由資料抽象(data abstraction)的方式來降低軟體的複雜度 ? 封裝、繼承、多型(polymorphism) ? 類別(class)、抽象類別(abstract class定義通用)、介面(interface) ? 功能分解 (Divide & Conquer,主程式呼叫副程式完成工作 => 主程式只下達命令,副程式自己知道如 何完成工作) ? Expect – 高內聚(tight cohesion) ? 副程式中的操作緊密相關 – 低偶合(weak coupling) ? 副程式間依賴性越低越好 – 目標 ? 靈活性 : 當需求變動不須更改架構 ? 強健性 : 更改可能產生bug ,降低更動的副作用 ? 可維護性 : 權責區分細,影響範圍小,除錯容易
  • 6. 6 2014 HTC PROPRIETARY AND CONFIDENTIAL Let’s Start ? Wait a minute!!
  • 7. 7 2014 HTC PROPRIETARY AND CONFIDENTIAL UML ? Purpose – 描述現實問題 – 模式化複雜問題 ? Class Diagram – 封裝能見度(visibility) ? Public ( + ) ? Protected ( # ) ? Private ( - ) 分析(Activity Diagram) 設計(Class Diagram) 部署(Deployment Diagrams)
  • 8. 8 2014 HTC PROPRIETARY AND CONFIDENTIAL Class Diagram ? 記號 – Aggregation – Composition – Dependency – Inheritance ? 有擁有關係 – 聚合 Aggregation (use-a) ? 部件可以單獨存在 ? class Home { private Son eric;} – 組合 Composition (has-a) ? 部件不能單獨存在 ? 整體消失造成部份消失 ? class Son { private Heart myheart;} ? 無擁有關係 – 相依 Dependency ? 傳遞訊息,功能面使用 ? class Mother { ? void getMoney(){Father.getMoney();} ? void makeSleep(Son eric){eric.toSleep();} ? void shopping(){Money myMoney=new Money();}} – 繼承 Inheritance (is-a) ? 上下階層 ? class Son extends Father{}
  • 9. 9 2014 HTC PROPRIETARY AND CONFIDENTIAL Classify Design Patterns ? 模式分類 – Creational: 建造類 ? 如何 創建物件 ? 如何有效率的產生、管理、操作物件 ? Abstract Factory, Builder, Factory Method, Object Pool, Prototype, Singleton – Structural:架構類 ? 如何 結構關係 ? 設計物件間的靜態結構,如何完成物件之間的繼承、實現與依賴關係,這關乎著系統設計出來是否健 壯(robust):像是易懂、易維護、易修改、耦合度低 ? Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy, Private Class Data – Behavioral:行為類 ? 如何 達成行為 ? 物件之間的合作行為構成了程式最終的行為,物件之間若有設計良好的行為互動,不僅使得程式執行 時更有效率,更可以讓物件的職責更為清晰、整個程式的動態結構(像是物件調度)更有彈性 ? Chain of responsibility, Command, Interpreter, Iterator, Mediator, Memento, Observer, State, Strategy, Template. Visitor
  • 10. 10 2014 HTC PROPRIETARY AND CONFIDENTIAL Creational 創建物件
  • 11. 11 2014 HTC PROPRIETARY AND CONFIDENTIAL Factory Method ? 延遲產出 – Context ? 有時候我們無法明確地知道要產生的類別,需使用那一種物件型態 – Problem ? 如何產生物件 – Force ? 讓次類別決定要實體化的類別為何 ? 允許客戶端傳入參數來選擇所要產生的具體類別 – Solution ? 將產生物件的詳細步驟封裝於factory method,讓客戶端程式透過這個factory method來得到新的物件。
  • 12. 12 2014 HTC PROPRIETARY AND CONFIDENTIAL Sample Factory Method ? How to Use – Example in Android / JAVA ? 圖形介面框架中Button,有子類AppCompatButton,CompoundButton,如何實現由子類決定 – Consequence
  • 13. 13 2014 HTC PROPRIETARY AND CONFIDENTIAL Factory Method ? How to Use – Consequence
  • 14. 14 2014 HTC PROPRIETARY AND CONFIDENTIAL Structural 結構關係
  • 15. 15 2014 HTC PROPRIETARY AND CONFIDENTIAL Adapter ? 適應變化 – Context ? 有時候,即使一個已經存在的類別在功能上接近甚至完全符合客戶端的需求,但是卻因為與客戶端所 規範的介面不符,導致無法被直接重複使用 – Problem ? 重複使用一個既存的類別 – Force ? 把別人的物件整合到自己的 interface 中 ? 當需要將兩個不合的物件一起使用,卻又不想更動到他們 – Solution ? 增加一個Adapter類,兼容兩個物件
  • 16. 16 2014 HTC PROPRIETARY AND CONFIDENTIAL Adapter ? How to Use – Example in Android / JAVA ? Iterator 中hasNext() next() remove() 操作不同collection – Consequence
  • 17. 17 2014 HTC PROPRIETARY AND CONFIDENTIAL Facade ? 統一門戶 – Context ? 為在系統太複雜的時候,user可能只需要各個子系統中部分功能,在不改變原有子系統前提下,將需 要功能提取出來 – Problem ? 如何使用子系統 – Force ? 為子系統中的一組介面提供一個一致的界面 – Solution 實作方法 ? 提供一整組物件對外的介面,以統一對外界面並達到 loose couple 的功能
  • 18. 18 2014 HTC PROPRIETARY AND CONFIDENTIAL Facade ? How to Use – Example in Android / JAVA ? Database helper for DB Connection – Consequence
  • 19. 19 2014 HTC PROPRIETARY AND CONFIDENTIAL Behavioral 達成行為
  • 20. 20 2014 HTC PROPRIETARY AND CONFIDENTIAL Command ? 封裝調用 – Context ? 有時候客戶端針對同一類型的事件或是請求動作,需要呼叫不同物件來處理,而這些物件的介面通常 都不相同。你可以將呼叫不同介面物件的方式直接寫在客戶端身上,但是這麼做每次只要有新的物件 加入都需要直接修改客戶端的程式碼,或是要繼承原有的客戶端然後在子類別內完成新增加的實作。 ? 希望去除客戶端與被呼叫物件的耦合關係,增加系統的彈性,更進一步連選擇執行哪一個物件的某個 方法,以及在什麼執行點來啟動這個執行的動作這兩件事也可以彼此獨立 – Problem ? 如何發出請求給一個物件 – Force ? 避免在客戶端產生與型別有關的條件判斷式,但希望以相同的呼叫方式來呼叫不同介面的物件 ? 動態配置實作請求的方式 – Solution ? 將請求封裝成物件。定義一個Command介面,包含一個execute方法。讓ConcreteCommand實作 Command介面,在execute方法中撰寫呼叫物件(Receiver)的程式碼。客戶端程式透過呼叫Command 介面的execute方法來發出請求給不同的物件
  • 21. 21 2014 HTC PROPRIETARY AND CONFIDENTIAL Command ? How to Use – Example in Android / JAVA ? Intent – Consequence
  • 22. 22 2014 HTC PROPRIETARY AND CONFIDENTIAL Template Method ? 封裝演算 – Context ? 將演算法骨架定義在一個方法中,而演算法本身用到的方法則定義在次類別中,讓次類別在不改變演 算法架構下重新定義某些步驟 – Problem ? 要如何表達擁有共同結構與行為,但卻有著些微行為差異的物件們 – Force ? 為了提供差異行為,如果讓子類別任意覆寫父類別的方法,則 – 父類別與子類別以及不同的子類別之間可能會存在重複程式碼 – 繼承架構所形成的程式碼將會不容易被理解 ? 雖然將共同不變的行為定義在父類別之中可以達到重複使用程式碼的目的,若未加以特別區 隔則子類別還是可能在有意或無意的情況下覆寫定義在父類別中的共同行為 – Solution ? 在父類別中定義一個範本方法(template method)用以規範共用的行為。Template method將其執行過 程委託給數個hook method來完成,子類別可藉由覆寫這些hook method來達到提供不同行為的目的。 可將宣告成靜態template method以避免子類別將其覆蓋。
  • 23. 23 2014 HTC PROPRIETARY AND CONFIDENTIAL Template Method ? How to Use – Example in Android / JAVA ? 繼承 – Consequence
  • 24. 24 2014 HTC PROPRIETARY AND CONFIDENTIAL Summarize ? 重點回顧 – Creational ? Factory – Structural ? Adapter ? Fa?ade ? Decorator – Behavioral ? Command ? Template Method ? Observer
  • 25. 25 2014 HTC PROPRIETARY AND CONFIDENTIAL Suggestions ? 重構時再套用Design Pattern ? 找出變化,封裝變化(OCP Open-Closed Principle原則) – 新的改變繼承自原有物件或界面縮小更動時影響 ? 依介面設計程式(DIP Dependency-Inversion Principle原則) – 上層class相依於底層改為上層與底層相依於一個界面 – 易於抽換底層與擴充 ? 用物件聚合/合成代替類別繼承 – 可擴充性與程式碼的簡易性 – 合成搭配介面降低whole/part間耦合性 ? 使用Switch時經常意味著可能該使用抽象 ? DP並非絕對,當意義或功能上有更好方式,可依需求修改 ? 學習遷移的重要性 ? 訓練思考過程
  • 26. 26 2014 HTC PROPRIETARY AND CONFIDENTIAL And More… ? 如果我已經知道以往所有DP,在自己設計/發掘DP時有哪些方向? – 正確使用基本物件導向觀念,而不濫用 ? Class、Object、Interface、Inheritance、Polymorphism、Composition、Delegation – 物件導向設計原則 (SOLID) ? Single-Responsibility Principle、 Open-Closed Principle、 Liskov Substitution Principle、Narrow Inheritance Interface Principle、Dependency-Inversion Principle – 模組化設計原則 ? Reuse-Release Equivalence Principle、Common-Reuse Principle、Common-Clouse Principle、Acyclic- Dependencies Principe、Stable-Dependencies Principle
  • 27. 27 2014 HTC PROPRIETARY AND CONFIDENTIAL 物件導向設計原則(SOLID) ? SRP (Single Responsibility) – 一個設計只做一件事 避免過多事項混雜 ? OCP (Closed for Modification; Open for Extension) – 使用Abstraction與Polymorphism 將靜態結構改為動態,增加擴充彈性與重用性 ? LSP (Liskov Substitution) – 當子類的instance可以取代父類,才有is-a的關係 ? ISP (interface-segregation) – 使用多個專門的接口比使用單一總接口要好 – 沒有客戶應該被迫依賴於它不使用方法 ? DIP (Dependency-Inversion) – 要求客戶端依賴於抽象耦合
  • 29. 29 2014 HTC PROPRIETARY AND CONFIDENTIAL References ? Class Diagram – http://www.claudiodesio.com/ooa&d/UMLSR_EN/DSR/CLD.htm ? SOLID – https://zh.wikipedia.org/wiki/SOLID_(%E9%9D%A2%E5%90%91%E5%AF%B9%E 8%B1%A1%E8%AE%BE%E8%AE%A1) ? 搞笑談軟工 (大部分觀念出自此 請支持原著) – http://teddy-chen-tw.blogspot.tw
  • 30. 30 2014 HTC PROPRIETARY AND CONFIDENTIAL xxx 模式 ? 四字箴言 – Context (What) 情境 – Question (When to use)要解決的問題本身 – Force : 會想採用此方法的關鍵 – Solution 實作方法 – Consequence(Effect) 套用解決方案後結果 並說明限制優劣勢 應是中立 – How to Use ? Example in Android / JAVA?

Editor's Notes

  • #5: 在設計架構,選擇該使用abstract class /interface時可以幫助你了解問題本質
  • #6: 功能分解 -主程式呼叫副程式完成工作 => 幫你一個一個列出找出下堂課路徑 : 主程式很累,一個路徑改要通知全部人 -主程式只下達命令,副程式自己知道如何完成工作 =>給你全部課堂路徑表,自己走 : 只要改路徑表
  • #9: Is-a : Son is–a Father = is a kind of Has-a : home Has-a Son Aggregation : Son 可以單獨存在,家中沒Son 沒差 Composition: Son 的心臟不能單獨存在,Son 沒心臟有差
  • #12: Factory :一個工廠流程 做一隻手機要什麼零件 Abstract Factory :整個產線流程 產生不同手機需要什麼工廠 提供一個介面以建立一群相關的物件,但卻不明確指定這些物件所屬的類別(concrete classes) 增加物件建立時的彈性 當系統預建立新的一群物件時,不需要改變既有的程式碼,只需擴充原本的類別 就像多型的概念,確保不同情況下,用同個介面使用不同物件
  • #16: 在不修改既有介面的情况下将一介面转成另一个介面,藉以整合不同的物件。
  • #18: 為一个子系统内眾多的服务提供一个统一的介面,藉以降低子系统间的耦合力。
  • #21: 将物件的需求封装為一个类别,藉此提供更弹性的操作。例如将请求作排队处理(辩耻别耻别)及提供请求回覆(耻苍诲辞)的功能。
  • #23: 将物件的状态自物件本身独立出来,以提高物件行為变化的弹性。
  • #31: Questions?