1.设计模式分为三大类:创建型模式、结构型模式、行为型模式。创建型模式主要是将创建和使用代码进行解耦,结构型模式是将不同的功能代码进行解耦,行为型模式是将不同的行为代码进行解耦。其实我个人认为后面两者的说法很类似,不管是不同的功能代码和不同的行为代码是一回事,可能侧重点不一样。
观察者模式又称为发布订阅设计模式,属于行为型模式,根据应用场景的不同,可以有不同的代码实现方式:同步阻塞实现方式,和异步非阻塞的实现方式;还有进程内的实现方式,跨进程的实现方式。
之前对观察者模式理解不到位,感觉很是抽象。下面先以一个同步阻塞最简单的一个例子,这个例子是我从哔站上面看到的,感觉方便理解,一个借款方可能会有多个贷款方,一个借款方张三,多个贷款方比如王五和赵四。张三同时向赵四和王五借钱。
/**
* @Description: 借款方接口
* @Author
* @Date 2023/3/19
* @Version 1.0
*/
public interface Debit {
void borrow(Credit credit);
void notifyCredit();
}
/**
* @Description: 贷款方接口
* @Author
* @Date 2023/3/19
* @Version 1.0
*/
public interface Credit {
void takeMoney();
}
/**
* @Description: 借款方实现类
* @Author
* @Date 2023/3/19
* @Version 1.0
*/
public class Zhangsan implements Debit{
List<Credit> creditList = new ArrayList<>();
@Override
public void borrow(Credit credit) {
creditList.add(credit);
System.out.println("张三借钱+1");
}
@Override
public void notifyCredit() {
creditList.forEach(Credit::takeMoney);
}
}
/**
* @Description: 贷款方实现类
* @Author
* @Date 2023/3/19
* @Version 1.0
*/
public class Zhaosi implements Credit{
@Override
public void takeMoney() {
System.out.println("赵四要钱");
}
}
/**
* @Description: 贷款方实现类
* @Author
* @Date 2023/3/19
* @Version 1.0
*/
public class Wangwu implements Credit{
@Override
public void takeMoney() {
System.out.println("王五要钱");
}
}
/**
* @Description: 观察者模式 实现类
* @Author
* @Date 2023/3/19
* @Version 1.0
*/
public class ObserveTest {
public static void main(String[] args) {
Debit debit = new Zhangsan();
debit.borrow(new Wangwu());
debit.borrow(new Zhaosi());
debit.notifyCredit();
}
}
运行结果:
张三借钱+1 张三借钱+1 王五要钱 赵四要钱 |
2.小结
观察者模式的优缺点:
a、观察者模式能将观察者和被观察者的代码进行解耦
借助设计模式,我们利用更好的代码结构,将一大坨代码拆分成职责更单一的小类,让其满足开闭原则、高内聚松耦合等特性,以此来控制和应对代码的复杂性,提高代码的可扩展性。
b、目标与观察者之间创建一套触发机制;
问题
“生产者 - 消费者”模型和观察者模式的区别和联系是什么?
我看到经典的评论直接截图