[设计模式]设计原则&观察者模式

设计模式

设计模式描述不断重复问题的解决方案

目标:可复用

方法:面向对象

底层思维:向下把握机器底层

  • 语言构造
  • 编译转换
  • 内存模型
  • 运行机制

抽象思维:向上,把显示需求抽象为程序代码

  • 面向对象
  • 组件封装
  • 设计模式
  • 架构模式

面向对象

  • 封装:隐藏内部代码

  • 继承:复用现有代码

  • 多态:改写对象行为

如何解决变化造成的复杂性

分解:划分子问题,分而治之

抽象:抽象通用模型,忽略非本质问题,处理泛化和理想化后的对象模型

核心:复用

面向对象设计模式

  • 依赖倒置原则(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 要钱");
    }
}

代码建议结合视频食用:

https://www.bilibili.com/video/BV1vg4y1v7V4/?spm_id_from=333.337.search-card.all.click&vd_source=5b1cf2b4873e1ba01443e64a925482ff

posted @ 2023-11-08 21:29  鱼师傅_L  阅读(28)  评论(0)    收藏  举报