ãœãããŠã§ã¢ã§å ç¢ãªã€ãã³ãã·ã¹ãã ãæ§ç¯ããããã®æ±çšãªãã¶ãŒããŒãã¿ãŒã³ãæ¢æ±ããŸããå®è£ ã®è©³çްãå©ç¹ãããã³ã°ããŒãã«éçºããŒã åãã®ãã¹ããã©ã¯ãã£ã¹ãåŠã³ãŸãããã
æ±çšãªãã¶ãŒããŒãã¿ãŒã³ïŒæè»ãªã€ãã³ãã·ã¹ãã ãæ§ç¯ãã
ãªãã¶ãŒããŒãã¿ãŒã³ã¯ããªããžã§ã¯ãéã«äžå¯Ÿå€ã®äŸåé¢ä¿ãå®çŸ©ããæ¯ãèãã«é¢ãããã¶ã€ã³ãã¿ãŒã³ã§ããããããªããžã§ã¯ãã®ç¶æ ãå€åãããšãããã«äŸåãããã¹ãŠã®ãªããžã§ã¯ãã«èªåçã«éç¥ãããæŽæ°ãããŸãããã®ãã¿ãŒã³ã¯ãæè»ã§ççµåãªã·ã¹ãã ãæ§ç¯ããããã«äžå¯æ¬ ã§ãããã®èšäºã§ã¯ãã€ãã³ãé§ååã¢ãŒããã¯ãã£ã§ãã䜿çšãããå¹ åºãã¢ããªã±ãŒã·ã§ã³ã«é©ããããªãã¶ãŒããŒãã¿ãŒã³ã®æ±çšçãªå®è£ ã«ã€ããŠæ¢æ±ããŸãã
ãªãã¶ãŒããŒãã¿ãŒã³ã®çè§£
ãªãã¶ãŒããŒãã¿ãŒã³ã®æ žãšãªãã®ã¯ã2ã€ã®äž»èŠãªåå è ã§ãã
- Subject (Observable): ç¶æ ãå€åãããªããžã§ã¯ãããªãã¶ãŒããŒã®ãªã¹ããä¿æãã倿Žããã£ããšãã«ãªãã¶ãŒããŒã«éç¥ããŸãã
- Observer: Subjectã賌èªããSubjectã®ç¶æ ãå€åãããšãã«éç¥ãåãåããªããžã§ã¯ãã
ãã®ãã¿ãŒã³ã®å©ç¹ã¯ãSubjectãšObserverããã«ãããªã³ã°ã§ããããšã«ãããŸããSubjectã¯ãObserverã®å ·äœçãªã¯ã©ã¹ãç¥ãå¿ èŠã¯ãªããç¹å®ã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããŠããããšã ããç¥ã£ãŠããã°ããã®ã§ããããã«ãããæè»æ§ãšä¿å®æ§ãåäžããŸãã
ãªãæ±çšãªãã¶ãŒããŒãã¿ãŒã³ã䜿çšããã®ãïŒ
æ±çšãªãã¶ãŒããŒãã¿ãŒã³ã¯ãSubjectãšObserverã®éã§æž¡ãããããŒã¿ã®åãå®çŸ©ã§ããããã«ããããšã§ãåŸæ¥ã®ãã¿ãŒã³ã匷åããŸãããã®ã¢ãããŒãã«ã¯ãããã€ãã®å©ç¹ããããŸãã
- åå®å šæ§: ãžã§ããªã¯ã¹ã䜿çšããããšã§ãSubjectãšObserverã®éã§æ£ããåã®ããŒã¿ãæž¡ãããããšãä¿èšŒãããã©ã³ã¿ã€ã ãšã©ãŒãé²ããŸãã
- åå©çšæ§: åäžã®æ±çšå®è£ ãç°ãªãçš®é¡ã®ããŒã¿ã«äœ¿çšã§ãããããã³ãŒãã®éè€ãæžããããšãã§ããŸãã
- æè»æ§: æ±çšåã倿Žããã ãã§ãããŸããŸãªã·ããªãªã«ç°¡åã«é©å¿ã§ããŸãã
å®è£ ã®è©³çް
åœéçãªéçºããŒã ã«ãšã£ãŠã®æç¢ºããšé©å¿æ§ã«çŠç¹ãåœãŠãæ±çšãªãã¶ãŒããŒãã¿ãŒã³ã®å¯èœãªå®è£ ãæ€èšããŸããããæŠå¿µçãªèšèªéäŸåã®ã¢ãããŒãã䜿çšããŸããããã®æŠå¿µã¯JavaãC#ãTypeScriptãPythonïŒåãã³ãä»ãïŒãªã©ã®èšèªã«çŽæ¥å€æã§ããŸãã
1. Observerã€ã³ã¿ãŒãã§ãŒã¹
Observerã€ã³ã¿ãŒãã§ãŒã¹ã¯ããã¹ãŠã®Observerã®å¥çŽãå®çŸ©ããŸããéåžžãSubjectã®ç¶æ ãå€åãããšãã«åŒã³åºãããåäžã®`update`ã¡ãœãããå«ãŸããŠããŸãã
interface Observer<T> {
void update(T data);
}
ãã®ã€ã³ã¿ãŒãã§ãŒã¹ã§ã¯ã`T`ã¯ObserverãSubjectããåãåãããŒã¿ã®åã衚ããŸãã
2. Subject (Observable)ã¯ã©ã¹
Subjectã¯ã©ã¹ã¯Observerã®ãªã¹ããä¿æãããããã远å ãåé€ãéç¥ããããã®ã¡ãœãããæäŸããŸãã
class Subject<T> {
private List<Observer<T>> observers = new ArrayList<>();
public void attach(Observer<T> observer) {
observers.add(observer);
}
public void detach(Observer<T> observer) {
observers.remove(observer);
}
protected void notify(T data) {
for (Observer<T> observer : observers) {
observer.update(data);
}
}
}
`attach`ã¡ãœãããš`detach`ã¡ãœããã¯ãObserverãSubjectã賌èªãããã賌èªãè§£é€ãããããããšãå¯èœã«ããŸãã`notify`ã¡ãœããã¯Observerã®ãªã¹ããç¹°ãè¿ãåŠçããé¢é£ããŒã¿ãæž¡ããŠ`update`ã¡ãœãããåŒã³åºããŸãã
3. å ·äœçãªObserver
å ·äœçãªObserverã¯ã`Observer`ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããã¯ã©ã¹ã§ãããããã¯ãSubjectã®ç¶æ ãå€åãããšãã«å®è¡ãããã¹ãç¹å®ã®åäœãå®çŸ©ããŸãã
class ConcreteObserver implements Observer<String> {
private String observerId;
public ConcreteObserver(String id) {
this.observerId = id;
}
@Override
public void update(String data) {
System.out.println("Observer " + observerId + " received: " + data);
}
}
ãã®äŸã§ã¯ã`ConcreteObserver`ã¯ããŒã¿ãšããŠ`String`ãåãåãããããã³ã³ãœãŒã«ã«åºåããŸãã`observerId`ã¯ãè€æ°ã®Observerãåºå¥ããããã«äœ¿çšãããŸãã
4. å ·äœçãªSubject
å ·äœçãªSubjectã¯`Subject`ãæ¡åŒµããç¶æ ãä¿æããŸããç¶æ ãå€åãããšã賌èªããŠãããã¹ãŠã®Observerã«éç¥ããŸãã
class ConcreteSubject extends Subject<String> {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
notify(message);
}
}
`setMessage`ã¡ãœããã¯Subjectã®ç¶æ ãæŽæ°ããæ°ããã¡ãã»ãŒãžã§ãã¹ãŠã®Observerã«éç¥ããŸãã
䜿çšäŸ
以äžã«ãæ±çšãªãã¶ãŒããŒãã¿ãŒã³ã䜿çšããæ¹æ³ã®äŸã瀺ããŸãã
public class Main {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver observer1 = new ConcreteObserver("A");
ConcreteObserver observer2 = new ConcreteObserver("B");
subject.attach(observer1);
subject.attach(observer2);
subject.setMessage("Hello, Observers!");
subject.detach(observer2);
subject.setMessage("Goodbye, B!");
}
}
ãã®ã³ãŒãã¯ãSubjectãš2ã€ã®ObserverãäœæããŸããæ¬¡ã«ãObserverãSubjectã«ã¢ã¿ããããSubjectã®ã¡ãã»ãŒãžãèšå®ãããã®åŸ1ã€ã®Observerããã¿ããããŸããåºåã¯æ¬¡ã®ããã«ãªããŸãã
Observer A received: Hello, Observers!
Observer B received: Hello, Observers!
Observer A received: Goodbye, B!
æ±çšãªãã¶ãŒããŒãã¿ãŒã³ã®å©ç¹
- ççµå: SubjectãšObserverã¯ççµåã§ãããã¢ãžã¥ãŒã«æ§ (modularity) ãšä¿å®æ§ãåäžãããŸãã
- æè»æ§: Subjectã倿Žããããšãªããæ°ããObserverã远å ãŸãã¯åé€ã§ããŸãã
- åå©çšæ§: æ±çšå®è£ ã¯ãããŸããŸãªçš®é¡ã®ããŒã¿ã«åå©çšã§ããŸãã
- åå®å šæ§: ãžã§ããªã¯ã¹ã䜿çšããããšã§ãSubjectãšObserverã®éã§æ£ããåã®ããŒã¿ãæž¡ãããããšãä¿èšŒãããŸãã
- ã¹ã±ãŒã©ããªãã£: 倿°ã®Observerãšã€ãã³ããåŠçããããã«ç°¡åã«ã¹ã±ãŒã«ã§ããŸãã
ãŠãŒã¹ã±ãŒã¹
æ±çšãªãã¶ãŒããŒãã¿ãŒã³ã¯ã次ã®ãããªå¹ åºãã·ããªãªã«é©çšã§ããŸãã
- ã€ãã³ãé§ååã¢ãŒããã¯ãã£: ä»ã®ã³ã³ããŒãã³ãã«ãã£ãŠçºè¡ãããã€ãã³ãã«ã³ã³ããŒãã³ããåå¿ããã€ãã³ãé§ååã·ã¹ãã ãæ§ç¯ããã
- ã°ã©ãã£ã«ã«ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ (GUI): ãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã®ããã®ã€ãã³ããã³ããªã³ã°ã¡ã«ããºã ãå®è£ ããã
- ããŒã¿ãã€ã³ãã£ã³ã°: ã¢ããªã±ãŒã·ã§ã³ã®ç°ãªãéšåéã§ããŒã¿ãåæããã
- ãªã¢ã«ã¿ã€ã æŽæ°: ãŠã§ãã¢ããªã±ãŒã·ã§ã³ã§ã¯ã©ã€ã¢ã³ãã«ãªã¢ã«ã¿ã€ã æŽæ°ãããã·ã¥ãããæ ªäŸ¡ã倿Žããããã³ã«è€æ°ã®ã¯ã©ã€ã¢ã³ããæŽæ°ãããå¿ èŠã®ããæ ªäŸ¡è¡šç€ºã¢ããªã±ãŒã·ã§ã³ãæ³åããŠãã ãããæ ªäŸ¡ãµãŒããŒãSubjectãšãªããã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ãObserverãšãªãåŸãŸãã
- IoT (ã¢ãã®ã€ã³ã¿ãŒããã) ã·ã¹ãã : ã»ã³ãµãŒããŒã¿ãç£èŠããäºåå®çŸ©ããããããå€ã«åºã¥ããŠã¢ã¯ã·ã§ã³ãããªã¬ãŒãããããšãã°ãã¹ããŒãããŒã ã·ã¹ãã ã§ã¯ã枩床ã»ã³ãµãŒ (Subject) ãç¹å®ã®ã¬ãã«ã«éãããšãã«ãµãŒã¢ã¹ã¿ãã (Observer) ã«æž©åºŠèª¿æŽãéç¥ã§ããŸããæ²³å·ã®æ°Žäœãç£èŠããŠæŽªæ°Žãäºæž¬ããã°ããŒãã«åæ£ã·ã¹ãã ãèããŠã¿ãŠãã ããã
èæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹
- ã¡ã¢ãªç®¡ç: ã¡ã¢ãªãªãŒã¯ãé²ããããäžèŠã«ãªã£ãObserverãSubjectããé©åã«ãã¿ãããããããã«ããŠãã ãããå¿ èŠã«å¿ããŠåŒ±åç §ã®äœ¿çšãæ€èšããŠãã ããã
- ã¹ã¬ããã»ãŒããã£: SubjectãšObserverãç°ãªãã¹ã¬ããã§å®è¡ãããŠããå ŽåãObserverãªã¹ããšéç¥ããã»ã¹ãã¹ã¬ããã»ãŒãã§ããããšã確èªããŠãã ãããããã¯ã䞊è¡ããŒã¿æ§é ãªã©ã®åæã¡ã«ããºã ã䜿çšããŠãã ããã
- ãšã©ãŒãã³ããªã³ã°: Observerã§ã®äŸå€ãã·ã¹ãã å šäœãã¯ã©ãã·ã¥ãããã®ãé²ãããã«ãé©åãªãšã©ãŒãã³ããªã³ã°ãå®è£ ããŠãã ããã`notify`ã¡ãœããå ã§try-catchãããã¯ã䜿çšããããšãæ€èšããŠãã ããã
- ããã©ãŒãã³ã¹: äžèŠãªObserverãžã®éç¥ã¯é¿ããŠãã ãããç¹å®ã®ã€ãã³ãã«é¢å¿ã®ããObserverã®ã¿ã«éç¥ããããã«ãã£ã«ã¿ãªã³ã°ã¡ã«ããºã ã䜿çšããŠãã ããããŸãã`update`ã¡ãœãããè€æ°ååŒã³åºããªãŒããŒããããæžããããã«ãéç¥ã®ãããåŠçãæ€èšããŠãã ããã
- ã€ãã³ãã¢ã°ãªã²ãŒã·ã§ã³: è€éãªã·ã¹ãã ã§ã¯ãè€æ°ã®é¢é£ã€ãã³ãã1ã€ã®ã€ãã³ãã«çµåããããã«ã€ãã³ãã¢ã°ãªã²ãŒã·ã§ã³ã®äœ¿çšãæ€èšããŠãã ãããããã«ãããObserverã®ããžãã¯ãç°¡çŽ åããéç¥ã®æ°ãæžããããšãã§ããŸãã
ãªãã¶ãŒããŒãã¿ãŒã³ã®ä»£æ¿æ¡
ãªãã¶ãŒããŒãã¿ãŒã³ã¯åŒ·åãªããŒã«ã§ãããåžžã«æåã®è§£æ±ºçã§ãããšã¯éããŸãããèæ ®ãã¹ãããã€ãã®ä»£æ¿æ¡ã以äžã«ç€ºããŸãã
- Publish-Subscribe (Pub/Sub): ãããªãã·ã£ãŒãšãµãã¹ã¯ã©ã€ããŒãäºããç¥ãããšãªãéä¿¡ã§ãããããäžè¬çãªãã¿ãŒã³ã§ãããã®ãã¿ãŒã³ã¯ãã¡ãã»ãŒãžãã¥ãŒããããŒã«ãŒã䜿çšããŠå®è£ ãããããšãå€ãã§ãã
- Signals/Slots: äžéšã®GUIãã¬ãŒã ã¯ãŒã¯ïŒäŸ: QtïŒã§äœ¿çšãããã¡ã«ããºã ã§ããªããžã§ã¯ããåå®å šã«æ¥ç¶ããæ¹æ³ãæäŸããŸãã
- ãªã¢ã¯ãã£ãããã°ã©ãã³ã°: éåæããŒã¿ã¹ããªãŒã ã®åŠçãšå€æŽã®äŒæã«çŠç¹ãåœãŠãããã°ã©ãã³ã°ãã©ãã€ã ã§ããRxJavaãReactiveXã®ãããªãã¬ãŒã ã¯ãŒã¯ã¯ããªã¢ã¯ãã£ãã·ã¹ãã ãå®è£ ããããã®åŒ·åãªããŒã«ãæäŸããŸãã
ãã¿ãŒã³ã®éžæã¯ãã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®èŠä»¶ã«äŸåããŸããæ±ºå®ãäžãåã«ãåãªãã·ã§ã³ã®è€éããã¹ã±ãŒã©ããªãã£ãä¿å®æ§ãèæ ®ããŠãã ããã
ã°ããŒãã«éçºããŒã ã®èæ ®äºé
ã°ããŒãã«éçºããŒã ãšååããå Žåããªãã¶ãŒããŒãã¿ãŒã³ãäžè²«ããŠå®è£ ããããã¹ãŠã®ããŒã ã¡ã³ããŒããã®ååãçè§£ããŠããããšã確èªããããšãéèŠã§ããæåããã³ã©ãã¬ãŒã·ã§ã³ã®ããã®ãã³ãã以äžã«ç€ºããŸãã
- ã³ãŒãã£ã³ã°æšæºã®ç¢ºç«: ãªãã¶ãŒããŒãã¿ãŒã³ã®å®è£ ã«é¢ããæç¢ºãªã³ãŒãã£ã³ã°æšæºãšã¬ã€ãã©ã€ã³ãå®çŸ©ããŸããããã«ãããç°ãªãããŒã ãå°åéã§ã³ãŒãã®äžè²«æ§ãšä¿å®æ§ã確ä¿ãããŸãã
- ãã¬ãŒãã³ã°ãšããã¥ã¡ã³ãã®æäŸ: ãã¹ãŠã®ããŒã ã¡ã³ããŒã«ãªãã¶ãŒããŒãã¿ãŒã³ã«é¢ãããã¬ãŒãã³ã°ãšããã¥ã¡ã³ããæäŸããŸããããã«ããã誰ãããã¿ãŒã³ãšãã®å¹æçãªäœ¿ç𿹿³ãçè§£ã§ããããã«ãªããŸãã
- ã³ãŒãã¬ãã¥ãŒã®å®æœ: ãªãã¶ãŒããŒãã¿ãŒã³ãæ£ããå®è£ ãããã³ãŒãã確ç«ãããæšæºãæºãããŠããããšã確èªããããã«ã宿çãªã³ãŒãã¬ãã¥ãŒã宿œããŸãã
- ã³ãã¥ãã±ãŒã·ã§ã³ã®ä¿é²: ããŒã ã¡ã³ããŒéã®ãªãŒãã³ãªã³ãã¥ãã±ãŒã·ã§ã³ãšã³ã©ãã¬ãŒã·ã§ã³ã奚å±ããŸããããã«ãããåé¡ãæ©æã«ç¹å®ããŠè§£æ±ºããããšãã§ããŸãã
- ããŒã«ãªãŒãŒã·ã§ã³ã®èæ ®: Observerã«ããŒã¿ã衚瀺ããéã¯ãããŒã«ãªãŒãŒã·ã§ã³ã®èŠä»¶ãèæ ®ããŠãã ãããæ¥ä»ãæ°å€ãé貚ããŠãŒã¶ãŒã®ãã±ãŒã«ã«åãããŠæ£ãããã©ãŒããããããŠããããšã確èªããŠãã ãããããã¯ãã°ããŒãã«ãªãŠãŒã¶ãŒããŒã¹ãæã€ã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠç¹ã«éèŠã§ãã
- ã¿ã€ã ãŸãŒã³: ç¹å®ã®æéã«çºçããã€ãã³ããæ±ãå Žåãã¿ã€ã ãŸãŒã³ã«æ³šæããŠãã ãããäžè²«ããã¿ã€ã ãŸãŒã³è¡šçŸ (äŸ: UTC) ã䜿çšãã衚瀺æã«ã¯æéããŠãŒã¶ãŒã®ããŒã«ã«ã¿ã€ã ãŸãŒã³ã«å€æããŠãã ããã
çµè«
æ±çšãªãã¶ãŒããŒãã¿ãŒã³ã¯ãæè»ã§ççµåãªã·ã¹ãã ãæ§ç¯ããããã®åŒ·åãªããŒã«ã§ãããžã§ããªã¯ã¹ã䜿çšããããšã§ãå¹ åºãã·ããªãªã«é©å¿ã§ããåå®å šã§åå©çšå¯èœãªå®è£ ãäœæã§ããŸããæ£ããå®è£ ãããå Žåããªãã¶ãŒããŒãã¿ãŒã³ã¯ã¢ããªã±ãŒã·ã§ã³ã®ä¿å®æ§ãã¹ã±ãŒã©ããªãã£ããã¹ãå®¹ææ§ãåäžãããããšãã§ããŸããã°ããŒãã«ããŒã ã§äœæ¥ããå Žåãæç¢ºãªã³ãã¥ãã±ãŒã·ã§ã³ãäžè²«ããã³ãŒãã£ã³ã°æšæºãããã³ããŒã«ãªãŒãŒã·ã§ã³ãšã¿ã€ã ãŸãŒã³ã®èæ ®äºé ãžã®èªèã匷調ããããšã¯ãå®è£ ãšã³ã©ãã¬ãŒã·ã§ã³ã®æåã«ãšã£ãŠæãéèŠã§ãããã®å©ç¹ãèæ ®äºé ãä»£æ¿æ¡ãçè§£ããããšã§ããããžã§ã¯ãã§ãã®ãã¿ãŒã³ããã€ã©ã®ããã«äœ¿çšãããã«ã€ããŠæ å ±ã«åºã¥ããæ±ºå®ãäžãããšãã§ããŸãããã®æ žãšãªãååãšãã¹ããã©ã¯ãã£ã¹ãçè§£ããããšã§ãäžçäžã®éçºããŒã ã¯ãããå ç¢ã§é©å¿æ§ã®é«ããœãããŠã§ã¢ãœãªã¥ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã