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