在学习到java MVC模式的时候,发现view和mode的关系搞不太清楚,所以在各种百度下总结了一些,现在记下来免得以后忘记了。
MVC中 View 事先注册在 Mode中 通过Control来修改Mode ,Mode在通知View更新。。也就是说Mode.addObserver(View) 但是View又需要Mode提供数据,所以需要View.addMode() ,之后也需要Control.addMode() 也就是说Control和View通过Mode进行联系,两者并没有直接的联系。
view和mode这种模式,也被称为观察者模式,view称为观察者,而mode称为被观察者,这是一个一对多的关系,就是说mode中可以注册多个view,当mode改变时通知所有注册过的view并进行相应的更新。理解到这里还是通过代码会更清楚。所以又做了一个小demo。
首先写一个观察者接口,里面就一个方法update用于更新状态
package com.pattern.observer;
/**
* 观察者
* @author blackcup
*
*/
public interface Observer {
/**
* 更新的接口
*/
public void update();
}
再写一个实体类ViewObserver实现接口Observer
package com.pattern.observer;
public class ViewObserver implements Observer{
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("View状态更新");
}
}
在写抽象类subject 维护一个list,用来存储observer, 提供删除添加和通知所有观察者的方法
package com.pattern.observer;
import java.util.ArrayList;
import java.util.List;
public abstract class Subject {
private List<Observer> oberverList = new ArrayList<Observer>();
/**
* 添加观察者
* @param observer
*/
public void addObserver(Observer observer) {
oberverList.add(observer);
}
/**
* 删除观察者
*/
public void delObserver(Observer observer) {
oberverList.remove(observer);
}
/**
* 通知所有观察者,并调用更新方法
*/
public void notifyAllObserver() {
for(Observer o: oberverList) {
o.update();
}
}
}
在写一个实体类ModeSubject,其中就一个方法changeState()模拟mode被修改状态
package com.pattern.observer;
public class ModeSubject extends Subject{
public void changeState() {
System.out.println("Mode改变状态");
this.notifyAllObserver();
}
}
万事ok 就差一个主函数了
package com.pattern.observer;
public class DoMain {
public static void main(String[] args) {
//实例化view
ViewObserver view = new ViewObserver();
//实例化mode
ModeSubject mode = new ModeSubject();
//模拟view在mode注册
mode.addObserver(view);
//模拟mode改变状态通知view更新状态
mode.changeState();
}
}
结果:
Mode改变状态
View状态更新
这只是观察者模式中的推模式,只是单纯通知所有观察者并不关心观察者需不需要。还有另外一种拉模式,相当于说你想要什么你自己拿的思想,直接把被观察者当做参数传递给观察者,由观察者自己取想要的数据。将上面代码update()方法改为update(ModeSubject mode);在做一些修改就是拉模式了。