定義:複数のオブジェクト間の多くの依存、オブジェクトの状態が変化し、それに依存するすべてが自動的に通知され、更新されます。
メインキャラクター:
- 抽象トピック(主題)の役割:また、抽象オブジェクトクラスとして知られている、すべてのオブザーバのビューアオブジェクト、削除オブザーバオブジェクト・メソッド、抽象メソッドおよび通知を保持するための集約と増加クラスを提供します。
- 特定のトピック(コンクリート件名)役割:また、その実装通知方法の抽象的な目標を、内部状態の特定のテーマの変更、登録済みのすべてのオブザーバーオブジェクトに通知し、特定のターゲットクラスとして知られています。
- 抽象観測者(オブザーバー)役割:それは受け取る変更通知、特定のテーマが呼び出され、更新彼の抽象メソッドが含まれ、抽象クラスまたはインタフェースです。
- 特定の観測者(コンクリートオブザーバー)の役割:変更通知の目標を取得するときに自分のステータスを更新するために実装される抽象オブザーバーで定義された抽象メソッド。
package observer;
import java.util.*;
public class ObserverPattern
{
public static void main(String[] args)
{
Subject subject=new ConcreteSubject();
Observer obs1=new ConcreteObserver1();
Observer obs2=new ConcreteObserver2();
subject.add(obs1);
subject.add(obs2);
subject.notifyObserver();
}
}
//抽象目标
abstract class Subject
{
protected List<Observer> observers=new ArrayList<Observer>();
//增加观察者方法
public void add(Observer observer)
{
observers.add(observer);
}
//删除观察者方法
public void remove(Observer observer)
{
observers.remove(observer);
}
public abstract void notifyObserver(); //通知观察者方法
}
//具体目标
class ConcreteSubject extends Subject
{
public void notifyObserver()
{
System.out.println("具体目标发生改变...");
System.out.println("--------------");
for(Object obs:observers)
{
((Observer)obs).response();
}
}
}
//抽象观察者
interface Observer
{
void response(); //反应
}
//具体观察者1
class ConcreteObserver1 implements Observer
{
public void response()
{
System.out.println("具体观察者1作出反应!");
}
}
//具体观察者1
class ConcreteObserver2 implements Observer
{
public void response()
{
System.out.println("具体观察者2作出反应!");
}
}
Javaの使用インタフェースは付属しています:
package observer;
import java.util.Observer;
import java.util.Observable;
public class CrudeOilFutures
{
public static void main(String[] args)
{
OilFutures oil=new OilFutures();
Observer bull=new Bull(); //多方
Observer bear=new Bear(); //空方
oil.addObserver(bull);
oil.addObserver(bear);
oil.setPrice(10);
oil.setPrice(-8);
}
}
//具体目标类:原油期货
class OilFutures extends Observable
{
private float price;
public float getPrice()
{
return this.price;
}
public void setPrice(float price)
{
super.setChanged() ; //设置内部标志位,注明数据发生变化
super.notifyObservers(price); //通知观察者价格改变了
this.price=price ;
}
}
//具体观察者类:多方
class Bull implements Observer
{
public void update(Observable o,Object arg)
{
Float price=((Float)arg).floatValue();
if(price>0)
{
System.out.println("油价上涨"+price+"元,多方高兴了!");
}
else
{
System.out.println("油价下跌"+(-price)+"元,多方伤心了!");
}
}
}
//具体观察者类:空方
class Bear implements Observer
{
public void update(Observable o,Object arg)
{
Float price=((Float)arg).floatValue();
if(price>0)
{
System.out.println("油价上涨"+price+"元,空方伤心了!");
}
else
{
System.out.println("油价下跌"+(-price)+"元,空方高兴了!");
}
}
}