观察者模式
-
解释:观察者模式又称为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察或者监听的目标发生情况,就会被监听者发现,从目标发生变化到观察者知道变化,实际上是由目标将将情况报给观察者的。主要理解发布-订阅模式。
-
关键点
-
使用场景
- 多用于实现订阅功能,例如微博的订阅、公众号订阅,只要发布消息,就会通知我们。这里微博、公众号是被观察者,我们是观察者,这要微博、公众号有新消息发布,就会通知我们。
- 多用于实现订阅功能,例如微博的订阅、公众号订阅,只要发布消息,就会通知我们。这里微博、公众号是被观察者,我们是观察者,这要微博、公众号有新消息发布,就会通知我们。
-
代码演示
-
User
package observer; public interface User { public void getMessage(String message); }
-
User1
package observer; public class User1 implements User { @Override public void getMessage(String message) { System.out.println(message); } }
-
User2
package observer; public class User2 implements User { @Override public void getMessage(String message) { System.out.println(message); } }
-
PubNumber
package observer; //这是一个公众号 public interface PubNumber { //添加关注用户 public void addUser(User user); //取消关注 public void deleteUser(User user); //给用户推送消息 public void sendMessage(String message); }
-
PubNumberImp
package observer; import java.util.ArrayList; import java.util.List; public class PubNumberImp implements PubNumber { private List<User>list = new ArrayList<>(); @Override public void addUser(User user) { if(!list.contains(user)){ list.add(user); } } @Override public void deleteUser(User user) { if(list.contains(user)){ list.remove(user); } } @Override public void sendMessage(String message) { for(User user:list){ user.getMessage(message); } } }
-
Test
package observer; public class Test { public static void main(String[] args) { //首先拿到公众号对象 PubNumber pubNumber =new PubNumberImp(); //现有两个用户 User u = new User1(); User u1 = new User2(); pubNumber.addUser(u); pubNumber.addUser(u1); //发布消息 pubNumber.sendMessage("有文章更新"); } }
-
运行结果
有文章更新 有文章更新
-
需求 新添加一个用户
-
PubNumber
package observer; //这是一个公众号 public interface PubNumber { //添加关注用户 public void addUser(User user); //取消关注 public void deleteUser(User user); //给用户推送消息 public void sendMessage(String message); }
-
PubNumberImp
package observer; import java.util.ArrayList; import java.util.List; public class PubNumberImp implements PubNumber { private List<User>list = new ArrayList<>(); @Override public void addUser(User user) { if(!list.contains(user)){ list.add(user); } } @Override public void deleteUser(User user) { if(list.contains(user)){ list.remove(user); } } @Override public void sendMessage(String message) { for(User user:list){ user.getMessage(message); } } }
-
Test
package observer; public class Test { public static void main(String[] args) { //首先拿到公众号对象 PubNumber pubNumber =new PubNumberImp(); //现有两个用户 User u = new User1(); User u1 = new User2(); pubNumber.addUser(u); pubNumber.addUser(u1); //发布消息 pubNumber.sendMessage("有文章更新"); User user =new User3(); pubNumber.addUser(user); pubNumber.sendMessage("有推文更新"); } }
-
运行结果
有文章更新 有文章更新 有推文更新 有推文更新 User3: 有推文更新
-
分析
- 在上面添加用户3的时候,除了测试的代码,并没有去修改之前已经写好的任何类,而是直接实现接口进行扩展,具有良好的解耦能力。
-
取关代码
pubNumber.deleteUser(u1); pubNumber.sendMessage("java是一个比较庞大的语言");
-
运行结果
有文章更新 有文章更新 有推文更新 有推文更新 User3: 有推文更新 java是一个比较庞大的语言 User3: java是一个比较庞大的语言
-
-
-
总结
- 针对观察者和被观察者分别定义接口,以方便扩展。
- 重点在于观察者实现,首先定义观察者集合,然后定义通知观察者的方法。
- 观察者有接收被观察者消息的方法。