观察者模式是多对一的模式,被观察者往往只有一个,观察者是多个,当被观察者发出消息或是产生某种需要被观察者追踪的信息时候,观察者会获得这种信息的通知或者察觉到这种变更,并且被观察者知道观察者的增加或者减少,这就类似于大家都通过微博上关注着李小璐,当他说去洗头的时候,大家都能从微博上收到他发的微博,至于会发给那些人当然有新浪微博自己的系统对这个进行控制,当然这不包括所谓的推送。一般实时通讯类的相关的系统中会用到这种设计模式。
观察者模式包含部分
(1)抽象被观察者:无具体意义,被观察者需要实现该几口或是继承该抽象类
(2)具体被观察者:包含对观察者信息的维护,比如对观察者的增减,包括对观察者的信息通知以及需要让每个观察者的消息
(3)抽象观察者:无具体业务逻辑,包含具体观察者必须实现的接口或似乎继承的抽象类
(4)具体观察者:抽象观察者的具体实现,继承或是实现相应的方法,该方法就是从被观察者哪里获得需要的数据或是通知。
/**
* 抽象观察者
* @author Rex
*/
public interface Observer {
public void update(String message);
}
/**
* 具体观察者
* @author Rex
*
*/
public class QQobserver implements Observer {
private String username;
public QQobserver(String username){
this.username = username;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public void update(String message) {
System.out.println(username+"-"+message);
}
}
/**
* 抽象被观察者
* @author Rex
*
*/
public interface ProjectIm {
public void adduser(Observer user);
public void deluser(Observer user);
public void noticeall();
}
/**
* 具体被观察者
* @author Rex
*
*/
public class Project implements ProjectIm {
List<Observer> listalluser = new ArrayList<Observer>();
@Override
public void adduser(Observer user) {
listalluser.add(user);
}
@Override
public void deluser(Observer user) {
listalluser.remove(user);
}
@Override
public void noticeall() {
for (Observer observer:listalluser) {
observer.update("关注了该公众号");
}
}
}
/**
* 测试类
* @author Rex
*/
public class Pstest {
public static void main(String[] args) {
Observer observer = new QQobserver("张三");
Observer observer1 = new QQobserver("张三");
Observer observer2 = new QQobserver("张三");
Project pro = new Project();
pro.adduser(observer);
pro.adduser(observer1);
pro.adduser(observer2);
pro.noticeall();
}
}