設計模式--觀察者模式
1、觀察者模式
觀察者模式:定義物件間一種一對多的依賴關系,當一個物件狀態發生變化時,所有依賴于它的物件都得到通知,并被自動更新,
2、觀察者模式的結構
-
角色
-
主題(Subject):主題是一個介面,該介面規定了具體主題需要實作的方法,比如添加,洗掉觀察者以及通知觀察者的方法,
-
觀察者(ObServer): 觀察者是一個介面,該介面規定了具體觀察者用來獲得資料的方法,
-
具體主題(ConcreteSubject):具體主題是實作主題介面的類的一個實體,該實體包含觀察者關心的資料,而且這些資料可能經常發生變化,具體主題需要使用一個集合來存放觀察者的參考,以便資料變化時通知具體的觀察者,
-
具體觀察者(ConreteObserver):具體觀察者是實作觀察者介面的類的一個實體,具體觀察者包含具體主題的參考,以便讓具體主題將自己添加到具體主題的集合中,使自己成為具體主題的觀察者,或者從具體主題的集合中將自己洗掉,不成為具體主題的觀察者,
-
-
UML圖

3、觀察者模式舉例
主題介面:Subject.java
1 package com.nick.pattern.observer; 2 3 import java.util.ArrayList; 4 5 /** 6 * @ 主題介面:定義了觀察者陣列(存放觀察者的資訊)和抽象方法 7 * @author nick 8 * 9 */ 10 public interface Subject { 11 ArrayList<Observer> observers =null;
12 void attach(Observer obs);
13 void detach(Observer obs);
14 void cry(); //相當于notify()通知方法
15 }
觀察者介面:Observer.java
1 package com.nick.pattern.observer;
2 /**
3 * @ 觀察者介面
4 * @author nick
5 */
6 public interface Observer {
7 void response(); //相當于update()方法
8 }
具體主題類:Cat.java
1 package com.nick.pattern.observer; 2 3 import java.util.ArrayList; 4 5 /** 6 * @ 具體主題:貓(老鼠和狗是觀察者,他們通過觀察貓的行為,做出反應) 7 * @author nick 8 * 9 */ 10 public class Cat implements Subject { 11 ArrayList<Observer> observers = new ArrayList<Observer>(); 12 13 @Override 14 public void attach(Observer obs) { 15 observers.add(obs); 16 } 17 18 @Override 19 public void detach(Observer obs) { 20 observers.remove(obs); 21 } 22 23 @Override 24 public void cry() { //通知方法 25 System.out.print("貓叫:"); 26 System.out.println("喵喵喵"); 27 for(Observer obs:observers) { 28 obs.response(); 29 } 30 } 31 }
具體觀察者:Dog.java
1 package com.nick.pattern.observer;
2 /**
3 * @ 具體觀察者: 狗
4 * @author nick
5 *
6 */
7 public class Dog implements Observer{
8
9 @Override
10 public void response() {
11 System.out.print("狗叫:");
12 System.out.println("汪汪汪");
13 }
14
15 }
具體觀察者:Mouse.java
1 package com.nick.pattern.observer;
2 /**
3 * @ 具體觀察者:老鼠
4 * @author nick
5 *
6 */
7 public class Mouse implements Observer{
8
9 @Override
10 public void response() {
11 System.out.print("老鼠跑:");
12 System.out.println("跑跑跑");
13 }
14
15 }
主程式:Application.java
1 package com.nick.pattern.observer;
2 /**
3 * @ 主程式
4 * @author nick
5 *
6 */
7 public class Application {
8
9 public static void main(String[] args) {
10 Subject cat = new Cat();
11 Observer dog = new Dog();
12 Observer mouse = new Mouse();
13 cat.attach(dog);
14 cat.attach(mouse);
15
16 cat.cry();//觸發通知方法
17 }
18
19 }
運行結果:

4、觀察者模式的優缺點
- 優點1: 具體主題和觀察者是松耦合的關系,由于主題介面僅僅依賴與觀察者介面,因此具體主題只是知道他的觀察者是實作觀察者介面的某個類的實體,但不需要知道是哪個類,
- 優點2:具體觀察者只需要知道它依賴的主題是實作主題介面的某個實體即可,不需要知道具體是哪個類,
- 優點3:觀察者模式滿足“開-閉”原則,主題介面(Subject)僅僅依賴于觀察者介面(Observer),這樣具體主題的類也僅僅依賴于觀察者介面,增加新的實作觀察者介面的類,不必修改創建具體主題的類的代碼:
- 新增加一個觀察者Pig.java
-
1 package com.nick.pattern.observer; 2 /** 3 * @ 新增的觀察者Pig 4 * @author nick 5 */ 6 public class Pig implements Observer{ 7 8 @Override 9 public void response() { 10 System.out.println("豬叫:"); 11 System.out.println("咯咯咯"); 12 } 13 14 }
- 只需要在主程式中添加這兩行代碼



轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/35316.html
標籤:設計模式
上一篇:設計模式--裝飾器模式
