วันนี้ Blog นี้มาเน้นทางสาย Pattern กันเยอะ เชื่อว่าหลายๆคน Copy & Paste Development มาใช้งาน แต่ก็ไม่รู้ว่า มัน คือ อะไรครับ โดย Pattern ที่ผมมาเขียนลง Blog ในวันนี้ คือ Strategy Pattern ซึ่งข้อมูลส่วนใหญ่ผมเอามาจากของ Head First นะครับ ตัวอย่างมันอธิบายได้ง่ายดีครับ
Table of Contents
ทำไมต้องใช้ Strategy
- ทุกปัญหามันไม่สามารถแก้ไขด้วยกับใช้เทคนิคเดิมของ OOP - Inheritance ได้ไง ? ตัวอย่าง เช่น นายเจมส์ได้รับหน้าที่ในการสร้าง Class ของ Duck (เป็ด) โดยที่เป็ดแต่ละชนิดมีพฤติกรรมที่แตกต่างกับครับ โดยที่เรา Design ไว้ให้ใช้มีพฤติกรรมที่ Class แม่ แล้วให้ Class ลูกสืบทอด(Inheritance) ไปใช้ครับ
- ซึ่งพอมีชนิดของเป็ดที่หลากหลายขึ้น ดันเกิดข้อขัดแย้งต้องมา Override แก้ไขพฤติกรรมมันซะงั้น จริงๆ มันควรทำอย่างนั้นเหรอ (ลูกดื้อ เปลี่ยนพฤติกรรมของแม่)

- ในเมื่อ Inheritance (IS-A) มันไม่ Work ต้องเปลี่ยนมาเป็นการประกอบร่าง composition (HAS-A)
เมื่อไหร่ควรจะใช้
- เมื่อต้องการเพิ่ม Maintainability - เลือกประกอบสิ่งที่สนใจได้ ตอน Runtime เช่น MullarDuck ตอนอายุน้อยกว่า 14 วัน ยังบินไม่ไม่ได้นะ แต่ถ้ามากกว่านั้น เราสามารถ Set ความสามารถบิน (FlyWithWings) เพิ่มเข้าไปได้
- งานชิ้นเดียวกัน แต่มีวิธีการคิด (Algorithm/Behavior) ที่หลากหลาย เช่น- การจ่ายค่าโดยสารรถเมล์ ซึ่งแต่ละรุ่นมีวิธีคิดที่แแตกต่างกัน
- การเดินหมากรุก ซึ่งหมากแต่ละตัวตอนเดิน กับการถูกกิน มันมีกฏที่แตกต่างกันไป
 
- Keyword- Interface - เป็นสัญญาว่า เรารู้จักกันนะ
- Delegation - สั่งงาน ใครคนอื่นททำต่อ เช่น- เดิม - Duck จัดการวิธีการบินเองหมด
- ใหม่ - เพิ่มความสามารถ จาก Class FlyWithWings แล้วสั่งให้ Class FlyWithWings ไปจัดการต่อ
 
 
Pattern มันเป็นอย่างไร - Class Diagram
- Duck เป็นผู้สั่งการ แต่ไม่ได้สั่งผ่าน Class โดยตรงนะ แต่ Duck รู้จักกันผ่าน Interface ตามเส้นสีแดงใน Class Diagram เลย

- จาก Class Diagram แต่ละชิ้นคล้ายเป็นส่วนประกอบ (composition) ขึ้นมาแทน
มุมมองตอน Runtime - Object Diagram
- Mallard Duck

- Rubber Duck

มุมมองลำดับการทำงาน - Sequence Diagram
- สร้างผ่าน Constructor มาดู Code เทียบกับ Sequence Diagram ไปกันเลย
public class MallardDuck extends Duck {
   public MallardDuck() {
      flyBehavior = new FlyWithWings();
      quackBehavior = new Quack();
   }
   public void display() {
      System.out.println(“I’m a model duck”);
   }
}
- Client มา Set พฤติกรรมลงไปเอง มาลุยกันครับ
======================================================
/* CLASS */
public class MallardDuck extends Duck {
   public MallardDuck() 
   {
      //DO Nothing
   }
   public void display() 
   {  
      System.out.println(“I’m a Mallard Duck”);
   }
}
======================================================
/* CLIENT */
public class DuckSimulator {
   public static void main(String[] args) {
      //Client Do Anything
      Duck model = new MallardDuck();
      model.setFlyBehavior(new FlyWithWings());
      model.setFlyBehavior(new Quack());
   }
}
- ตอนลองสั่งให้บิน โดยแสดงให้เห็นถึง Delegation ถ้าสาย Dev ดู Code ดีกว่าครับ
======================================================
/* CLASS */
public abstract class Duck {
   FlyBehavior flyBehavior;
   //Some Code
   public void performFly() {
      flyBehavior.fly();
   }
}
======================================================
/* CLIENT */
public class DuckSimulator {
   public static void main(String[] args) {
      //Client Do Anything
      Duck model = new MallardDuck();
      model.performFly();
   }
}
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.


