### 觀察者模式
定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。(摘抄)
觀察者模式可以大大的降低類與類之間的耦合,同時又能保持一些對象改變的一致性。
觀察者模式把相互調用的類,抽象成了兩個部分,它們之間互不干擾,可以各自獨立的改變和使用,其中一個部分依賴于另一個部分的抽象,當一個部分改變時,可以通知另一個部分及時發生改變。
~~~
import java.util.ArrayList;
abstract class Subject
{
private ArrayList<Observer> list = new ArrayList<Observer>();
private String subjectState;
public void Attach(Observer observer)
{
}
public void Detach(Observer observer)
{
}
public void Notify()
{
for (Observer o : list)
{
o.update();
}
}
}
interface Observer
{
void update();
}
class ConcreteSubject1 extends Subject
{
public void Notify()
{
System.out.println("abcd");
}
}
class ConcreteSubject2 extends Subject
{
public void Notify()
{
System.out.println("bcde");
}
}
class ConcreteObserver1 implements Observer
{
private Subject subject;
public ConcreteObserver1(Subject subject)
{
this.subject = subject;
}
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("1"+subject);
}
}
class ConcreteObserver2 implements Observer
{
private Subject subject;
public ConcreteObserver2(Subject subject)
{
this.subject = subject;
}
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("2"+subject);
}
}
class Client
{
public static void main()
{
Subject subject = new ConcreteSubject1();
subject.Attach(new ConcreteObserver1(subject));
subject.Attach(new ConcreteObserver2(subject));
subject.Notify();
//更換主題類
// Subject subject = new ConcreteSubject2();
//
// subject.Attach(new ConcreteObserver1(subject));
// subject.Attach(new ConcreteObserver2(subject));
//
// subject.Notify();
}
}
~~~
話說我感覺這一章這本書好像沒怎么講明白,所以感覺自己說呢也沒有說明白,不過差不多理解什么意思了,我感覺樹上前面的代碼完全就還是耦合的,還是在ConcreteObserver類中調用了ConcreteSubject類,它沒有用到抽象的類,我感覺可能書上弄錯了。
觀察者模式優點:就是類與類之間依賴的是抽象對象,而不是具體對象,當具體對象更改時對于整個代碼是沒有影響的,同時是多個對象依賴于一個抽象對象,當對象狀態發生變化時通知其它對象發生相應的改變比較方便
觀察者模式缺點:抽象通知者依賴的是抽象觀察者,當抽象觀察者產生的時間在抽象通知者之后,那么就沒有update方法給抽象觀察者調用了。
### 委托
用委托的方法可以解除掉觀察者模式的缺點,在c#中有委托這種用法,在java中就要使用到動態代理,需要理一理思路,查一查文章,等下再寫一篇專門說java動態代理的吧
- 前言
- (1)代碼無錯就是優?——簡單工廠模式
- (2)商場促銷——策略模式
- (3)&amp;(4)&amp;(5) 設計模式原則
- (6)穿什么有這么重要?——裝飾模式
- (7)為別人做嫁衣——代理模式
- (8)雷鋒依然在人間——工廠方法模式
- (9)簡歷復印——原型模式
- (10)考題抄錯會做也白搭——模板方法模式
- (11)迪米特法則
- (12)牛市股票還會虧錢?—— 外觀模式
- (13)好菜每回味不同——建造者模式
- (14)老板回來,我不知道——觀察者模式
- java實現事件委托
- (15)就不能不還DB嗎?—— 抽象工廠模式
- (16)無盡加班何時休息——狀態模式
- (17)在NBA我需要翻譯——適配器模式
- (18)如果再回到從前——備忘錄模式
- (19)分公司=部門——組合設計模式
- (20)想走?可以!先買票——迭代器模式
- (21)有些類也需計劃生育——單例模式
- (22)手機軟件何時統一——橋接模式
- (23)烤羊肉串引來的思考——命令模式
- (24)加薪非要老總批?——職責鏈模式
- (25)世界需要和平——中介者模式
- (26)項目多也別傻做——享元模式
- (28)男人和女人——訪問者模式