观察者模式
来源:互联网 发布:ctp交易接口源码 编辑:程序博客网 时间:2024/06/07 02:02
java模式设计之观察者模式
观察者模式定义:
一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知,此种模式通常被用来实现事件处理系统。
观察者模式的使用场景:
1.一个对象状态的更新,要其他对象同步,其他关联对象的数量动态可变。
2.对象只需要将自己的更新通知发送给其他对象而不需要知道其他对象细节。
观察者模式类图关系如下:
观察者模式可以运用到QQ单聊通知里面(QQ消息通知会触发多个组件提示)。
下面代码实现:
主类启动界面:
package 观察者模式;import java.awt.FlowLayout;import javax.swing.JFrame;public class Test extends JFrame{public static void main(String[] args) {Test ts = new Test();ts.initFrame();}public void initFrame(){QQMsgRead qqs = new QQMsgRead();qqs.start();setTitle("消息观察测试");setSize(400,400);setDefaultCloseOperation(3);setLocationRelativeTo(null);this.setLayout(new FlowLayout());MyButton jb = new MyButton("暂时没有消息");MyLabel jl = new MyLabel("暂时没有消息");MyTextArea jtf = new MyTextArea("暂时没有消息");qqs.addQQMsgListener(jtf);qqs.addQQMsgListener(jl);qqs.addQQMsgListener(jb);this.add(jb);this.add(jl);this.add(jtf);setVisible(true);}}
QQ消息监听器抽象接口
package 观察者模式;public interface QQMsgListener {public void onMsg(String str);}
QQ消息读取(模拟服务器发送消息),添加或删除消息监听器,添加监听器容器:
package 观察者模式;import java.util.ArrayList;public class QQMsgRead extends Thread{public ArrayList<QQMsgListener> MsgList = new ArrayList<QQMsgListener>();//监听器容器public void addQQMsgListener(QQMsgListener msgListener){//添加消息监听器MsgList.add(msgListener);}public void removeQQMsgListener(QQMsgListener msgListener){MsgList.remove(msgListener);//移除消息监听器}public void run() {int count = 0;while(true){String Msg = "读到的第"+count+"条消息";for(QQMsgListener msgListener : MsgList){msgListener.onMsg(Msg);}count ++;try{Thread.sleep(1000);}catch(Exception e){}}}}
package 观察者模式;import javax.swing.JButton;public class MyButton extends JButton implements QQMsgListener{public MyButton(String str){super(str);}public void onMsg(String Msg) {this.setText(Msg);}}
package 观察者模式;import javax.swing.JLabel;public class MyLabel extends JLabel implements QQMsgListener{public MyLabel(String str){super(str);}public void onMsg(String str) {this.setText(str);}}
package 观察者模式;import javax.swing.JTextArea;public class MyTextArea extends JTextArea implements QQMsgListener{public MyTextArea(String str){super(str);}public void onMsg(String str) {this.append(str+"\r\n");}}
下面图片是我的测试图:
线程实现一秒一信息读取:
2 0
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- windows server 2008 w3svc服务无法启动,错误 1068:依赖服务或组件无法启动
- python中的random模块学习
- 文章标题 : 介绍 GNU Octave scrip
- POJ 1002
- SDWebImage 中简单的清除缓存
- 观察者模式
- 聚集索引和非聚集索引
- CSU 1711 Kinfolk【模拟】
- 主元素-----lintcode
- 求a~b内与n互素的数的个数 容斥原理
- dump和coredump
- POJ 1003
- spring(16)------spring的数据源配置
- Java内部类