观察者模式的问题及其相关内容
生活随笔
收集整理的這篇文章主要介紹了
观察者模式的问题及其相关内容
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這里寫自定義目錄標題
- 原理
- 缺點
- 被觀察者的特點
- 觀察者的特點
- 另一種解耦實現
- SpringBoot場景
?
原理
https://www.runoob.com/design-pattern/observer-pattern.html
缺點
1個被觀察者,多個觀察者。
被觀察者的特點
被觀察者要維護觀察者列表 :
private List<Observer> observers = new ArrayList<Observer>();被觀察者更新時調用自己的一個方法如setState,然后通知所有觀察者執行他自己的方法(行為)。
public void setState(int state) {
this.state = state;
notifyAllObservers();
}
觀察者的特點
初始化的時候需要引用觀察者(這樣的話,觀察者能知道被觀察者的所有屬性行為);然后讓被觀察者那里登記自己。
public BinaryObserver(Subject subject){this.subject = subject;this.subject.attach(this);}==============
另一種解耦實現
搞一個消息中心 EventCenter.java,比如被觀察者為登錄系統,系統登錄時通知下游觀察者做一些事情,可以EventCenter中實現如下方法。
public static void doLogin(String loginType, Object loginId, String tokenValue, LoginModel loginModel) {for (Listener listener : listenerList) {listener.doLogin(loginType, loginId, tokenValue, loginModel);}}被觀察者要發特定消息(比如登錄)時,直接調用,被觀察者就沒事兒了
EventCenter.doLogin(loginType, id, tokenValue, loginModel);很多觀察者(很多類)可以都實現Listener接口,并且注冊到EventCenter(加到listenerList里面),這樣就能執行觀察者自己的行為了。
這樣的問題是很多觀察者只能通過參數獲取到被觀察者的部分信息。但可以搞很多被觀察者。
SpringBoot場景
可以定義個map讓子類自動注入,都不用手動注冊到EventCenter了。
?
#mermaid-svg-vCVFQhnlnMqqa8K1 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-vCVFQhnlnMqqa8K1 .error-icon{fill:#552222;}#mermaid-svg-vCVFQhnlnMqqa8K1 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vCVFQhnlnMqqa8K1 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-vCVFQhnlnMqqa8K1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vCVFQhnlnMqqa8K1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vCVFQhnlnMqqa8K1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vCVFQhnlnMqqa8K1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vCVFQhnlnMqqa8K1 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vCVFQhnlnMqqa8K1 .marker.cross{stroke:#333333;}#mermaid-svg-vCVFQhnlnMqqa8K1 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vCVFQhnlnMqqa8K1 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-vCVFQhnlnMqqa8K1 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-vCVFQhnlnMqqa8K1 .actor-line{stroke:grey;}#mermaid-svg-vCVFQhnlnMqqa8K1 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-vCVFQhnlnMqqa8K1 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-vCVFQhnlnMqqa8K1 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-vCVFQhnlnMqqa8K1 .sequenceNumber{fill:white;}#mermaid-svg-vCVFQhnlnMqqa8K1 #sequencenumber{fill:#333;}#mermaid-svg-vCVFQhnlnMqqa8K1 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-vCVFQhnlnMqqa8K1 .messageText{fill:#333;stroke:#333;}#mermaid-svg-vCVFQhnlnMqqa8K1 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-vCVFQhnlnMqqa8K1 .labelText,#mermaid-svg-vCVFQhnlnMqqa8K1 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-vCVFQhnlnMqqa8K1 .loopText,#mermaid-svg-vCVFQhnlnMqqa8K1 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-vCVFQhnlnMqqa8K1 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-vCVFQhnlnMqqa8K1 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-vCVFQhnlnMqqa8K1 .noteText,#mermaid-svg-vCVFQhnlnMqqa8K1 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-vCVFQhnlnMqqa8K1 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-vCVFQhnlnMqqa8K1 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-vCVFQhnlnMqqa8K1 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-vCVFQhnlnMqqa8K1 .actorPopupMenu{position:absolute;}#mermaid-svg-vCVFQhnlnMqqa8K1 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-vCVFQhnlnMqqa8K1 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-vCVFQhnlnMqqa8K1 .actor-man circle,#mermaid-svg-vCVFQhnlnMqqa8K1 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-vCVFQhnlnMqqa8K1 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 張三 李四 王五 你好!李四, 最近怎么樣? 你最近怎么樣,王五? 我很好,謝謝! 我很好,謝謝! 李四想了很長時間, 文字太長了 不適合放在一行. 打量著王五... 很好... 王五, 你怎么樣? 張三 李四 王五這將產生一個流程圖。:
#mermaid-svg-BawcJA9TGQCoQqNB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BawcJA9TGQCoQqNB .error-icon{fill:#552222;}#mermaid-svg-BawcJA9TGQCoQqNB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BawcJA9TGQCoQqNB .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-BawcJA9TGQCoQqNB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BawcJA9TGQCoQqNB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BawcJA9TGQCoQqNB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BawcJA9TGQCoQqNB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BawcJA9TGQCoQqNB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BawcJA9TGQCoQqNB .marker.cross{stroke:#333333;}#mermaid-svg-BawcJA9TGQCoQqNB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BawcJA9TGQCoQqNB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-BawcJA9TGQCoQqNB .cluster-label text{fill:#333;}#mermaid-svg-BawcJA9TGQCoQqNB .cluster-label span{color:#333;}#mermaid-svg-BawcJA9TGQCoQqNB .label text,#mermaid-svg-BawcJA9TGQCoQqNB span{fill:#333;color:#333;}#mermaid-svg-BawcJA9TGQCoQqNB .node rect,#mermaid-svg-BawcJA9TGQCoQqNB .node circle,#mermaid-svg-BawcJA9TGQCoQqNB .node ellipse,#mermaid-svg-BawcJA9TGQCoQqNB .node polygon,#mermaid-svg-BawcJA9TGQCoQqNB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BawcJA9TGQCoQqNB .node .label{text-align:center;}#mermaid-svg-BawcJA9TGQCoQqNB .node.clickable{cursor:pointer;}#mermaid-svg-BawcJA9TGQCoQqNB .arrowheadPath{fill:#333333;}#mermaid-svg-BawcJA9TGQCoQqNB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BawcJA9TGQCoQqNB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BawcJA9TGQCoQqNB .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-BawcJA9TGQCoQqNB .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-BawcJA9TGQCoQqNB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BawcJA9TGQCoQqNB .cluster text{fill:#333;}#mermaid-svg-BawcJA9TGQCoQqNB .cluster span{color:#333;}#mermaid-svg-BawcJA9TGQCoQqNB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BawcJA9TGQCoQqNB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 鏈接 長方形 圓 圓角長方形 菱形總結
以上是生活随笔為你收集整理的观察者模式的问题及其相关内容的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【bug】Result Maps col
- 下一篇: 移动架构 (一) 详解架构设计中UML图