观察者模式

java模式设计之观察者模式

观察者模式定义:

一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知,此种模式通常被用来实现事件处理系统。

观察者模式的使用场景:


1.一个对象状态的更新,要其他对象同步,其他关联对象的数量动态可变。
2.对象只需要将自己的更新通知发送给其他对象而不需要知道其他对象细节。

观察者模式类图关系如下:

观察者模式_第1张图片


观察者模式可以运用到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){
				
			}
		}
	}
}

下面三个是面板上面的组件,模拟QQ单聊组件实现观察者监听:

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张图片


你可能感兴趣的:(qq,对象,管理,java设计模式,界面)