EchoDemo's Blogs

Java中的观察者模式和Swing

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);
    }
}
🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------