地球帝国2cdkey,e路航lh950n,吴玉乾
装载请标明出处:https://www.cnblogs.com/tangzh/p/11175120.html
观察者模式
说白了,就是一个对发生改变,所有依赖于它的对象也发生改变,这是一对多的关系。
比如对象a,对象b,对象c。b与c依赖于a,那么a发生改变,b与c也将发生改变。此时a是被观察者,b与c是观察者。
观察者模式又被称作发布/订阅模式,主要是为了让观察者与被观察者之间进行解耦。
uml图:
角色说明:
subject(抽象主题):被观察者的一个抽象类,它会把所有观察者的引用保存在一个集合里。抽象主题提供一个接口,可以增加和删除观察者对象。
concretesubject(具体主题):具体的被观察者。当具体被观察者的状态发生改变的时候,会给每一个注册过的观察者发送通知。
observer(抽象观察者):所有具体观察者的一个抽象类,为所有的具体观察者定义了一个接口:得到主题的通知时候更新自己。
concrereobserver(具体观察者):抽象观察者的具体实现。
我们看一下具体的例子:
上课铃声响起时候,老师与学生们的不同反应。
1、定义一个抽象主题:
该抽象主题定义了一些通用的方法,即具体主题里面需要实现的。
//抽象被观察者 public interface observable { //添加观察者 void addobserver(observer observer); //移除观察者 void deleteobserver(observer observer); //通知观察者 void notifyobserver(string msg); }
2、创建一个具体主题(上课铃声):
public class alarmclock implements observable { //保存观察者对象 list<observer> list = new arraylist<>(); @override public void addobserver(observer observer) { list.add(observer); } @override public void deleteobserver(observer observer) { list.remove(observer); } /** * 通知观察者 * @param msg */ @override public void notifyobserver(string msg) { for (observer observer : list) { observer.action(msg); } } }
3、创建抽象观察者:
定义了所有具体观察者需要实现的方法,听到铃声后的行为
//抽象观察者 public interface observer { void action(string msg); }
4、创建具体观察者:
public class students implements observer { string name; public students(string name) { this.name = name; } @override public void action(string msg) { system.out.println(msg + name + "开始听课"); } } public class teacher implements observer { @override public void action(string msg) { system.out.print(msg + "老师开始讲课"); } }
6、实现:
observable alarmclock = new alarmclock(); observer student1 = new students("小屁孩"); observer student2 = new students("大屁孩"); observer teacher = new teacher(); //注册观察者 alarmclock.addobserver(student1); alarmclock.addobserver(student2); alarmclock.addobserver(teacher); //被观察者通知已经注册的观察者 alarmclock.notifyobserver("上课铃声已经响了");
7、结果:
到这里我们便实现了观察者模式。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Android studio 解决logcat无过滤工具栏的操作
Android Studio 恢复小窗口停靠模式(Docked Mode)
Android studio保存logcat日志到本地的操作
Android Studio快捷键生成TAG、Log.x日志输出介绍
网友评论