场景引入:
想象这样一个场景:你在生活中有很多的朋友,相对于其他人而言,朋友和你很强的联系的。所以,你在生活中遇到了事情,你会去告诉你的朋友。(当然那种说自己很坚强,自己默默承认的人,我就不多说了)。但是在生活中,即便是再怎么要好的朋友,他都不可能一直等着你通知他消息,因为别人也是要生活的。所以,当你自己发生了事情,应该是你来通知你的朋友。即,你有一个通知的方法sendMessage()
。这样,你自己就必须要有一个朋友的列表List<Friends>
。再想象一下,生活多变,一个人的朋友不会一直不变。所以,为了生活过的去,你肯定有自己的一个方法去增加addFriends()
或者减少removeFriends()
朋友。然后你的朋友作为你的观察者,应该对于你的消息,有回应,即观察者有一个响应方法response()
。在这种情形下,朋友就是观察者。观察者模式的重点就是当一个对象状态改变时,已经登记的其他对象能够观察到这一改变。在例子中体现出来就是:当你发生了事情,你认定的朋友可以收到你的通知。
模式关键点
- 改变的对象有一个观察者列表;
- 对象有通知观察者的方法;
- 观察者有反馈方法。如果观察者没有反馈,那就没有必要通知了。就好像你把别人当朋友,别人不把你当朋友,那就没有必要。所以,有反馈才是观察者模式的重点,不然不用设计这个模式。
- 增加观察者和删除观察者以及观察者的回应都不是必须的。一个对象可以只有一个观察者,这时候就不要增加观察者方法,一个对象的观察者是固定的,就不要删除观察者的方法。
代码实现
Notifier.class
import java.util.ArrayList;
import java.util.List;
public abstract class Notifier {
// 一个人的朋友列表
protected List<Friends> list = new ArrayList<Friends>();
//增加朋友
public void addFriends(Friends friend){
list.add(friend);
}
//删除朋友
public void removeFriends(Friends friend){
list.remove(friend);
}
//遇上事了,通知朋友
public void sendMessage(){
for(Friends friend:list){
friend.response();
}
}
}
You.class
public class You extends Notifier{
//定制你自己,
//假如你想把通知方法改成不同,就可以把Notifier中的SendMessage改成抽象的
//然后实现
//本处为了方便,全部写在抽象类Notifier类中了
}
interface Friends
public interface Friends {
//朋友的响应办法
public void response();
}
Roommates.class
public class Roommates implements Friends{
public void response() {
System.out.println("惆怅什么,没有什么事情是一把游戏不能解决的");
}
}
Parents.class
public class Parents implements Friends{
public void response() {
System.out.println("孩子别急,你还年轻");
}
}
Test.class
public class Test {
public static void main(String[] args) {
Notifier you = new You();
you.addFriends(new Parents());
you.addFriends(new Roommates());
you.sendMessage();
// 下面是验证两个不同的对象的list列表是否会重在一起
Notifier you2 = new You();
you2.addFriends(new Parents());
you2.sendMessage();
}
}
写在最后
以上只是一种观察者模式的简单实现。其实SendMesage()
方法还可以写的更加广泛,比如抽象出一个事件类Events
,描述你发生的消息。就比你你有好像还有坏消息一样,这样观察者就可以根据你的事件情况进行处理等等。重要的理解观察者模式的思想。看懂前面就行
Events.class
import java.util.Date;
public class Events {
String s;
Date date;
public Events(String s, Date date) {
this.s = s;
this.date = date;
}
public String getS() {
return s;
}
public void setS(String s) {
this.s = s;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
Notifier.class
import java.util.ArrayList;
import java.util.List;
public abstract class Notifier {
// 一个人的朋友列表
protected List<Friends> list = new ArrayList<Friends>();
public void addFriends(Friends friend){
list.add(friend);
}
public void removeFriends(Friends friend){
list.remove(friend);
}
public void sendMessage(Events event){
for(Friends friend:list){
friend.response(event);
}
}
}
You.class
public class You extends Notifier{
//定制你自己,
//假如你想把通知方法改成不同,就可以把Notifier中的SendMessage改成抽象的
//然后实现
//本处为了方便,全部写在抽象类Notifier类中了
}
interface Friends
public interface Friends {
public void response(Events events);
}
Roommates.class
public class Roommates implements Friends{
public void response(Events events) {
System.out.println(events.getDate()+":"+events.getS());
System.out.println("惆怅什么,没有什么事情是一把游戏不能解决的");
}
}
Parents.class
public class Parents implements Friends{
public void response(Events events) {
System.out.println(events.getDate()+":"+events.getS());
System.out.println("孩子别急,你还年轻");
}
}
Test.class
import java.util.Date;
public class Test {
public static void main(String[] args) {
Notifier you = new You();
you.addFriends(new Parents());
you.addFriends(new Roommates());
you.sendMessage(new Events("good message",new Date()));
}
}