Swing中惯用模式之观察者

作者: LinkedIn | 来源:发表于2017-04-05 11:10 被阅读0次

    #定义

    观察者模式又叫 发布-订阅 模式,定义的两个对象之间是一种一对多的强依赖关系,当一个对象的状态发生改变,所有依赖它的对象

    # 关键角色:

    1.主题(Subject)

      抽象主题以及具体的主题

    2.观察者(Observer)

      抽象观察者以及具体观察者

    Swing中惯用模式之观察者

    ##抽象理解:我们订阅简书中喜欢的栏目,一旦这个栏目有通知,我们订阅用户会收到通知,我们作为具体观察者 而订阅栏目作为具体主题

    swing的按钮监听,通过事件委托机制,进行分发,来处理不同的事件,下面举一个例子

    ```

    package org2.main.swing;

    import javax.swing.*;

    /**

    * Created by Administrator on 2017/4/5

    * swing驱动事件

    */

    public class MainFrame {

    //定义个容器变量

    JFrame f = null;

    //定义个按钮变量

    JButton btn = null;

    public MainFrame() {

    //创建容器

    f = new JFrame( "事件模型" );

    //创建按钮

    btn = new JButton( "按钮" );

    //把按钮添加到容器中

    f.add( btn );

    //设置容器大小

    f.setSize( 300, 200 );

    //把容器设置为 可见

    f.setVisible( true );

    //给按钮添加事件处理

    //在btn上注册一个监听器

    //(btn其实就是具体的主题对象)

    //(而监听器就是具体的观察者)

    //当点击按钮时(其实也就是主题对象发生了改变),就会触发监听器事件(观察者更新了)

    btn.addActionListener( new MyListener() );

    }

    //main方法

    public static void main( String[] args ) {

    new MainFrame();

    }

    }

    ```

    下面是事件具体处理

    ```

    package org2.main.swing;

    import java.awt.event.ActionEvent;

    import java.awt.event.ActionListener;

    /**

    * Created by Administrator on 2017/4/5

    * 定义一个监听器(具体观察者)

    */

    public class MyListener implements ActionListener {

    //该方法类似于观察中的update方法

    @Override

    public void actionPerformed( ActionEvent e ) {

    System.out.println( "按钮被点击,执行一些业务逻辑操作" );

    }

    }

    ```

    #总结

      总的来说,观察者模式所做的工作其实就是在解除耦合。让耦合双方都依赖抽象,

    而不是具体。从而使得各自的变化都不影响其他一方。这也符合了依赖倒置原则。

    #使用原则

    1.当一个对象的改变需要同时改变其他对象时。

    2.一个对象不知道它的改变会影响多少个类的改变。

    3.当有一个抽象模型有两个方面,一面依赖另一面。这时观察者模式可以很好地

    将两者封装在独立的对象使它们各自独立改变和复用。

    最后:重写组件时可能运用到观察者模式,在数据处理,数据更新,通知其他消息组件时,都可以运用到!

    #缺点

    观察者设计模式中需要每个观察者重写通知方法,但是实际运用中,不可能能每个观察者都有通知方法,那么怎么解决这个问题呢,那就是运用消息队列来处理,拥有消息通知方法的观察者发布消息到队列中,实际主题只需要设计响应的方法从消息队列中取出消息数据即可!提供实际类

    参考

    java.util.concurrent.BlockingQueue;

    java.util.concurrent.LinkedBlockingQueue;

    相关文章

      网友评论

        本文标题:Swing中惯用模式之观察者

        本文链接:https://www.haomeiwen.com/subject/lbptattx.html