一.名称
二.问题(为了解决什么问题)
很好辨认,举一些常见的例子:
猫鼠游戏
广播收音机
事件监听等等
三.解决方案(主要体现在uml和核心代码上)
定义:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
其实观察者模式的更细节的1对1就是接口回调。
扩展:
java中已经帮我们定义了观察者和被观察者的接口,我们只需要直接实现即可。
观察者模式体现了:迪米特原则、开闭原则、里氏替换原则、依赖倒置原则
因为实现了类间解耦——迪米特原则
因为使用了抽象类——开闭原则
因为使用了抽象类——里氏替换原则
因为使用了抽象类和继承——依赖倒置原则
四.例子
李斯、李四观察韩非子
被观察者基类
/**
* Created by annuoaichengzhang on 16/3/22.
*/
public interface Observable {
public void addObserver(Observer observer);
public void deleteObserver(Observer observer);
public void notifyObservers(String context);
}
被观察者
/**
* Created by annuoaichengzhang on 16/3/22.
*/
public class HanFeiZi implements Observable {
private ArrayList<Observer> observers = new ArrayList<>();
@Override
public void addObserver(Observer observer) {
this.observers.add(observer);
}
@Override
public void deleteObserver(Observer observer) {
this.observers.remove(observer);
}
@Override
public void notifyObservers(String context) {
for (Observer observer : observers) {
observer.update(context);
}
}
public void haveBreakfast() {
System.out.println("韩非子:开始吃饭了");
// 通知所有的观察者
this.notifyObservers("韩非子在吃饭");
}
}
观察者基类
/**
* Created by annuoaichengzhang on 16/3/22.
*/
public interface Observer {
public void update(String context);
}
观察者1
/**
* Created by annuoaichengzhang on 16/3/22.
*/
public class LiSi implements Observer {
@Override
public void update(String context) {
System.out.println("李斯:观察到韩非子在活动");
}
}
观察者2
/**
* Created by annuoaichengzhang on 16/3/22.
*/
public class WangSi implements Observer {
@Override
public void update(String context) {
System.out.println("王思:韩非子在行动");
}
}
client
/**
* Created by annuoaichengzhang on 16/3/22.
*/
public class Client {
public static void main(String[] args) {
Observer lisi = new LiSi();
Observer wangsi = new WangSi();
HanFeiZi hanFeiZi = new HanFeiZi();
hanFeiZi.addObserver(lisi);
hanFeiZi.addObserver(wangsi);
hanFeiZi.haveBreakfast();
}
}
使用java内置的接口
/**
* Created by annuoaichengzhang on 16/3/22.
*/
public class HanFeiZi extends Observable {
public void haveBreakfast() {
System.out.println("韩非子:开始吃饭了");
// 通知所有的观察者
this.notifyObservers("韩非子在吃饭");
}
}
/**
* Created by annuoaichengzhang on 16/3/22.
*/
public class LiSi implements Observer {
@Override
public void update(String context) {
System.out.println("李斯:观察到韩非子在活动");
}
}
简单了很多~~
四.效果(有啥优缺点)
常见案例
联机对战游戏。在游戏中,多个玩家可以加入同一战队组成联盟,当战队中某一成员受到敌人攻击时将给所有其他盟友发送通知,盟友受到通知后将作出响应。
股票交易系统。某股票变化幅度在5%左右时,系统将自动发送通知给购买该股票的股民。