最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設計模式中的觀察者模式

 更新時間:2023年02月16日 15:27:31   作者:非凡的小笨魚  
觀察者模式定義對象之間的一種一對多的依賴關系,使得每當一個對象的狀態(tài)發(fā)生變化時,其相關的依賴對象都可以得到通知并被自動更新。主要用于多個不同的對象對一個對象的某個方法會做出不同的反應

一.介紹

觀察者模式(Observer Pattern)屬于行為型模式。定義了對象之間的一對多依賴,讓多個觀察者同時監(jiān)聽某一個主題對象,類似于廣播機制,只需要分發(fā)廣播,感興趣的對象自動接收該廣播。我們平常所說的Observer、Listener、Hook、Callback都和這個模式有關

二.場景約束

小孩(Baby)哭的時候會通知到爸爸(Dad)和媽媽(Mum),爸爸媽媽會對此采取不同的行為

三.UML類圖

版本一

版本二

新增事件類將觀察者與主題解耦,觀察者可以根據不同的事件執(zhí)行不同的操作,也可以直接對事件源進行操作

四.示意代碼(版本一)

業(yè)務代碼

//抽象觀察者
public interface Observer {
    void action();
}
//抽象主題
abstract class Subject{
    protected List<Observer> observers = new ArrayList<>();
    public void addObserver(Observer observer) {
        observers.add(observer);
    }
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }
    public abstract void notifyObserver();
}
//具體主題-被觀察者
class Baby extends Subject{
    @Override
    public void notifyObserver() {
        System.out.println("baby cry");
        observers.forEach(Observer::action);
    }
}
//具體觀察者
class Dad implements Observer {
    @Override
    public void action() {
        System.out.println("dad feed baby");
    }
}
//具體觀察者
class Mum implements Observer {
    @Override
    public void action() {
        System.out.println("mum hug baby");
    }
}

客戶端

public class Client {
    public static void main(String[] args) {
        Baby baby = new Baby();
        baby.addObserver(new Mum());
        baby.addObserver(new Dad());
        baby.notifyObserver();
    }
}

五.示意代碼(版本二)

//抽象觀察者
public interface Observer {
    void action(Event event);
}
//抽象主題
abstract class Subject {
    protected List<Observer> observers = new ArrayList<>();
    public void addObserver(Observer observer) {
        observers.add(observer);
    }
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }
    public abstract void notifyObserver();
}
//具體主題-被觀察者
class Baby extends Subject {
    @Override
    public void notifyObserver() {
        System.out.println("baby cry");
        CryEvent cryEvent = new CryEvent(new Date().getTime(), this);
        observers.forEach(observer -> observer.action(cryEvent));
    }
}
//抽象事件
abstract class Event {
    public abstract Object getSource();
}
//具體事件
class CryEvent extends Event {
    public long when;
    Baby source;
    public CryEvent(long when, Baby source) {
        this.when = when;
        this.source = source;
    }
    @Override
    public Baby getSource() {
        return source;
    }
}
//具體觀察者
class Dad implements Observer {
    @Override
    public void action(Event event) {
        System.out.println("dad feed baby");
        if(event.getSource() instanceof Baby){
            System.out.println("dad對事件源進行處理");
        }
    }
}
//具體觀察者
class Mum implements Observer {
    @Override
    public void action(Event event) {
        System.out.println("mum hug baby");
        if(event.getSource() instanceof Baby){
            System.out.println("mum對事件源進行處理");
        }
    }
}

客戶端

public class Client {
    public static void main(String[] args) {
       Baby baby = new Baby();
       baby.addObserver(new Dad());
       baby.addObserver(new Mum());
       baby.notifyObserver();
    }
}

六.觀察者模式與發(fā)布訂閱模式

發(fā)布訂閱模式

  • 發(fā)布者不會直接通知訂閱者
  • 發(fā)布者與訂閱者完全解耦

觀察者模式

  • 主題要自己通知(notify)觀察者
  • 主題與觀察者松耦合

七.優(yōu)點

  • 符合依賴倒置原則(觀察者與主題都依賴于抽象)
  • 降低耦合(主題與觀察者之間的耦合關系)

八.在JDK中的典型應用

在java.awt包下有很多觀察者模式的身影,先來看下簡單的UML類圖

主題角色:java提供的組件類(以Button為例) 觀察者角色:java提供的事件監(jiān)聽(各種Listener) 事件角色:鼠標事件、鍵盤事件等等

再來看看一個小demo 在窗口中添加一個按鈕,給按鈕添加上鼠標與鍵盤的相關事件,當點擊按鈕或者按下鍵盤的時候在控制臺打印相應的語句

public class MainFrame extends JFrame {
    public MainFrame() throws HeadlessException {
        //定義一個具體主題
        Button button = new Button("click");
        //給主題添加觀察者(鼠標監(jiān)聽)
        button.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                //MouseEvent就是具體事件
                System.out.println("按鈕被點擊");
            }
        });
        //給主題添加觀察者(鍵盤監(jiān)聽)
        button.addKeyListener(new KeyAdapter() {
            @Override
            public void keyTyped(KeyEvent e) {
                //KeyEvent就是具體事件
                System.out.println("按下" + e.getKeyChar());
            }
        });
        add(button);
        setSize(100,100);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }
    public static void main(String[] args) {
        new MainFrame();
    }
}

這里的KeyAdapter與MouseAdapter使用的是適配器模式

到此這篇關于Java設計模式中的觀察者模式的文章就介紹到這了,更多相關Java觀察者模式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 完美解決MybatisPlus插件分頁查詢不起作用總是查詢全部數據問題

    完美解決MybatisPlus插件分頁查詢不起作用總是查詢全部數據問題

    這篇文章主要介紹了解決MybatisPlus插件分頁查詢不起作用總是查詢全部數據問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • spring源碼閱讀--aop實現原理講解

    spring源碼閱讀--aop實現原理講解

    這篇文章主要介紹了spring源碼閱讀--aop實現原理講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java 微信小程序code獲取openid的操作

    java 微信小程序code獲取openid的操作

    這篇文章主要介紹了java 微信小程序code獲取openid的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • SpringCloud解決feign調用token丟失問題解決辦法

    SpringCloud解決feign調用token丟失問題解決辦法

    在feign調用中可能會遇到如下問題:同步調用中,token丟失,這種可以通過創(chuàng)建一個攔截器,將token做透傳來解決,異步調用中,token丟失,這種就無法直接透傳了,因為子線程并沒有token,這種需要先將token從父線程傳遞到子線程,再進行透傳
    2024-05-05
  • Spring?WebMVC初始化Controller流程詳解

    Spring?WebMVC初始化Controller流程詳解

    這篇文章主要介紹了Spring?WebMVC初始化Controller流程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Spring Boot實現分布式鎖的自動釋放的示例代碼

    Spring Boot實現分布式鎖的自動釋放的示例代碼

    在實際開發(fā)中,我們可以使用 Redis、Zookeeper 等分布式系統來實現分布式鎖,本文將介紹如何使用 Spring Boot 來實現分布式鎖的自動釋放,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • Java使用AOP技術實現通用接口驗簽工具

    Java使用AOP技術實現通用接口驗簽工具

    這篇文章主要為大家詳細介紹了Java如何使用AOP技術實現通用接口驗簽工具,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下吧
    2025-03-03
  • JAVA中字符串函數subString的用法小結

    JAVA中字符串函數subString的用法小結

    本篇文章主要是對JAVA中字符串函數subString的用法進行了詳細的介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-02-02
  • 詳解如何將JAVA程序制作成可以直接執(zhí)行的exe文件

    詳解如何將JAVA程序制作成可以直接執(zhí)行的exe文件

    這篇文章主要介紹了詳解如何將JAVA程序制作成可以直接執(zhí)行的exe文件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • java常見的五種加密算法使用方法舉例

    java常見的五種加密算法使用方法舉例

    這篇文章主要介紹了java常見的加密算法使用的相關資料,分別是BCrypt、MD5、RSA、AES和SM4這五種加密算法,并簡要描述了它們的特點和應用場景,給出了詳細的代碼示例,需要的朋友可以參考下
    2025-03-03

最新評論

思茅市| 南阳市| 建德市| 长阳| 贵定县| 襄汾县| 滁州市| 温宿县| 东丽区| 南通市| 甘南县| 平潭县| 井冈山市| 衡阳市| 潮州市| 天峨县| 孝昌县| 和平县| 衡东县| 建宁县| 阿尔山市| 郸城县| 阳谷县| 仙游县| 鞍山市| 报价| 大连市| 荥经县| 京山县| 正蓝旗| 尼勒克县| 札达县| 彭阳县| 漯河市| 新巴尔虎右旗| 邯郸市| 墨脱县| 五常市| 松潘县| 太湖县| 南投县|