观察者模式
观察者模式,又称发布订阅模式,有解耦、异步的特点
1. 定义
当一个对象的状态发生改变时,已经登记的其他对象能够观察到这一改变从而做出自己相对应的改变,通过这种方式来达到减少依赖关系,解耦合的作用。
例子:微信朋友圈,以当前个人作为订阅者,好有作为主题。一个人发了朋友圈,好友看到朋友圈后,可以点赞或者评论。
2. 主要角色
1. Subject(主题):主要由类实现的可观察的接口,通知观察者使用attach方法,以及取消观察的detach方法
2. ConcreteSubject(具体主题):是实现一个主题接口的类,处理观察者的变化
3. Observe(观察者):根据主题中的更改而进行更新
3.代码实现
3.1 主题定义
// 创建一个主题定义,定义添加删除关系以及通知订阅者
interface subject{
//添加订阅关系
void attach(Observer observer);
// 移除订阅关系
void detach(Observer observer);
// 通知订阅者
void notifyObserves(String message);
}
3.2 主题的具体实现类
class ConcreteSubject implements subject{
//订阅者容器
private List<Observer> observers = new ArrayList<Observer>();
@Override
public void attach(Observer observer) {
//添加订阅关系
observers.add(observer);
}
@Override
public void detach(Observer observer) {
//移除订阅关系
observers.remove(observer);
}
@Override
public void notifyObserves(String message) {
// 订阅通知
for (Observer observer : observers){
observer.update(message);
}
}
}
3.3 创建一个观察者接口
//创建一个观察者接口
interface Observer{
// 处理业务逻辑
void update(String message);
}
3.4 具体的观察者类
//具体的观察者类
class FriendOneObserver implements Observer{
@Override
public void update(String message) {
//模拟处理业务逻辑
System.out.println("用户1看到了你发的动态"+message);
}
}
//具体的观察者类
class FriendTwoObserver implements Observer{
@Override
public void update(String message) {
//模拟处理业务逻辑
System.out.println("用户2看到了你发的动态"+message);
}
}
3.5 测试类
public class ObserverDesign {
public static void main(String[] args){
ConcreteSubject subject = new ConcreteSubject();
//添加观察者
subject.attach(new FriendOneObserver());
FriendTwoObserver twoObserver = new FriendTwoObserver();
subject.attach(twoObserver);
System.out.println("");
//发送第一条朋友圈动态 所有人可见
subject.notifyObserves("第一条朋友圈动态");
//发送第二条朋友圈动态 仅用户1可见
subject.detach(twoObserver);
subject.notifyObserves("第二条朋友圈动态");
}
}