一、设计模式的分类
创建型模式(五种):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式(七种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式(十一种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
1、观察者模式
1、又称发布—订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有观察者对象自动更新自己。
2、
3、例子
可以拿微信公众号来举例,假设微信用户就是观察者,微信公众号是被观察者,有多个的微信用户关注了程序猿这个公众号,当这个公众号更新时就会通知这些订阅的微信用户。
抽象观察者
public interface Observer {
//定义了一个更新的方法
public void update(String message);
}
具体观察者
public class WeixinUser implements Observer {
// 微信用户名
private String name;
public WeixinUser(String name) {
this.name = name;
}
@Override
//实现了更新的方法
public void update(String message) {
System.out.println(name + "-" + message);
}
}
抽象主题
public interface Subject {
/**
* 增加订阅者
* @param observer
*/
public void attach(Observer observer);
/**
* 删除订阅者
* @param observer
*/
public void detach(Observer observer);
/**
* 通知订阅者更新消息
*/
public void notify(String message);
}
具体被观察者
public class SubscriptionSubject implements Subject {
//储存订阅公众号的微信用户
private List<Observer> weixinUserlist = new ArrayList<Observer>();
@Override
public void attach(Observer observer) {
weixinUserlist.add(observer);
}
@Override
public void detach(Observer observer) {
weixinUserlist.remove(observer);
}
@Override
public void notify(String message) {
for (Observer observer : weixinUserlist) {
observer.update(message);
}
}
}
客户端调用
public class Client {
public static void main(String[] args) {
SubscriptionSubject mSubscriptionSubject=new SubscriptionSubject();
//创建微信用户
WeixinUser user1=new WeixinUser("c66");
WeixinUser user2=new WeixinUser("gtt");
WeixinUser user3=new WeixinUser("h99");
//订阅公众号
mSubscriptionSubject.attach(user1);
mSubscriptionSubject.attach(user2);
mSubscriptionSubject.attach(user3);
//公众号更新发出消息给订阅的微信用户
mSubscriptionSubject.notify("anna的专栏更新了");
}
}
结果
c66-anna的专栏更新了
gtt-anna的专栏更新了
h99-anna的专栏更新了
二、转载
原文1链接:https://blog.youkuaiyun.com/itachi85/article/details/50773358
原文2链接:
https://blog.youkuaiyun.com/A1342772/article/details/91349142