Java 觀察者模式

YH Lin
4 min readFeb 9, 2022

--

UML 模型如下

撰寫一個抽象類別Observer 有其抽象方法update.

package observer_pattern;

public abstract class Observer {
public abstract void update(Subject subject);
}

撰寫一個Subject類別 , 有加上觀察者跟移除觀察者的方法,還有一個notity 更新的方法

package observer_pattern;

import java.util.ArrayList;import java.util.List;

public class Subject {
List<Observer> observers;
public Subject(){
observers = new ArrayList<>();

}

public void add_observer(Observer observer){
observers.add(observer);
}
public void remove_observer(Observer observer){
observers.remove(observer);
}

public void notify_all(){
for (Observer o:observers ) {
o.update(this);
}
}
}

建立一個工廠模式FactoryMode繼承Subject,製程透過setPoint更新目前的品質,並呼叫notify_all 更新

public class FactoryMode extends Subject{
float point;
public FactoryMode(float point){
super();
this.point = point;
}

public float getPoint(){return this.point;}

public void setPoint(float point){
this.point = point;
this.notify_all();
}
}

CheckPoitnt類別繼承抽象類別Observer並實做update方法,產品品質介於上下管制界線時,呈現in spec

public class CheckPoint extends Observer{
float ucl;
float lcl;

public CheckPoint(float ucl, float lcl){
this.ucl = ucl;
this.lcl = lcl;
}

@Override
public void update(Subject subject) {
FactoryMode fm = (FactoryMode) subject;
if (ucl>fm.getPoint() && lcl<fm.getPoint())
System.out.printf("%.2f %.2f %.2f in spec\n",ucl,fm.point,lcl);
else
System.out.printf("%.2f %.2f %.2f out spec\n",ucl,fm.point,lcl);
}
}

執行時,另用FactoryMode產生現在的點並加上checkpoint。FactoryMode 透過setPoint 不斷生成製程。同時也更新

package observer_pattern;

public class Script {
public static void main(String[] args) {
FactoryMode fm = new FactoryMode(6.0f);
CheckPoint checkPoint = new CheckPoint(8.7f,3.3f);
fm.add_observer(checkPoint);
fm.setPoint(6.0f);
fm.setPoint(2.0f);
fm.setPoint(9.0f);
}
}

--

--

No responses yet