第一章 入门
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");
}
}
总结一下,观察者模式需要以下步骤: