电脑科技网站模板,新手学网站建设解疑与技巧1200例,目前网站开发趋势,网站建设 铭阳传媒17.观察者模式
观察者模式#xff1a;定义了一种一对多的依赖关系#xff0c;让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时#xff0c;会通知所有的观察者对象#xff0c;使他们能够自动更新自己。
主要解决#xff1a;一个对象状态改变给其他…17.观察者模式
观察者模式定义了一种一对多的依赖关系让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时会通知所有的观察者对象使他们能够自动更新自己。
主要解决一个对象状态改变给其他对象通知的问题而且要考虑到易用和低耦合保证高度的协作。何时使用一个对象目标对象的状态发生改变所有的依赖对象观察者对象都将得到通知进行广播通知。如何解决使用面向对象技术可以将这种依赖关系弱化。关键代码在抽象类里有一个 ArrayList 存放观察者们。 代码背景 一个班级有两类学生A类不学习玩但是玩的东西不一样有的是做游戏有的是看电视 B类放哨的学生专门看老师的动向如果老师进班了就立即通知大家。 如此就形成了一个需求放哨的学生要通知所有玩的学生老师来了而不同的学生有不同的反应有的马上把电视关闭有的停止玩游戏。
一、抽象观察者
public abstract class Observer {public abstract void updateState();
}二、若干具体观察者1.玩游戏观察者
Data
NoArgsConstructor
AllArgsConstructor
public class GameObserver extends Observer {//观察者的姓名private String name;//观察者的状态private String observerState;//明确具体的通知者private ConcreteSubject subject;Overridepublic void updateState() {observerState subject.getSubjectState();System.out.println(String.format(%s在打游戏,name));System.out.println(String.format(观察者%s的:新状态是%s,name,observerState));}
}2.看电视观察者
Data
AllArgsConstructor
NoArgsConstructor
public class TVObserver extends Observer {//观察者的姓名private String name;//观察者的状态private String observerState;//明确具体的通知者private ConcreteSubject subject;Overridepublic void updateState() {observerState subject.getSubjectState();System.out.println(String.format(%s在看电视,name));System.out.println(String.format(观察者%s的:新状态是%s,name,observerState));}
}3.抽象通知者
Data
NoArgsConstructor
AllArgsConstructor
public abstract class Subject {private ListObserver observerList new ArrayList();/*** 通知所有观察者*/public void notifyMsg(){for (Observer observer : observerList) {observer.updateState();}}}4.具体通知者
Data
public class ConcreteSubject extends Subject {private String subjectState;
}5.测试
public class ObserverTest {public static void main(String[] args) {ConcreteSubject concreteSubject new ConcreteSubject();GameObserver gameObserver new GameObserver(小张,,concreteSubject);TVObserver tvObserver new TVObserver(小李, , concreteSubject);GameObserver gameObserver1 new GameObserver(小王, , concreteSubject);concreteSubject.getObserverList().add(gameObserver);concreteSubject.getObserverList().add(tvObserver);concreteSubject.getObserverList().add(gameObserver1);concreteSubject.setSubjectState(老师来了赶快学习);concreteSubject.notifyMsg();}
}