观察者模式
标签(空格分隔): 设计模式
观察者模式: 当对象之间存在一对多的关系的时候, 则使用观察者模式. 比如当一个对象呗修改的时候, 则会自动通知他的依赖对象, 观察者模式属于行为模式
优点
观察者模式实现了动态联动
观察者模式实现了广播通信
缺点
如一个主题被大量观察者观察, 则通知所有的观察者的代价较高.
如果某些观察者的相应方法被阻塞, 整个通知过程也会被阻塞, 其他观察者不能及时被通知.
public interface Observer {
void update(String info);
}
public class StudentObserver implements Observer {
private String name;
public StudentObserver(String name) {
this.name = name;
}
@Override
public void update(String info) {
System.out.println(name+"收到消息"+info);
}
}
import java.util.ArrayList;
import java.util.List;
public interface Subject{
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers(String msg);
}
import java.util.ArrayList;
import java.util.List;
public class TeacherSubject implements Subject{
//用来存放和记录观察者
private List<Observer> observers=new ArrayList<Observer>();
@Override
public void registerObserver(Observer obj) { //增加观察者
observers.add(obj);
}
@Override
public void removeObserver(Observer obj) { //删除观察者
int i = observers.indexOf(obj);
if( i >= 0 )
observers.remove(obj);
}
@Override
public void notifyObservers(String msg) { //通知消息
for(Observer observer : observers) {
observer.update(msg);
}
}
}
public class Test {
public static void main(String[] args){
TeacherSubject teacher = new TeacherSubject();
StudentObserver studentObserver1 = new StudentObserver("鸣人");
StudentObserver studentObserver2 = new StudentObserver("佐助");
teacher.registerObserver(studentObserver1);
teacher.registerObserver(studentObserver2);
teacher.notifyObservers("发作业啦");
}
}