第一章 入門
1.這裏講了一個簡單的例子,鴨子的例子。鴨子都會叫,都會走,都會游泳(不變的部分)。但是有的鴨子會飛,有的鴨子的外觀不一樣等等(變得部分),如何設計呢?採取分離的策略,將不變的部分和可變的部分分離,因此引出我們第一個設計原則:找出應用中可能需要的變化之處,把它們獨立出來,不要和哪些不需要變化的代碼混在一起。
2.如何設計呢?對於上面的鴨子的例子,我們知道我們要增強我們的代碼彈性, 就是說要更容易修改,引出第二個設計原則:針對接口編程,而不是針對實現編程。具體來講,對於我們鴨子的每個可變行爲,比如飛行行爲,單獨拿出來作爲一個接口。如下圖
3.接下來,你就應該要整合鴨子的行爲了。前面的過程,我們將鴨子的可變行爲委託(delegate)給了FlayBehavior和QuackBehavior。具體的做法是讓鴨子類持有FlyBehavior和QuackBehavior的兩個實例變量,然後寫兩個方法,比如飛行方法,如下所示
public void performFly(){ flyBehavior.fly();}
這樣鴨子就有了自己的飛行行爲,我們只需要在實例化這個鴨子的時候,比如在構造函數中初始化對應的飛行和名叫的具體的類即可。
4.第三個設計原則:多用組合,少用繼承。
上述就講述了一個設計模式策略模式,而且是一個多策略模式,有飛行的策略,有名叫的策略,不同的策略下面又有不同的實現。
觀察者模式
import java.util.Observable;
import java.util.Observer;
public class BlackBoard implements Observer{
@Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
if(o instanceof Teacher){
Teacher teacher = (Teacher)o;
System.out.println(teacher.getContent());
}
}
}
被觀察者import java.util.Observable;
public class Teacher extends Observable{
private String content;
public Teacher(){
}
public void measurementsChanged(){
setChanged();
notifyObservers();
}
public void setContent(String content){
this.content=content;
measurementsChanged();
}
public String getContent() {
// TODO Auto-generated method stub
return content;
}
}
客戶端:public class Client {
public static void main(String[] args){
Teacher t = new Teacher();
t.addObserver(new BlackBoard());
t.setContent("Course Content");
// t.measurementsChanged();
t.setContent("new Content");
}
}
總結一下,觀察者模式需要以下步驟: