คำนิยาม
รูปแบบการสังเกตการณ์จะใช้เมื่อมีความสัมพันธ์แบบหนึ่งถึงหลายอย่างระหว่างวัตถุเช่นหากมีการปรับเปลี่ยนวัตถุหนึ่งวัตถุวัตถุนั้นจะได้รับการแจ้งเตือนโดยอัตโนมัติและการเปลี่ยนแปลงที่สอดคล้องกันจะกระทำกับวัตถุที่อ้างถึงทั้งหมด
ตัวอย่าง
สมมติว่าที่อยู่ถาวรของคุณมีการเปลี่ยนแปลงจากนั้นคุณจะต้องแจ้งเจ้าหน้าที่หนังสือเดินทางและเจ้าหน้าที่บัตรแพน ดังนั้นที่นี่ผู้มีอำนาจหนังสือเดินทางและผู้มีอำนาจบัตรแพนเป็นผู้สังเกตการณ์และคุณเป็นเรื่อง
บน Facebook เช่นกันหากคุณสมัครสมาชิกใครก็ตามเมื่อใดก็ตามที่มีการอัพเดตใหม่เกิดขึ้นคุณจะได้รับแจ้ง
ควรใช้เมื่อใด:
เมื่อวัตถุหนึ่งเปลี่ยนสถานะของวัตถุวัตถุอ้างอิงทั้งหมดอื่น ๆ จะต้องเปลี่ยนสถานะของตนโดยอัตโนมัติเพื่อรักษาความมั่นคง
เมื่อผู้ทดสอบไม่ทราบจำนวนผู้สังเกตการณ์ก็มี
เมื่อวัตถุควรจะสามารถแจ้งเตือนวัตถุอื่น ๆ โดยไม่ทราบว่าใครเป็นวัตถุ
ขั้นตอนที่ 1
สร้างคลาสหัวเรื่อง
Subject.java
import java.util.ArrayList;
import java.util.List;
public class Subject {
private List<Observer> observers
= new ArrayList<Observer>();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyAllObservers();
}
public void attach(Observer observer){
observers.add(observer);
}
public void notifyAllObservers(){
for (Observer observer : observers) {
observer.update();
}
}
}
ขั้นตอนที่ 2
สร้างคลาสผู้สังเกตการณ์
Observer.java
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
ขั้นตอนที่ 3
สร้างคลาสผู้สังเกตการณ์ที่เป็นรูปธรรม
BinaryObserver.java
public class BinaryObserver extends Observer{
public BinaryObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Binary String: "
+ Integer.toBinaryString( subject.getState() ) );
}
}
OctalObserver.java
public class OctalObserver extends Observer{
public OctalObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Octal String: "
+ Integer.toOctalString( subject.getState() ) );
}
}
HexaObserver.java
public class HexaObserver extends Observer{
public HexaObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Hex String: "
+ Integer.toHexString( subject.getState() ).toUpperCase() );
}
}
ขั้นตอนที่ 4
ใช้วัตถุและวัตถุผู้สังเกตการณ์ที่เป็นรูปธรรม
ObserverPatternDemo.java
public class ObserverPatternDemo {
public static void main(String[] args) {
Subject subject = new Subject();
new HexaObserver(subject);
new OctalObserver(subject);
new BinaryObserver(subject);
System.out.println("First state change: 15");
subject.setState(15);
System.out.println("Second state change: 10");
subject.setState(10);
}
}
ขั้นตอนที่ 5
ตรวจสอบผลลัพธ์
การเปลี่ยนสถานะครั้งแรก: 15
สตริง Hex: F
สตริง Octal: 17
สตริงไบนารี: 1111
การเปลี่ยนแปลงสถานะที่สอง: 10
สตริง Hex: A
สตริง Octal: 12
สตริงไบนารี: 1010