动机:对某些对象建立一种“通知依赖关系”,一个对象改变了,所有的依赖对象都将得到通知
编译式依赖:A依赖B,编译的时候编译A的时候B必须存在
需求:将一个东西变成两份(int整型),并通知返回到前端
class A{
int num;
TextObject to;
public A(int n,TextObject temp){
this.num=n;
this.to=temp;
}
public void add(){
this.num*2;
showSomething();
}
public void showSomething(){
to.show();
}
}
class B{
TextObject to;
public static void main(String[] args){
A a=new A(10,to);
a.add();
}
}
但是,这时候需求又新加了,整型变一倍也要在画板中展示,那样设计的话就违背了开闭原则了,而且违背了依赖倒置原则,因为B类中TextObject依赖了A中的TextObject,于是,要做出以下改动
interface View{
public void showSomething();
}
class A{
int num;
//TextObject to;
View view;
public A(int n,View temp){
this.num=n;
this.view=temp;
}
public void add(){
this.num*2;
view.showSomething();
}
}
class B implements View{
TextObject to;
@Override
public void showSomething(){
to.show();
}
public static void main(String[] args){
A a=new A(10,this);
a.add();
}
}
这样就可以不管用什么控件显示,都可以不用改变加倍类,但是这不是真正的观察者模式,真正的观察者模式是一个类变化了,将会通知多个依赖,而我们这里只是一对一关系,所以真正的观察者模式需要将上面的View改写成List