概念
定義一個對象和其他對象的關(guān)系琐驴,當這個對應改變狀態(tài)時靴庆,其他的用戶接收到消息并自動更更新。
角色
- 具體被觀察者角色
- 抽象觀察者角色
- 具體觀察者角色
- 抽象被觀察者角色
利弊
利
弊
demo:
觀察者模式在軟件開發(fā)的應用是很頻繁的彩届,例如用戶做了某些操作混埠,需要發(fā)送消息通知渠道,這個時候就可以使用觀察者模式了
/**
* @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 要設(shè)置的 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();
}