观察者模式(Observer):观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主体对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己.
举个生活中的例子:报社和订阅者,这里的报社相当于主题,订阅者就是观察者,一旦报社发布了新报刊,那么订阅者就可以收到由报社发出的报刊
举个Java中的例子,Swing事件监听
下面举出Java代码:
package One;
import Many.Subscriber;
//报社
public interface office {
void add(Subscriber subscribers);
void remove(Subscriber subscribers);
}
package One;
import java.util.ArrayList;
import Many.Subscriber;
public class officeImp implements office{
private ArrayList list = null;
private String message;
public officeImp() {
list = new ArrayList<>();
}
@Override
public void add(Subscriber subscribers) {
// TODO Auto-generated method stub
list.add(subscribers);
}
@Override
public void remove(Subscriber subscribers) {
// TODO Auto-generated method stub
if(list.contains(subscribers))
list.remove(subscribers);
else
return;
}
//状态改变
public void changeMessage(String message){
this.message = message;
this.update();
}
//通知
public void update(){
for(Subscriber s:list){
s.update(message);
}
}
}
package Many;
//订阅者
//统一接口,订阅者接口
public interface Subscriber {
void update(String message);
}
package Many;
//感谢
public interface Thinking {
void think();
}
package Many;
public class Mike implements Subscriber,Thinking{
private String message;
@Override
public void think() {
// TODO Auto-generated method stub
System.out.println("Mike收到了消息:"+message);
}
@Override
public void update(String message) {
// TODO Auto-generated method stub
this.message = message;
think();
}
}
package Many;
public class Sam implements Subscriber,Thinking{
private String message;
@Override
public void think() {
// TODO Auto-generated method stub
System.out.println("Sam收到了消息:"+message);
}
@Override
public void update(String message) {
// TODO Auto-generated method stub
this.message = message;
think();
}
}
package test;
import org.junit.Test;
import Many.Mike;
import Many.Sam;
import One.officeImp;
public class testUnit {
@Test
public void test1(){
officeImp imp = new officeImp();
Mike mike = new Mike();
Sam sam = new Sam();
imp.add(sam);//Sam订阅了报刊
imp.add(mike);//Mike订阅了报刊
imp.changeMessage("发布了新书了");
System.out.println("-----------------------");
imp.changeMessage("又有新优惠了");
}
}
----------
Sam收到了消息:发布了新书了
Mike收到了消息:发布了新书了
-----------------------
Sam收到了消息:又有新优惠了
Mike收到了消息:又有新优惠了
类:Observable
接口:Observer