java中的Observer模式

import java.util.Observable;

public class DateSubject extends Observable {
	// 封装被观察的数据
	private int widthInfo;
	private int heightInfo;

	public int getWidthInfo() {
		return widthInfo;
	}

	public void setWidthInfo(int widthInfo) {
		this.widthInfo = widthInfo;
		// 数据改变后,setChanged()必须被调用,否则notifyObservers()方法会不起作用
		this.setChanged();
	}

	public void setHeightInfo(int heightInfo) {
		this.heightInfo = heightInfo;
		this.setChanged();
	}

	public int getHeightInfo() {
		return heightInfo;
	}
}

 

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class FrameSubject extends JFrame {
	private static final long serialVersionUID = 1010334549420828435L;
	JTextField jTextField1 = new JTextField("100");
	JTextField jTextField2 = new JTextField("100");
	JButton jbutton = new JButton("click");

	FrameSubject() {
		this.setLayout(new FlowLayout());
		this.setSize(100, 100);
		this.add(jTextField1);
		this.add(jTextField2);
		this.add(jbutton);
		jbutton.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent paramActionEvent) {
				jButton1_actionPerformed(paramActionEvent);

			}
		});
	}

	// 因为无法使用多重继承,这儿就只能使用对象组合的方式来引入一个
	// java.util.Observerable对象了。
	DateSubject subject = new DateSubject();

	// 这个方法转发添加Observer消息到DateSubject。
	public void registerObserver(java.util.Observer o) {
		subject.addObserver(o);
	}

	// 数据改变,事件被触发后调用notifyObservers()来通知Observer。
	void jButton1_actionPerformed(ActionEvent e) {
		subject.setWidthInfo(Integer.parseInt(jTextField1.getText()));
		subject.setHeightInfo(Integer.parseInt(jTextField2.getText()));
		subject.notifyObservers();
	}
}

 

import java.awt.FlowLayout;
import java.util.Observable;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class FrameObserver extends JFrame implements java.util.Observer {
	/**
	 * 2013-3-28
	 * @author Administrator
	 */
	private static final long serialVersionUID = 1L;
	JLabel jLabel1 = new JLabel("1");
	JLabel jLabel2 = new JLabel("2");
	JLabel jLabel3 = new JLabel("3");
	JLabel jLabel4 = new JLabel("4");

	FrameObserver() {
		this.setLayout(new FlowLayout());
		this.setSize(100, 100);
		this.add(jLabel1);
		this.add(jLabel2);
		this.add(jLabel3);
		this.add(jLabel4);
	}

	// 观察的数据
	int widthInfo = 0;
	int heightInfo = 0;

	// 在update()方法中实现对数据的更新和其它必要的反应。
	@Override
	public void update(Observable o, Object arg) {
		DateSubject subject = (DateSubject) o;
		widthInfo = subject.getWidthInfo();
		heightInfo = subject.getHeightInfo();
		jLabel1.setText("The heightInfo from subject is:  ");
		jLabel3.setText(String.valueOf(heightInfo));
		jLabel2.setText("The widthInfo from subject is:  ");
		jLabel4.setText(String.valueOf(widthInfo));
	}
}

 

public class Test{
	public static void main(String[] args) {
		FrameSubject subject = new FrameSubject();
		FrameObserver observer = new FrameObserver();
		// 在Subject中注册Observer,将两者联系在一起
		subject.registerObserver(observer);
		subject.setVisible(true);
		observer.setVisible(true);
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值