热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

设计模式系列:观察者模式

一.名称二.问题(为了解决什么问题)很好辨认,举一些常见的例子:猫鼠游戏广播收音机事件监听等等三.解决方案࿰

一.名称

二.问题(为了解决什么问题)

很好辨认,举一些常见的例子:
猫鼠游戏
广播收音机
事件监听等等

三.解决方案(主要体现在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;系统将自动发送通知给购买该股票的股民。


推荐阅读
author-avatar
柏拉图恋情
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有