凯发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官方网推荐给好友。