[设计模式]设计原则&观察者模式
设计模式
设计模式描述不断重复问题的解决方案
目标:可复用
方法:面向对象
底层思维:向下把握机器底层
- 语言构造
- 编译转换
- 内存模型
- 运行机制
抽象思维:向上,把显示需求抽象为程序代码
- 面向对象
- 组件封装
- 设计模式
- 架构模式
面向对象
-
封装:隐藏内部代码
-
继承:复用现有代码
-
多态:改写对象行为
如何解决变化造成的复杂性
分解:划分子问题,分而治之
抽象:抽象通用模型,忽略非本质问题,处理泛化和理想化后的对象模型
核心:复用
面向对象设计模式
- 依赖倒置原则(DIP)
高层模块不应该依赖于底层模块,都应该依赖于抽象
抽象不应该依赖于实现细节,实现细节应该依赖于抽象
- 开闭原则
对扩展开放 对更改封闭
类模块应该是可拓展的,但是不可以修改
- 单一职责原则(SRP)
一个类,应该只有一个引起变化的原因
变化的方向隐含着类的责任
- Liskov替换原则
子类必须可以替换基类(is_a)
继承表达类型抽象
- 接口隔离原则(ISP)
不应该强迫用户程序依赖不用的方法
接口应该小而完备
-
优先使用对象组合,而非类继承
-
封装变化点
-
针对接口编程,而不是针对实现编程
观察者模式/发布订阅模式
定义了对象之间的依赖关系(一对多)
一个对象状态发生改变(被观察者),其依赖对象(观察者)均得到通知并自动更新
观察者模式 优点 :
- 抽象耦合 : 在 观察者 和 被观察者 之间 , 建立了一个 抽象的 耦合 ; 由于 耦合 是抽象的 , 可以很容易 扩展 观察者 和 被观察者 ;
- 广播通信 : 观察者模式 支持 广播通信 , 类似于消息广播 , 如果需要接收消息 , 只需要注册一下即可 ;
观察者模式 缺点 :
- 依赖过多 : 观察者 之间 细节依赖 过多 , 会增加 时间消耗 和 程序的复杂程度 ;
这里的 细节依赖 指的是 触发机制 , 触发链条 ; 如果 观察者设置过多 , 每次触发都要花很长时间去处理通知 ; - 循环调用 : 避免 循环调用 , 观察者 与 被观察者 之间 绝对不允许循环依赖 , 否则会触发 二者 之间的循环调用 , 导致系统崩溃 ;
具体实例:
package DesignPattern;
import java.util.ArrayList;
import java.util.List;
// 观察者模式
public class ObservePattern {
public static void main(String[] args) {
ZhangSan zs = new ZhangSan();
zs.borrow(new WangWu());
zs.borrow(new ZhaoSi());
//状态改变
zs.setState(true);
if(zs.getState()){
zs.notifyCredits();
}
}
}
//借款方
interface Debit{
void borrow(Credit credit);
void notifyCredits();
}
//贷款方
interface Credit{
void takeMoney();
}
class ZhangSan implements Debit{
private List<Credit> allCredit = new ArrayList<>();
private Boolean state = false;
public Boolean getState() {
return state;
}
public void setState(Boolean state) {
this.state = state;
}
public ZhangSan(){}
@Override
public void borrow(Credit credit) {
allCredit.add(credit);
}
public void notifyCredits(){
allCredit.forEach(credit -> credit.takeMoney());
}
}
class WangWu implements Credit{
@Override
public void takeMoney() {
System.out.println("WangWu 要钱");
}
}
class ZhaoSi implements Credit{
@Override
public void takeMoney() {
System.out.println("ZhaoSi 要钱");
}
}

代码建议结合视频食用:

浙公网安备 33010602011771号