Design Patterns in Luster

Preview:

DESCRIPTION

2014 達暉資訊教育訓練課程 - Design Patterns 課程簡介: 蛇麼!居然可以~ 行雲流水般回答何謂 觀察者模式 而不是 我認識它 但無法完整說出它是誰 看完整本 設計模式 書籍 而不是 三秒就倒頭入睡? 寫出 一段段自己滿意程式 而不是 質疑是否有更好寫法 其實 “Design Patterns” 並沒有這麼困難,這次的課程,我們會透過情境的方式,帶大家慢慢走入這個世界~

Citation preview

Design Patterns

© 2014 Luster

Me

Reference啓

Object Oriented

Basic

⽤用情境,學設計模式

Class Diagram

MallardDuck

display() { }swim()quack()

RedheadDuck

display() { }swim()quack()

Class Diagram

MallardDuck

display() { }swim()quack()

RedheadDuck

display() { }swim()quack()

Duck

Class Diagram

MallardDuck

display() { } display() { }

RedheadDuck

Duck

swim()quack()

Class Diagram

MallardDuck

display() { } display() { }

RedheadDuck

Duck

swim()quack()

display()

Class Diagram

MallardDuck

display() { } display() { }

RedheadDuck

Duck

swim()quack()

display()

模擬鴨子,全 改版

讓鴨子飛新

MallardDuckdisplay() { }

Duckquack()

display()swim()

RedheadDuckdisplay() { }

Class Diagram

MallardDuckdisplay() { }

Duckquack()

display()swim()

RedheadDuckdisplay() { }

fly()

Jason’s Class Diagram

公測那一天

黃色塑膠鴨竟然也會飛了- -|||

What’s happened ?

Duckquack()

display()swim()

fly()RubberDuck

quack() { 吱吱叫; }@Override

display() { }

Duckquack()

display()swim()

fly()

RubberDuck

display() { }

quack() { 吱吱叫; }@Override

Jason’s Class Diagram II

Duckquack()

display()swim()

fly()

RubberDuck

quack() { 吱吱叫; }@Override

display() { }

fly() { // Do nothing! }@Override

FireDuck

quack() { // Do nothing! }@Override

display() { }

fly() { // Do nothing! }@Override

swim() { // Do nothing! }@Override

A.

B.

C.

D.

E.

F.

“ ”

“ ”

“ ”

而且又繼續用繼承的方式,那我豈不是要

逐鴨審查而且又繼續用繼承的方式,那我豈不是要

Duck

display()swim()Flyable

fly()

Quackablequack()

MallardDuck RedheadDuck RubberDuck

Duck

display()swim()Flyable

fly()

Quackablequack()

MallardDuckdisplay()

RedheadDuckdisplay()

RubberDuckdisplay()

Duck

display()swim()Flyable

fly()

Quackablequack()

MallardDuck

fly()display()

RedheadDuck

fly()display()

RubberDuckdisplay()

Duck

display()swim()Flyable

fly()

Quackablequack()

MallardDuck

fly()display()

quack()

RedheadDuck

fly()display()

quack()

RubberDuckdisplay()quack()

Duck

display()swim()Flyable

fly()

Quackablequack()

MallardDuckdisplay()

RedheadDuckdisplay()

RubberDuckdisplay()

“”

fly()quack()

fly()quack()

quack()

設計守則 Design Principle

1

1

2

Program to an !interface,!

not an implementation.

2

Example

Soldierattack()

Sniperattack() {!! snipe();!}snipe()

Stormtrooperattack() {!! shoot();!}shoot()

Program to an implement

Sniper soldier = new Sniper(); soldier.attack();

Program to an interface

Sniper soldier = new Sniper(); soldier.attack();

Soldier soldier = new Sniper(); soldier.attack();

Sniper soldier = new Sniper(); soldier.attack();

Soldier soldier = new Sniper(); soldier.attack();

Soldier soldier = getSoldier(); soldier.attack();

Program to an interface

QuackBehaviorquack()

<< interface >>

FlyBehaviorfly()

<< interface >>

QuackBehaviorquack()

<< interface >>

FlyBehaviorfly()

<< interface >>

Squeakquack() { 吱吱叫; }

MuteQuackquack() { 不會叫; }

Quackquack() { 呱呱叫; }

FlyWithWingsfly() { ⽤用翅膀飛; }

FlyWithRocketfly() { ⽤用⽕火箭飛; }

FlyNoWayfly() { 不會飛; }

Duck

display()swim()

Duck

display()swim()

QuackBehavior quackBehaviorFlyBehavior flyBehavior

public abstract class Duck { QuackBehavior quackBehavior; FlyBehavior flyBehavior; }

Duck

display()swim()

performQuack()performFly()

QuackBehavior quackBehaviorFlyBehavior flyBehavior

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

Duck

display()swim()

performQuack()performFly()

QuackBehavior quackBehaviorFlyBehavior flyBehavior

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

quackBehavior.quack();

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

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() {…} }

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

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

Duck

display()swim()

performQuack()performFly()

QuackBehavior quackBehaviorFlyBehavior flyBehavior

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

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

Duck

display()swim()

performQuack()performFly()

QuackBehavior quackBehaviorFlyBehavior flyBehavior

setQuackBehavior()setFlyBehavior()

Duck

display()swim()

performQuack()performFly()

QuackBehavior quackBehaviorFlyBehavior 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… }

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

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

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

QuackBehaviorquack()

<< interface >>

Quackquack() { 呱; }

MuteQuackquack() {}

Squeakquack() { 吱; }

FlyBehaviorfly()

<< interface >>

FlyWithWingsfly() { 拍翅膀; }

FlyNoWayfly() {}

FlyWithRocketfly() { 噴射; }

Duck QuackBehaviorquack()

<< interface >>

Quackquack() { 呱; }

MuteQuackquack() {}

Squeakquack() { 吱; }

FlyBehaviorfly()

<< interface >>

FlyWithWingsfly() { 拍翅膀; }

FlyNoWayfly() {}

FlyWithRocketfly() { 噴射; }

MallardDuck

display()swim()

RedheadDuck

display()swim()

RubberDuck

display()swim()

QuackBehaviorquack()

<< interface >>

Quackquack() { 呱; }

MuteQuackquack() {}

Squeakquack() { 吱; }

FlyBehaviorfly()

<< interface >>

FlyWithWingsfly() { 拍翅膀; }

FlyNoWayfly() {}

FlyWithRocketfly() { 噴射; }

MallardDuckdisplay()

RedheadDuckdisplay()

RubberDuckdisplay()

Duck

display()swim()

Duck

display()swim()

QuackBehavior quackBehaviorFlyBehavior flyBehavior

QuackBehaviorquack()

<< interface >>

Quackquack() { 呱; }

MuteQuackquack() {}

Squeakquack() { 吱; }

FlyBehaviorfly()

<< interface >>

FlyWithWingsfly() { 拍翅膀; }

FlyNoWayfly() {}

FlyWithRocketfly() { 噴射; }

MallardDuckdisplay()

RedheadDuckdisplay()

RubberDuckdisplay()

Duck

display()swim()

performQuack()performFly()

QuackBehavior quackBehaviorFlyBehavior flyBehavior

QuackBehaviorquack()

<< interface >>

Quackquack() { 呱; }

MuteQuackquack() {}

Squeakquack() { 吱; }

FlyBehaviorfly()

<< interface >>

FlyWithWingsfly() { 拍翅膀; }

FlyNoWayfly() {}

FlyWithRocketfly() { 噴射; }

MallardDuckdisplay()

RedheadDuckdisplay()

RubberDuckdisplay()

Duck

display()swim()

performQuack()performFly()

QuackBehavior quackBehaviorFlyBehavior flyBehavior

setQuackBehavior()setFlyBehavior()

QuackBehaviorquack()

<< interface >>

Quackquack() { 呱; }

MuteQuackquack() {}

Squeakquack() { 吱; }

FlyBehaviorfly()

<< interface >>

FlyWithWingsfly() { 拍翅膀; }

FlyNoWayfly() {}

FlyWithRocketfly() { 噴射; }

MallardDuckdisplay()

RedheadDuckdisplay()

RubberDuckdisplay()

Duck

display()swim()

performQuack()performFly()

QuackBehavior quackBehaviorFlyBehavior flyBehavior

setQuackBehavior()setFlyBehavior()

QuackBehaviorquack()

<< interface >>

Quackquack() { 呱; }

MuteQuackquack() {}

Squeakquack() { 吱; }

FlyBehaviorfly()

<< interface >>

FlyWithWingsfly() { 拍翅膀; }

FlyNoWayfly() {}

FlyWithRocketfly() { 噴射; }

MallardDuckdisplay()

RedheadDuckdisplay()

RubberDuckdisplay()

3

策略模式 Strategy

Strategy

Strategy

Strategy

Strategy

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

Z > B

Z > B

Jas

!

結論

變 化設 計

ThanksJason Chung