一、使用场景:
1.被观察者:对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量是可以动态添加可变的。
2.对象仅需要将自己的更新通知给其他对象而无需知道其他对象的具体行为。
二、观察者模式的优点:
1.Subject和Observer之间是松耦合的,分别可以独立改变。
2.Subject在发送广播通知的时候,无需指定具体的Observer,Observer可以自己决定是否订阅subject的通知
三、设计方法:三个接口,一个被观察者实现类,多个观察者实现类,一个场景类
1.三个接口
观察者接口:Observer.java
被观察者接口:Observerable.java
被观察者业务接口(被观察者的行为):例子(IHanFeiZi.java)
2.一个被观察者实现类(实现被观察者接口和被观察者业务接口)
3.观察者(实现观察者接口)
观察者和被观察者接口java jdk已经提供:
被观察者业务接口(IHanFeiZi.java)
public interface IHanFeiZi { public void haveBreakfast(); public void haveFun(); }
被观察者实现类:(HanFeiZi.java)
public class HanFeiZi implements IHanFeiZi, Observerable{ private ArrayList<Observer> observerList = new ArrayList<Observer>(); @Override public void haveBreakfast() { System.out.println("韩非子:正在吃饭"); notifyObservers("韩非子正在吃饭"); } @Override public void haveFun() { System.out.println("韩非子:正在娱乐"); notifyObservers("韩非子正在娱乐"); } @Override public void addObserver(Observer observer) { observerList.add(observer); } @Override public void deleteObserver(Observer observer) { observerList.remove(observer); } @Override public void notifyObservers(String context) { for(Observer observer : observerList){ //发送通知给观察者 observer.update(context); } } }
观察者实现类:HanFeiZiWife.java
public class HanFeiZiWife implements Observer{ @Override public void update(String context) { System.out.println("韩非子妻子:这死鬼竟然在吃喝玩乐"); } }
场景类代码:
client.java
public class Client { public static void main(String[] args) { HanFeiZi hanFeiZi = new HanFeiZi(); HanFeiZiWife hanFeiZiWife = new HanFeiZiWife(); hanFeiZi.addObserver(hanFeiZiWife); hanFeiZi.haveBreakfast(); hanFeiZi.haveFun(); } }