Slide 1

Slide 1 text

Design Patterns © 2014 Luster

Slide 2

Slide 2 text

Me ㇼِ๊ ⼵ዾ⳻⭞ፒ㊴ӫٯ ⹔㕲೸⁰ഥ KBTPO!MVTUFSUFDIOFU

Slide 3

Slide 3 text

Reference 啓❔˗ፇ

Slide 4

Slide 4 text

ᄎⵠ"CTUSBDUJPO ౽⭉&ODBQTVMBUJPO ઑ঎1PMZNPSQIJTN ␷უ*OIFSJUBODF Object Oriented Basic

Slide 5

Slide 5 text

⽤用情境,學設計模式

Slide 6

Slide 6 text

ฟˠฟˠ̴ո

Slide 7

Slide 7 text

⽁ጊⵠெு⼷࿿ӷٻ ᘳኛ㟓ఇ

Slide 8

Slide 8 text

Class Diagram MallardDuck display() { } swim() quack() RedheadDuck display() { } swim() quack()

Slide 9

Slide 9 text

Class Diagram MallardDuck display() { } swim() quack() RedheadDuck display() { } swim() quack() Duck

Slide 10

Slide 10 text

Class Diagram MallardDuck display() { } display() { } RedheadDuck Duck swim() quack()

Slide 11

Slide 11 text

Class Diagram MallardDuck display() { } display() { } RedheadDuck Duck swim() quack() display()

Slide 12

Slide 12 text

Class Diagram MallardDuck display() { } display() { } RedheadDuck Duck swim() quack() display() ⭶⭶৙৙ ₇㐤ḑ㚰୏

Slide 13

Slide 13 text

ᴴኁക॒ℍᬘ᥺ᨰ㡲 ࿩ϻ᜜எቹচ㌾ᛵƭ

Slide 14

Slide 14 text

ଆₘ⇯ሰđಆڿϱ ᜫᎭɿ࠭ ྍ

Slide 15

Slide 15 text

࿩ٯ㌾⬕ ࢭᬛ㐰՟%VDLˑְʽGMZ ቿᝢ ဈ፞⎋့ḝ㚼୛௭ፚ㑞˺ ⨪⇐ޭḝ㡧 “ ” ⽁ጊⵠெு⼷࿿፞㋀ӷٻ ⛝㚐ഄ⁼റ+BTPO

Slide 16

Slide 16 text

MallardDuck display() { } ⭶⭶৙৙ ₇㐤ḑ㚰୏ Duck quack() display() swim() RedheadDuck display() { } ن Class Diagram

Slide 17

Slide 17 text

MallardDuck display() { } ⭶⭶৙৙ ₇㐤ḑ㚰୏ Duck quack() display() swim() RedheadDuck display() { } fly() Jason’s Class Diagram

Slide 18

Slide 18 text

ʮ಻ԟɓ˂ රЍ෧ᇭᎭ௞್ɰึ࠭ə- -|||

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

What’s happened ? Duck quack() display() swim() fly() RubberDuck quack() { 吱吱叫; } @Override display() { }

Slide 21

Slide 21 text

⎋့㡲 ʷ၂Ոӵ㎁Ջƭ

Slide 22

Slide 22 text

Duck quack() display() swim() fly() RubberDuck display() { } quack() { 吱吱叫; } @Override ˼ഌਣᙜ㡲⽾࿩௭ ၂3VCCFS%VDLḝGMZ ᄋ␼ჱ ௭҃ᄋ␼RVBDL ʷᖈ㡧 “ ”

Slide 23

Slide 23 text

Jason’s Class Diagram II Duck quack() display() swim() fly() RubberDuck quack() { 吱吱叫; } @Override display() { } fly() { // Do nothing! } @Override

Slide 24

Slide 24 text

ਣᏋ̴รְٙӲ 㗚᧾㚼㡲 ᬺˀፚٰ㡲ˀፚ㑞㡲ˀፚᡛ᝼㡲 ⽾ٙፚਣ͹ہ㡺 “ ” FireDuck quack() { // Do nothing! } @Override display() { } fly() { // Do nothing! } @Override swim() { // Do nothing! } @Override

Slide 25

Slide 25 text

բᴫ⎋့ᄧδ㚼୛⨸ᨫ㡲 ፚ௜▋ʾ՘ܦ̇⎧㟈㡺㡮৥⽜㡯 A. ⁼ීᾗࢭ৥϶ᘫ㐰՟ˑて⪹ B. ण⨸፮ḝ⨸ᨫˀዀሪⲇ C. ࿩ϻˀⓣⲌ㚼୛ⶴ▬ D. ㌬̴ศἏဈ፞㚼୛ḝӴ⾪⨸ᨫ E. 㚼୛ˀⓣڇዛٙ㑞ٰٙ F. ሪⲇፚ᭎ʷ㖍׈Ӵ⹇㡲⼠࿨Ӽ̨㚼୛ˀ༙⬕ḝሪⲇ

Slide 26

Slide 26 text

ਣᏋ̴รְӲ ፐ৥㚼୛ “ ” ࿭⑅ ፐ৥ḝ⨸ᨫ “ ” ᚢₓ㚼ḝ ⨸ᨫٙˀʷ▋ “ ”

Slide 27

Slide 27 text

ط౏Ⴛὺ⇟Ⴈὺӵ֥ٚൔđପ໡⃈҂൞ေ

Slide 28

Slide 28 text

஼Ꭽᄲݟ ط౏Ⴛὺ⇟Ⴈὺӵ֥ٚൔđପ໡⃈҂൞ေ

Slide 29

Slide 29 text

ᨫ˺⽣ӣ ቹচʷ϶୛㐰՟㡲௭㏴⬙ெˀ㌾⬕ḝ⨸ᨫ࿭ ቹচʷ϶ቹ⨸ᨫ㡲௭㏴てቹ௄⬣୛㐰՟㡲 “ ” ⮦⮦բᴫ̣㎁ਣ͹㡺

Slide 30

Slide 30 text

Duck display() swim() Flyable fly() Quackable quack() MallardDuck RedheadDuck RubberDuck ᨫ˺⽣ӣ ቹচʷ϶୛㐰՟㡲௭㏴⬙ெˀ㌾⬕ḝ⨸ᨫ࿭ ቹচʷ϶ቹ⨸ᨫ㡲௭㏴てቹ௄⬣୛㐰՟㡲 “ ” ⮦⮦բᴫ̣㎁ਣ͹㡺

Slide 31

Slide 31 text

Duck display() swim() Flyable fly() Quackable quack() MallardDuck display() RedheadDuck display() RubberDuck display() ᨫ˺⽣ӣ ቹচʷ϶୛㐰՟㡲௭㏴⬙ெˀ㌾⬕ḝ⨸ᨫ࿭ ቹচʷ϶ቹ⨸ᨫ㡲௭㏴てቹ௄⬣୛㐰՟㡲 “ ” ⮦⮦բᴫ̣㎁ਣ͹㡺

Slide 32

Slide 32 text

Duck display() swim() Flyable fly() Quackable quack() MallardDuck fly() display() RedheadDuck fly() display() RubberDuck display() ᨫ˺⽣ӣ ቹচʷ϶୛㐰՟㡲௭㏴⬙ெˀ㌾⬕ḝ⨸ᨫ࿭ ቹচʷ϶ቹ⨸ᨫ㡲௭㏴てቹ௄⬣୛㐰՟㡲 “ ” ⮦⮦բᴫ̣㎁ਣ͹㡺

Slide 33

Slide 33 text

Duck display() swim() Flyable fly() Quackable quack() MallardDuck fly() display() quack() RedheadDuck fly() display() quack() RubberDuck display() quack() ᨫ˺⽣ӣ ቹচʷ϶୛㐰՟㡲௭㏴⬙ெˀ㌾⬕ḝ⨸ᨫ࿭ ቹচʷ϶ቹ⨸ᨫ㡲௭㏴てቹ௄⬣୛㐰՟㡲 “ ” ⮦⮦բᴫ̣㎁ਣ͹㡺

Slide 34

Slide 34 text

Duck display() swim() Flyable fly() Quackable quack() MallardDuck display() RedheadDuck display() RubberDuck display() ৳ሼ㡲⁼ීᾗて⪹˺ “ ” fly() quack() fly() quack() quack()

Slide 35

Slide 35 text

ਣᏋ΄ዑ+BTPO㡲΄⬕๶㞲б ہ㡺

Slide 36

Slide 36 text

設計守則 Design Principle

Slide 37

Slide 37 text

1 ಁℨ๿ͻ ᐆⴳڠỉざ׷ ܋װͷ౽⭉

Slide 38

Slide 38 text

ۃ Ù ڛ ʴፎ㑒

Slide 39

Slide 39 text

ۃ Ù ڛ ʴፎ㑒 ௕ⲇ׵٠Յ㡲ˍ௑⪝

Slide 40

Slide 40 text

ۃ Ù ڛ ௕ⲇ׵٠Յ㡲ˍ௑⪝ ʴፎ㑒

Slide 41

Slide 41 text

ۃ Ù ڛ ௕ⲇ׵٠Յ㡲ˍ௑⪝ ʴፎ㑒

Slide 42

Slide 42 text

ۃ Ù ڛ ʴፎ㑒 ௕ⲇ׵٠Յ㡲ˍ௑⪝

Slide 43

Slide 43 text

ۃ Ù ڛ ʴፎ㑒 ௕ⲇ׵٠Յ㡲ˍ௑⪝ 㚼୛㐰՟ ḗ⒅⨸ᨫ 㑞⨸⨸ᨫ

Slide 44

Slide 44 text

㚼୛㐰՟ ḗ⒅⨸ᨫ 㑞⨸⨸ᨫ 1 ಁⴳڠ܋װ ͷ౽⭉

Slide 45

Slide 45 text

౲ℨ๿ ፽ㄡಇύ㒘⓵౲ ͪ፽ㄡಇ౭Ъ⓵౲ 2

Slide 46

Slide 46 text

Program to an ! interface,! not an implementation. 2

Slide 47

Slide 47 text

1SPHSBNUPBOJOUFSGBDF Ẃᙛḝ༲ຄዑ 1SPHSBNUPBTVQFSUZQF

Slide 48

Slide 48 text

Example Soldier attack() Sniper attack() {! ! snipe();! } snipe() Stormtrooper attack() {! ! shoot();! } shoot() 4VQFSUZQF٨̨ዅ ၖⲨ㐤Փ࿡̗㍵

Slide 49

Slide 49 text

Program to an implement Sniper soldier = new Sniper(); soldier.attack();

Slide 50

Slide 50 text

Program to an interface Sniper soldier = new Sniper(); soldier.attack(); Soldier soldier = new Sniper(); soldier.attack();

Slide 51

Slide 51 text

Sniper soldier = new Sniper(); soldier.attack(); Soldier soldier = new Sniper(); soldier.attack(); Soldier soldier = getSoldier(); soldier.attack(); #FUUFSTPMVUJPO㡧 ࢡग⨬።㉖㡤ဆႍஂவⶻḑᬳ̲ Program to an interface

Slide 52

Slide 52 text

ࢄեᖇᇯ㚼୛

Slide 53

Slide 53 text

ḗ⒅⨸ᨫ 㑞⨸⨸ᨫ QuackBehavior quack() << interface >> FlyBehavior fly() << interface >>

Slide 54

Slide 54 text

ḗ⒅⨸ᨫ 㑞⨸⨸ᨫ QuackBehavior quack() << interface >> FlyBehavior fly() << interface >> Squeak quack() { 吱吱叫; } MuteQuack quack() { 不會叫; } Quack quack() { 呱呱叫; } FlyWithWings fly() { ⽤用翅膀飛; } FlyWithRocket fly() { ⽤用⽕火箭飛; } FlyNoWay fly() { 不會飛; }

Slide 55

Slide 55 text

Duck display() swim()

Slide 56

Slide 56 text

Duck display() swim() QuackBehavior quackBehavior FlyBehavior flyBehavior ḗ⒅⨸ᨫ 㑞⨸⨸ᨫ public abstract class Duck { QuackBehavior quackBehavior; FlyBehavior flyBehavior; }

Slide 57

Slide 57 text

Duck display() swim() performQuack() performFly() QuackBehavior quackBehavior FlyBehavior flyBehavior ḗ⒅⨸ᨫ 㑞⨸⨸ᨫ public abstract class Duck { QuackBehavior quackBehavior; FlyBehavior flyBehavior; ! public void performQuack() { quackBehavior.quack(); } public void performFly() {…} }

Slide 58

Slide 58 text

Duck display() swim() performQuack() performFly() QuackBehavior quackBehavior FlyBehavior flyBehavior ḗ⒅⨸ᨫ 㑞⨸⨸ᨫ public abstract class Duck { QuackBehavior quackBehavior; FlyBehavior flyBehavior; ! public void performQuack() { ! } public void performFly() {…} } quackBehavior.quack(); ㊕㆕ࢭኁ㡲 㚼୛ᱞࢭፚ௕୾ḝ⨸ᨫ㡲 ਫ਼ឳ㡮EFMFHBUF㡯⊸՟̘⢱ᱥ㡲 ⑉ˀዑ௕୾எ⏻ࢭ▅ഋ࿭୛㐰՟⪠㡧

Slide 59

Slide 59 text

public abstract class Duck { QuackBehavior quackBehavior; FlyBehavior flyBehavior; ! public void performQuack() { quackBehavior.quack(); } public void performFly() {…} } ⽾ਣ͹⮀எ㚼୛⨸ᨫḝ ு㕾ⲇቒ㡺

Slide 60

Slide 60 text

public abstract class Duck { QuackBehavior quackBehavior; FlyBehavior flyBehavior; ! public void performQuack() { quackBehavior.quack(); } public void performFly() {…} } public class MallardDuck extends Duck { ! public MallardDuck() { quackBehavior = new Quack(); flyBehavior = new FlyWithNoWings(); } ! public void display() {…} } ࢭ୛㐰՟ḝෆᕌී⪠

Slide 61

Slide 61 text

ᡐ⮦

Slide 62

Slide 62 text

public class DuckSimulator { ! public static void main(String[] args) { Duck mallard = new MallardDuck(); mallard.performQuack(); } }

Slide 63

Slide 63 text

public class DuckSimulator { ! public static void main(String[] args) { Duck mallard = new MallardDuck(); mallard.performQuack(); } } ۃ

Slide 64

Slide 64 text

׈ཙ⮀எ㚼୛⨸ᨫ

Slide 65

Slide 65 text

Duck display() swim() performQuack() performFly() QuackBehavior quackBehavior FlyBehavior flyBehavior public abstract class Duck { QuackBehavior quackBehavior; FlyBehavior flyBehavior; ! public void performQuack() { quackBehavior.quack(); } public void performFly() {…} ! }

Slide 66

Slide 66 text

public abstract class Duck { QuackBehavior quackBehavior; FlyBehavior flyBehavior; ! public void performQuack() { quackBehavior.quack(); } public void performFly() {…} ! } Duck display() swim() performQuack() performFly() QuackBehavior quackBehavior FlyBehavior flyBehavior setQuackBehavior() setFlyBehavior()

Slide 67

Slide 67 text

Duck display() swim() performQuack() performFly() QuackBehavior quackBehavior FlyBehavior flyBehavior setQuackBehavior() setFlyBehavior() public abstract class Duck { QuackBehavior quackBehavior; FlyBehavior flyBehavior; ! public void performQuack() { quackBehavior.quack(); } public void performFly() {…} ! public void setQuackBehavior( QuackBehavior behavior) { this.quackBehavior = behavior; } public void setFlyBehavior… }

Slide 68

Slide 68 text

ᡐ⮦

Slide 69

Slide 69 text

public class DuckSimulator { ! public static void main(String[] args) { Duck mallard = new MallardDuck(); mallard.performQuack(); mallard.setQuackBehavior(new Squeak()); mallard.performQuack(); } } ۃ

Slide 70

Slide 70 text

public class DuckSimulator { ! public static void main(String[] args) { Duck mallard = new MallardDuck(); mallard.performQuack(); mallard.setQuackBehavior(new Squeak()); mallard.performQuack(); } }

Slide 71

Slide 71 text

public class DuckSimulator { ! public static void main(String[] args) { Duck mallard = new MallardDuck(); mallard.performQuack(); mallard.setQuackBehavior(new Squeak()); mallard.performQuack(); } } ڛ

Slide 72

Slide 72 text

࿩ϻե൸б˺ܦ̇˼㡺

Slide 73

Slide 73 text

QuackBehavior quack() << interface >> Quack quack() { 呱; } MuteQuack quack() {} Squeak quack() { 吱; } FlyBehavior fly() << interface >> FlyWithWings fly() { 拍翅膀; } FlyNoWay fly() {} FlyWithRocket fly() { 噴射; } ௅⪑㚰୏⨬᨟

Slide 74

Slide 74 text

Duck QuackBehavior quack() << interface >> Quack quack() { 呱; } MuteQuack quack() {} Squeak quack() { 吱; } FlyBehavior fly() << interface >> FlyWithWings fly() { 拍翅膀; } FlyNoWay fly() {} FlyWithRocket fly() { 噴射; } MallardDuck display() swim() RedheadDuck display() swim() RubberDuck display() swim()

Slide 75

Slide 75 text

QuackBehavior quack() << interface >> Quack quack() { 呱; } MuteQuack quack() {} Squeak quack() { 吱; } FlyBehavior fly() << interface >> FlyWithWings fly() { 拍翅膀; } FlyNoWay fly() {} FlyWithRocket fly() { 噴射; } MallardDuck display() RedheadDuck display() RubberDuck display() Duck display() swim() ʫ▪ש

Slide 76

Slide 76 text

Duck display() swim() QuackBehavior quackBehavior FlyBehavior flyBehavior QuackBehavior quack() << interface >> Quack quack() { 呱; } MuteQuack quack() {} Squeak quack() { 吱; } FlyBehavior fly() << interface >> FlyWithWings fly() { 拍翅膀; } FlyNoWay fly() {} FlyWithRocket fly() { 噴射; } MallardDuck display() RedheadDuck display() RubberDuck display()

Slide 77

Slide 77 text

Duck display() swim() performQuack() performFly() QuackBehavior quackBehavior FlyBehavior flyBehavior QuackBehavior quack() << interface >> Quack quack() { 呱; } MuteQuack quack() {} Squeak quack() { 吱; } FlyBehavior fly() << interface >> FlyWithWings fly() { 拍翅膀; } FlyNoWay fly() {} FlyWithRocket fly() { 噴射; } ੒ឧ EFMFHBUF MallardDuck display() RedheadDuck display() RubberDuck display()

Slide 78

Slide 78 text

Duck display() swim() performQuack() performFly() QuackBehavior quackBehavior FlyBehavior flyBehavior setQuackBehavior() setFlyBehavior() QuackBehavior quack() << interface >> Quack quack() { 呱; } MuteQuack quack() {} Squeak quack() { 吱; } FlyBehavior fly() << interface >> FlyWithWings fly() { 拍翅膀; } FlyNoWay fly() {} FlyWithRocket fly() { 噴射; } ּཌྷ⭴ஂ MallardDuck display() RedheadDuck display() RubberDuck display()

Slide 79

Slide 79 text

Duck display() swim() performQuack() performFly() QuackBehavior quackBehavior FlyBehavior flyBehavior setQuackBehavior() setFlyBehavior() QuackBehavior quack() << interface >> Quack quack() { 呱; } MuteQuack quack() {} Squeak quack() { 吱; } FlyBehavior fly() << interface >> FlyWithWings fly() { 拍翅膀; } FlyNoWay fly() {} FlyWithRocket fly() { 噴射; } *4" )"4" *.1-&.&/5 MallardDuck display() RedheadDuck display() RubberDuck display()

Slide 80

Slide 80 text

3 ઑᷗ⍋ܮ ಋᷗ␷უ

Slide 81

Slide 81 text

⊟ڃ㡲 Ⲍᬿ̾ˣ㉢ḝ㊕φⲇศፐෳຌ㡲 ΄ᴢ▊ٴ̴ࢭण⨸፮ፐᄱ୾ϻ

Slide 82

Slide 82 text

຾ޞ΄㡲୶ፚℴʷ϶ ⮀⭩ᖇී

Slide 83

Slide 83 text

຾ޞ΄㡲୶ፚℴʷ϶ ⮀⭩ᖇී ⅒ᵖᖇී 4USBUFHZ

Slide 84

Slide 84 text

策略模式 Strategy

Slide 85

Slide 85 text

఺⒧͡⍋ᦤ∤᠎ Strategy 㚼୛㑞⨸⨸ᨫ

Slide 86

Slide 86 text

఺⒧͡⍋ᦤ∤᠎ ಁᝎҠᦤ∤᠎で౽⭉⸃ю Strategy 㚼୛㑞⨸⨸ᨫ ᴫ␒┴㑞Ƭ᧾Ↄ㑞Ƭ ˀፚ㑞

Slide 87

Slide 87 text

఺⒧͡⍋ᦤ∤᠎ ಁᝎҠᦤ∤᠎で౽⭉⸃ю ⴸϒҥ΍㍹ܟϞ἖Ϋᐃᇝ Strategy 㚼୛㑞⨸⨸ᨫ ᴫ␒┴㑞Ƭ᧾Ↄ㑞Ƭ ˀፚ㑞 㞷◨௝㚼ٴ̴㋽ዛᴫ᧾ Ↄ㑞㡲࿭⑅ᴫ␒┴㑞

Slide 88

Slide 88 text

఺⒧͡⍋ᦤ∤᠎ ಁᝎҠᦤ∤᠎で౽⭉⸃ю ⴸϒҥ΍㍹ܟϞ἖Ϋᐃᇝ Strategy ⇾Ḃᘳ๿ⴸᦤ∤᠎ỉⴳٳ ͪᐆ຺㔂ؐчᷗᦤ∤᠎ỉℨ๿

Slide 89

Slide 89 text

為什麼我們需要學設計模式

Slide 90

Slide 90 text

Z > B

Slide 91

Slide 91 text

Z > B

Slide 92

Slide 92 text

"MJDF ࿝⬋ӭ॓㌞॓㡦Ӫםˆ⠩㡦 Ӫ॓㞚ⓞ㌞㡦ࡷֳ॓⻆㒷 ㌞␆㡦⽞ፒʱ᎙٩ᕣ㡛 +BTPOʱ̍๖ᕣՁ̆㑲㡛

Slide 93

Slide 93 text

"MJDF ࿝⬋ӭ॓㌞॓㡦Ӫםˆ⠩㡦 Ӫ॓㞚ⓞ㌞㡦ࡷֳ॓⻆㒷 ㌞␆㡦⽞ፒʱ᎙٩ᕣ㡛 ̜ϯӰவ㞼ʫᕼḑ㑰㞼㡙 +BTPOʱ̍๖ᕣՁ̆㑲㡛

Slide 94

Slide 94 text

Jas "MJDF +BTPO㡦⯤ൎ࿝ံ࿼ፒ㚲୏ḑ㑔⨭⨭ ᨟ٕԺΙ㡪௉୲ϰ௅⪓࿜ʬϫʬϫ㐦 Ք㡦˂ʺⲂ୲ϰவ͵ʬϫ㑔⨭ḑ̘㍷㡛 ! ˘ทӻൎ࿝Ⲃ㚲୏ḑ㐦Ք٩̩ۍ٥⼏ ˼㑔⨭⨭᨟

Slide 95

Slide 95 text

+BTPO"MJDF㡦ਸ਼٤⬋⯎ⅆ ᵊᕻ෇㡦࿝௡ྦྷ˯ݭ㡛

Slide 96

Slide 96 text

⮀⭩ᖇී ⓣ১Ⲍ৪͠ˣ㉢๢⼟ḝᢡ⼚

Slide 97

Slide 97 text

結論

Slide 98

Slide 98 text

變 化 設 計

Slide 99

Slide 99 text

Thanks ⼵ዾ⳻⭞ Jason Chung