欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 编程语言 > >内容正文

asp.net

observer观察者设计模式 -凯发k8官方网

发布时间:2025/1/21 21 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 observer观察者设计模式 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

目录


问题

程序模拟 

版本一:while死循环

版本二:面向对象式地傻等 

版本三:加入观察者

版本四:加入多个观察者

版本五:分离观察者与被观察者

版本六:观察者根据事件来作出处理

版本七:处理事件需要事件源对象

版本八:事件形成继承体系

java.awt.frame类应用观察者模式


 

reactor模型的本质就是观察者模式。

首先来看一个问题:

版本一:while死循环

程序模拟小孩哭:一个死循环等着,当cry为true时就执行。类似于面向过程式地傻等

/*** 披着面向对象外衣的面向过程*/public class main1 {public static void main(string[] args) {boolean cry = false;while(!cry) {//进行处理}} }

版本二:面向对象式地傻等 

抽象出一个child类来,提供一个wakeup()方法和一个cry属性。本质上同版本一没区别,只不过用了面向对象的思想。

/*** 面向对象的傻等*/class child {private boolean cry = false;public boolean iscry() {return cry;}public void wakeup() {system.out.println("waked up! crying wuwuwuwu...");cry = true;} }public class main {public static void main(string[] args) {child child = new child();while(!child.iscry()) {try {thread.sleep(1000);} catch (interruptedexception e) {e.printstacktrace();}system.out.println("observing...");}} }

版本三:加入观察者

加入观察者dad。当child的wakeup()了之后就调用dad的feed()方法

/*** 加入观察者*/class child {private boolean cry = false;private dad d = new dad();public boolean iscry() {return cry;}public void wakeup() {cry = true;d.feed();} }class dad {public void feed() {system.out.println("dad feeding...");} }public class main {public static void main(string[] args) {child c = new child();//do sthc.wakeup();} }

版本四:加入多个观察者

/*** 加入多个观察者*/class child {private boolean cry = false;private dad dad = new dad();private mum mum = new mum();private dog dog = new dog();public boolean iscry() {return cry;}public void wakeup() {cry = true;dad.feed();dog.wang();mum.hug();} }class dad {public void feed() {system.out.println("dad feeding...");} }class mum {public void hug() {system.out.println("mum hugging...");} }class dog {public void wang() {system.out.println("dog wang...");} }public class main {public static void main(string[] args) {child c = new child();//do sthc.wakeup();} }

版本五:分离观察者与被观察者

定义一个观察者接口observer,提供一个actiononwakeup()方法供观察者实现。

/*** 分离观察者与被观察者*/class child {private boolean cry = false;private list observers = new arraylist<>();{observers.add(new dad());observers.add(new mum());observers.add(new dog());}public boolean iscry() {return cry;}public void wakeup() {cry = true;for(observer o : observers) {o.actiononwakeup();}} }interface observer {void actiononwakeup(); }class dad implements observer {public void feed() {system.out.println("dad feeding...");}@overridepublic void actiononwakeup() {feed();} }class mum implements observer {public void hug() {system.out.println("mum hugging...");}@overridepublic void actiononwakeup() {hug();} }class dog implements observer {public void wang() {system.out.println("dog wang...");}@overridepublic void actiononwakeup() {wang();} }public class main {public static void main(string[] args) {child c = new child();//do sthc.wakeup();} }

版本六:观察者根据事件来作出处理

有很多时候,观察者需要根据事件的具体情况来进行处理。

①source--事件源对象

②observer--观察者(监听者)

③event--事件对象

事件源对象source会发出一些事件event,observer观察者观察到这些事件后作出一系列的反应。

比如键盘监听对象mykeylistener extends keyadapter,事件源对象就是窗口frame,事件对象是keyevent,观察者(监听器)是mykeylistener。

import java.util.arraylist; import java.util.list;/*** 有很多时候,观察者需要根据事件的具体情况来进行处理*/class child {private boolean cry = false;private list observers = new arraylist<>();{observers.add(new dad());observers.add(new mum());observers.add(new dog());}public boolean iscry() {return cry;}public void wakeup() {cry = true;wakeupevent event = new wakeupevent(system.currenttimemillis(), "bed");for(observer o : observers) {o.actiononwakeup(event);}} }//事件类 fire event class wakeupevent{long timestamp;string loc;public wakeupevent(long timestamp, string loc) {this.timestamp = timestamp;this.loc = loc;} }interface observer {void actiononwakeup(wakeupevent event); }class dad implements observer {public void feed() {system.out.println("dad feeding...");}@overridepublic void actiononwakeup(wakeupevent event) {feed();} }class mum implements observer {public void hug() {system.out.println("mum hugging...");}@overridepublic void actiononwakeup(wakeupevent event) {hug();} }class dog implements observer {public void wang() {system.out.println("dog wang...");}@overridepublic void actiononwakeup(wakeupevent event) {wang();} }public class main {public static void main(string[] args) {child c = new child();//do sthc.wakeup();} }

版本七:处理事件需要事件源对象

 * 有很多时候,观察者需要根据事件的具体情况来进行处理
 * 大多数时候,我们处理事件的时候,需要事件源对象

import java.util.arraylist; import java.util.list;/*** 有很多时候,观察者需要根据事件的具体情况来进行处理* 大多数时候,我们处理事件的时候,需要事件源对象*/class child {private boolean cry = false;private list observers = new arraylist<>();{observers.add(new dad());observers.add(new mum());observers.add(new dog());}public boolean iscry() {return cry;}public void wakeup() {cry = true;wakeupevent event = new wakeupevent(system.currenttimemillis(), "bed", this);for(observer o : observers) {o.actiononwakeup(event);}} }class wakeupevent{long timestamp;string loc;child source;public wakeupevent(long timestamp, string loc, child source) {this.timestamp = timestamp;this.loc = loc;this.source = source;} }interface observer {void actiononwakeup(wakeupevent event); }class dad implements observer {public void feed() {system.out.println("dad feeding...");}@overridepublic void actiononwakeup(wakeupevent event) {feed();} }class mum implements observer {public void hug() {system.out.println("mum hugging...");}@overridepublic void actiononwakeup(wakeupevent event) {hug();} }class dog implements observer {public void wang() {system.out.println("dog wang...");}@overridepublic void actiononwakeup(wakeupevent event) {wang();} }public class main {public static void main(string[] args) {child c = new child();//do sthc.wakeup();} }

版本八:事件形成继承体系

 * 有很多时候,观察者需要根据事件的具体情况来进行处理
 * 大多数时候,我们处理事件的时候,需要事件源对象
 * 事件也可以形成继承体系

import java.util.arraylist; import java.util.list;/*** 有很多时候,观察者需要根据事件的具体情况来进行处理* 大多数时候,我们处理事件的时候,需要事件源对象* 事件也可以形成继承体系*/class child {private boolean cry = false;private list observers = new arraylist<>();{observers.add(new dad());observers.add(new mum());observers.add(new dog());}public boolean iscry() {return cry;}public void wakeup() {cry = true;wakeupevent event = new wakeupevent(system.currenttimemillis(), "bed", this);for(observer o : observers) {o.actiononwakeup(event);}} }abstract class event {abstract t getsource(); }class wakeupevent extends event{long timestamp;string loc;child source;public wakeupevent(long timestamp, string loc, child source) {this.timestamp = timestamp;this.loc = loc;this.source = source;}@overridechild getsource() {return source;} }interface observer {void actiononwakeup(wakeupevent event); }class dad implements observer {public void feed() {system.out.println("dad feeding...");}@overridepublic void actiononwakeup(wakeupevent event) {feed();} }class mum implements observer {public void hug() {system.out.println("mum hugging...");}@overridepublic void actiononwakeup(wakeupevent event) {hug();} }class dog implements observer {public void wang() {system.out.println("dog wang...");}@overridepublic void actiononwakeup(wakeupevent event) {wang();} }public class main {public static void main(string[] args) {child c = new child();//do sthc.wakeup();} } import java.awt.button; import java.awt.frame; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.event.windowadapter; import java.awt.event.windowevent;public class testframe extends frame {public void launch() {button b = new button("press me");b.addactionlistener(new myactionlistener());b.addactionlistener(new myactionlistener2());this.add(b);this.pack();this.addwindowlistener(new windowadapter(){@overridepublic void windowclosing(windowevent e) {system.exit(0);}});this.setlocation(400, 400);this.setvisible(true);}public static void main(string[] args) {new testframe().launch();}private class myactionlistener implements actionlistener { //observerpublic void actionperformed(actionevent e) {((button)e.getsource()).setlabel("press me again!");system.out.println("button pressed!");}}private class myactionlistener2 implements actionlistener {public void actionperformed(actionevent e) {system.out.println("button pressed 2!");}} }

 

与50位技术专家面对面20年技术见证,附赠技术全景图

总结

以上是凯发k8官方网为你收集整理的observer观察者设计模式的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

网站地图