概念
定义一个对象和其他对象的关系,当这个对应改变状态时,其他的用户接收到消息并自动更更新。
角色
- 具体被观察者角色
- 抽象观察者角色
- 具体观察者角色
- 抽象被观察者角色
利弊
利
弊
demo:
观察者模式在软件开发的应用是很频繁的,例如用户做了某些操作,需要发送消息通知渠道,这个时候就可以使用观察者模式了
/**
* @ClassName: Observer
* @Description: 抽象观察者
* @author xushaoxin
* @date 2018年9月30日 下午2:11:10
*
*/
public interface Observer {
public void message(String message);
}
/**
* @ClassName: Observerable
* @Description: 具体被观察者角色
* @author xushaoxin
* @date 2018年9月30日 下午2:09:09
*
*/
public interface Observerable {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObserver();
}
/**
* @ClassName: SMSOberver
* @Description: 短信观察者
* @author xushaoxin
* @date 2018年9月30日 下午2:59:09
*
*/
public class SMSOberver implements Observer {
@Override
public void message(String message) {
System.out.println("短信+"+message);
}
}
/**
* @ClassName: WechatOberver
* @Description: 微信观察者
* @author xushaoxin
* @date 2018年9月30日 下午2:40:04
*
*/
public class WechatOberver implements Observer {
@Override
public void message(String message) {
System.out.println("微信"+message);
}
}
/**
* @ClassName: User
* @Description: 用户
* @author xushaoxin
* @date 2018年9月30日 下午2:35:59
*
*/
public class User implements Observerable {
List<Observer> list = new ArrayList<>();
String message ;
/**
* @return message
*/
public String getMessage() {
return message;
}
/**
* @param message 要设置的 message
*/
public void setMessage(String message) {
this.message = message;
}
@Override
public void registerObserver(Observer o) {
list.add(o);
}
@Override
public void removeObserver(Observer o) {
if(!list.isEmpty()){
list.remove(o);
}
}
@Override
public void notifyObserver() {
for(Observer observer:list){
observer.message(message);
}
}
}
public static void main(String[] args) {
Observer wechatMessage = new WechatOberver();
User user = new User();
user.setMessage("登录");
user.registerObserver(wechatMessage);
user.notifyObserver();
Observer sms = new SMSOberver();
user.registerObserver(sms);
user.notifyObserver();
user.removeObserver(sms);
user.notifyObserver();
}