一.名称
二.问题(为了解决什么问题)
很好辨认,举一些常见的例子:
猫鼠游戏
广播收音机
事件监听等等
三.解决方案(主要体现在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 observers &#61; new ArrayList<>();&#64;Overridepublic void addObserver(Observer observer) {this.observers.add(observer);}&#64;Overridepublic void deleteObserver(Observer observer) {this.observers.remove(observer);}&#64;Overridepublic 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 {&#64;Overridepublic void update(String context) {System.out.println("李斯:观察到韩非子在活动");}
}
观察者2
/*** Created by annuoaichengzhang on 16/3/22.*/
public class WangSi implements Observer {&#64;Overridepublic 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 &#61; new LiSi();Observer wangsi &#61; new WangSi();HanFeiZi hanFeiZi &#61; 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 {&#64;Overridepublic void update(String context) {System.out.println("李斯:观察到韩非子在活动");}
}
简单了很多~~
四.效果&#xff08;有啥优缺点&#xff09;
常见案例
联机对战游戏。在游戏中&#xff0c;多个玩家可以加入同一战队组成联盟&#xff0c;当战队中某一成员受到敌人攻击时将给所有其他盟友发送通知&#xff0c;盟友受到通知后将作出响应。
股票交易系统。某股票变化幅度在5%左右时&#xff0c;系统将自动发送通知给购买该股票的股民。