1、观察者模式定义
对象间的一种一对多的依赖关系。当一方的对象改变状态时,所有的依赖者都会得到通知并被自动更新。也称之为依赖(Dependents)、发布-订阅(Publish-Subscribe)模式。
2、观察者模式意图
将一个系统分割成一系列相互协作的类有一个常见的副作用:需要维护相关对象间的一致性。我们不希望为了维持一致性而使得各个类紧密耦合,导致可重用性的降低。观察者模式是使得任意数目的观察者不必知道彼此的存在,且主题发生变化时都可以得到主题的通知,而同步改变状态。是一种松散耦合,具有更好的可重用性。
3、观察者模式组成
a、主题(Subject):知道它的观察者(观察者必须实现特定接口),可以有任意多观察者。提供注册和注销观察者的接口。
b、观察者(Observer):为那些在主题发生变化时需要获得通知的对象定义一个更新(update)接口。
c、ConcreteSubject(具体主题):保持实际状态数据,当状态发生变化时通知各观察者。
d、ConcreteObserver(具体观察者):维持一个指向具体主题对象的引用。
4、观察者模式示例
(1)男朋友接口
package com.iotek.observer;
public interface IBoyFriend {
void update(String msg);//更新信息
}
(2)女生接口
package com.iotek.observer;
public interface IGirl {
void attachBoyFriend(IBoyFriend boyFriend);//注册一个男朋友
void deleteBoyFriend(IBoyFriend boyFriend);//删除一个男朋友
void notifyBoyFriend();//通知所有男朋友
}
(3)女生实现类
package com.iotek.observer;
import java.util.ArrayList;
import java.util.List;
public class PrettyGirl implements IGirl {
private List<IBoyFriend> boyList=new ArrayList<IBoyFriend>();
private String msg="我生病了";
@Override
public void attachBoyFriend(IBoyFriend boyFriend) {
boyList.add(boyFriend);
}
@Override
public void deleteBoyFriend(IBoyFriend boyFriend) {
if(boyList.size()>0){
boyList.remove(boyFriend);
}
}
@Override
public void notifyBoyFriend() {
for(int i=0;i<boyList.size();i++){
IBoyFriend boyFriend=boyList.get(i);
boyFriend.update(msg);
}
}
}
(4)三个男朋友实现类
package com.iotek.observer;
public class LiBoyFriend implements IBoyFriend {
@Override
public void update(String msg) {
if(msg.equals("我生病了")){
System.out.println("我现在没空");
}
}
}
package com.iotek.observer;
public class WangBoyFriend implements IBoyFriend {
@Override
public void update(String msg) {
if(msg.equals("我生病了")){
System.out.println("和我无关,我不认识你!");
}
}
}
package com.iotek.observer;
public class ZhangBoyFriend implements IBoyFriend {
@Override
public void update(String msg) {
if(msg.equals("我生病了")){
System.out.println("我马上过来");
}
}
}
(5)测试类
package com.iotek.observer;
public class Test {
public static void main(String[] args) {
//实例化三个男朋友
ZhangBoyFriend zhnagBoyFriend=new ZhangBoyFriend();
LiBoyFriend liBoyFriend=new LiBoyFriend();
WangBoyFriend wangBoyFriend=new WangBoyFriend();
//实例化女生类,并且添加三个男朋友,删除一个男朋友
PrettyGirl girl=new PrettyGirl();
girl.attachBoyFriend(wangBoyFriend);
girl.attachBoyFriend(zhnagBoyFriend);
girl.attachBoyFriend(liBoyFriend);
girl.deleteBoyFriend(wangBoyFriend);
//女生发出信息
girl.notifyBoyFriend();
}
}
5、Swing介绍
(1)Java1.2引入称为Swing的新的GUI组件库。它是一个用于开发Java应用程序用户界面的开发工具包。
(2)Swing控件是用纯Java语言编写而成的,不依赖于本地操作系统的GUI,Swing控件可以跨平台运行。独立于本地平台的Swing控件被称为轻量级控件,而依赖于本地的AWT控件被称为重量级控件。
(3)它以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格。Swing开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。
(4)工具包中所有的包都是以Swing作为名称,例如:javax.swing,javax.swing.event。
6、Swing框架
7、开发Swing图形界面主要步骤
导入Swing包-->设置顶层容器-->设置按钮和标签等Swing组件-->将组件添加至容器中-->处理事件。
8、简单示例
package com.iotek.observer;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class SwingTest {
public static void main(String[] args) {
JFrame frame=new JFrame("Hello Swing");//设置一个顶级容器
JLabel label=new JLabel("你好,Swing");//创建一个Swing组件
frame.getContentPane().add(label);//将组件添加到容器内容窗格
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//单击关闭按钮时可以关闭窗口
frame.setSize(300,200);
frame.setVisible(true);
}
}