观察者模式,顾名思义,监视模式,比如xxlistener ,常用于 监听事件,消息通知等场合;
现在做个简单的例子:
用户1 --------->观察者1
用户2 --------->观察者2
用户3 --------->观察者3
微信公众号1 --------->被观察者1
微信公众号2 --------->被观察者2
用户1订阅了公众号1和2
用户2订阅了公众号2
用户3订阅了公众号1
微信公众号则根据订阅用户发送消息
观察者和被观察者可以抽象成一个接口(建议不要用类,拓展性不好),然后由具体的观察者和被观察者去实现对应的方法
观察者需要有一个能够接收消息的方法
被观察者需要有:增加观察者。删除观察者,发送消息的方法
用代码实践一下:
定义观察者接口
public interface Gcz{
void updateMessage(String appname,String message);
}
定义被观察者接口
public interface Bgcz{
//定义观察者集合,根据集合成员发送消息
private List<Gcz> gczList = new ArrayList<Gcz>();
void addGcz(Gcz gcz);
void removeGcz(Gcz gcz);
void sendMessage(String message);
}
//定义观察者1
public class Gcz1 implements Gcz{
private String name = "gcz1";
@Override
public void updateMessage(String appname,String message){
System.out.println(appname+":"+name+",您有新消息:"+message);
}
}
//定义观察者2
public class Gcz2 implements Gcz{
private String name = "gcz2";
@Override
public void updateMessage(String appname,String message){
System.out.println(appname+":"+name+",您有新消息:"+message);
}
}
//定义观察者3
public class Gcz3 implements Gcz{
private String name = "gcz3";
@Override
public void updateMessage(String appname,String message){
System.out.println(appname+":"+name+",您有新消息:"+message);
}
}
//定义被观察者1
public class Bgcz1 implements Bgcz{
private String appname = "微信公众号1";
private List<Gcz> gczList = new ArrayList<Gcz>();
@Override
public void addGcz(Gcz gcz){
if(!gczList.contains(gcz)){
gczList.add(gcz);
}
}
@Override
public void removeGcz(Gcz gcz){
if(gczList.contains(gcz)){
gczList.remove(gcz);
}
}
@Override
public void sendMessage(String message){
for(Gcz gcz2 : gczList){
gcz2.updateMessage(appname,message);
}
}
}
//定义被观察者2
public class Bgcz2 implements Bgcz{
private String appname="微信公众号2";
private List<Gcz> gczList = new ArrayList<Gcz>();
@Override
public void addGcz(Gcz gcz){
if(!gczList.contains(gcz)){
gczList.add(gcz);
}
}
@Override
public void removeGcz(Gcz gcz){
if(gczList.contains(gcz)){
gcz.remove(gcz);
}
}
@Override
public void sendMessage(String message){
for(Gcz gcz2 : gczList){
gcz2.updateMessage(appname,message);
}
}
}
//测试
Gcz gcz1 = new Gcz1();//定义具体观察者1
Gcz gcz2 = new Gcz2();//定义具体观察者2
Gcz gcz3 = new Gcz3();//定义具体观察者3
Bgcz bgcz1 = new Bgcz1();//定义被观察者1
Bgcz bgcz2 = new Bgcz2();//定义被观察者2
//给被观察者1 增加 观察者1和观察者2
bgcz1.add(gcz1);
bgcz1.add(gcz2);
//给被观察者2 增加 观察者1
bgcz2.add(gcz1);
bgcz1.sendMessage("开始跑起来了。。。");
bgcz2.sendMessage("第二个也运行起来了");
结果:
微信公众号1:gcz1,您有新消息:开始跑起来了。。。
微信公众号1:gcz2,您有新消息:开始跑起来了。。。
微信公众号2:gcz3,您有新消息:第二个也运行起来了