เขียน code สบายด้วย Design Pattern

ตอนที่ 1 Observer

จะดีมั้ยถ้าอยู่มีคนมาแจ้งข่าวอะไรบางอย่างกับเราโดยที่เราไม่ต้องเป็นคนเดินไปถามเอง จะดีมั้ยถ้าเราเป็นเป็นคนครู แล้วแทนที่จะให้นักเรียนคอยมาเจ๊าะแจ๊ะถามเรื่องคะแนนอยู่บ่อย

ปัญหานี้ถูกแก้ ได้ โดยยย Observer Pattern

Observer Pattern อาศัยหลักการ Publisher + Subscribers

โดยเมื่อ ใครต้องการจะรับข่าวสารอะไร ก็ Subscribe ผมกันนะ คร๊าบ 555 เดี๋ยวมีอะไรมาupdate ก็จะแจ้งให้ทราบPublishเอง

มาดูส่วนของcode กันดีว่า ว่ามันจะมาในรูปแบบไหน อะไร ยังไง ??

สิ่งที่เราจะใช้ในการแสดงเนี่ย คือ การ อัพเดทพยากรณ์อากาศ ซึ่งในการอธิบายในส่วนการทำงานของตัว code จะอ้างอิง จาก หนังสือ >> Head First Design Patterns นะครับ คิคิ ^^

อันแรกเลยมาดู ส่วนของ ภาพรวมกันก่อน

Head First Design Patterns หน้า ที่ 39

WeatherData จะเป็นตัวที่คอย คุยกับทาง Weather Station ว่าเอาข้อมูลไป ไปแจ้ง sensor device ทั้ง 3 ตัวด้วยนะ แล้วก็จะรับข้อมูลที่ผ่านการ Update แล้ว มาแสดงใน display device จะเห็นว่ากลไกลสำคัญ WeatherData

มาดูในส่วนของ class diagram กันนนน

Head First Design Patterns หน้า ที่ 56

สร้าง interface DisplayElement ไว้ คอย ใช้ในพวก sensor device ในแต่ละตัว

public interface DisplayElement {
     public void display();
}

สร้าง interface Observer เพื่อ คอย update ข้อมูล sensor device เมื่อมีการ เปลี่ยนแปลง

public interface Observer {
    public void update(float temp, float humidity, float pressure);
}

สร้าง interface Subject

public interface Subject {
    public void registerObserver(Observer o);
    public void removeObserver(Observer o);
    public void notifyObservers();//ไว้คอยแจ้งเตือนเมื่อ state ใน class มีการเปลี่ยนแปลง
}

สร้าง class WeatherData

import java.util.ArrayList;
public class WeatherData implements Subject{
  private ArrayList observers;
  private float temperature;
  private float humidity;
  private float pressure;
  public WeatherData(){
      observers = new ArrayList();
  }
  @Override
  public void registerObserver(Observer o) {
      observers.add(o);
  }
  @Override
  public void removeObserver(Observer o) {
      int i = observers.indexOf(o);
      if(i >= 0) {
         observers.remove(i);
      }
   }
  @Override
  public void notifyObservers() {//เมื่อมีการ notify ก็ จะupdate
     for (int i = 0; i < observers.size(); i++) {
     Observer observer = (Observer)observers.get(i);
     observer.update(temperature, humidity, pressure);
       }
}
  public void measurementsChanged() {
      notifyObservers();
}
     public void setMeasurements(float temperature, float humidity,       float pressure) {
     this.temperature = temperature;
     this.humidity = humidity;
     this.pressure = pressure;
   measurementsChanged();
  }
}

สร้าง class WeatherStation

public class WeatherStation {
public static void main(String[] args){
    WeatherData weatherData = new WeatherData();
     CurrentConditionDisplay conditionDisplay = new     CurrentConditionDisplay(weatherData);
   weatherData.setMeasurements(80, 65, 30.4f);
  weatherData.setMeasurements(70, 44, 30.4f);
   }
}

การ ทำงานก็คือ เมื่อ มีการเปลี่ยนแปลง ก็จะเรียกใช้ method setMeasurements(80, 65, 30.4f); ส่งค่าไปแล้ว เรียก measurementsChanged(); เพราะค่ามีการเปลี่ยนแปลง แล้วใช้ notifyObservers(); ในการแจ้งเตือน ในแต่ละ sensor device โดยผ่าน method Update() ;

มาขึ้น design ถัดไปกันดีกว่า คือ Decorator Pattern

ก่อนอื่น มาดูปัญหากันก่อน เหมือน เดิมผมก็จะเกริ่นปัญหาและภาพตัวอย่างจากหนังสือ Head First Design Patterns นะครับ

สมมติเรามีร้านกาแฟ StarBung เรามี Class diagram ดังนี้

ปัญอย่างนึงเลยก็คือถ้าเราต้องการชาเย็นไข่มุก ก็ต้องเพิ่ม menu ชาเย็นไข่มุกลงไป แล้ว ถ้า โกโก้ คาปูชิโน่ เพิ่มด้วยละ เราก็ต้องเพิ่มเมนูทุกตัวเลยหรอ แล้วถ้ามีเป็นร้อยเป็นพันเมนู Big Problem เลยหละครับท่านผู้ชมมมมมมม

อีกปัญหาก็คือ ถ้าส่วนผสม หรือ topping ต่างเพิ่มราคาก็ไปไล่แก้ทีละอัน ตายดีกว่าครับถ้าแบบนี้ 555555

การแก้ปัญหา คือ

  1. เลือกObjectชาเย็น
  2. เลือกObjectไข่มุกโดยห่อหุ้มชาเย็น
  3. เลือกObjectวิปครีมโดยห่อหุ้มไข่มุกและชาเย็น
  4. เรียกใช้method cost โดยเริ่ม return ค่าจากตัวในสุด

ต่อไปมาดูในส่วนของการเขียน Code กันครับ

Like what you read? Give Teerapat GGWP a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.