【设计模式】行为型

职责链模式

Client->A->B->C,避免请求发送者与接收者耦合,将接收者对象连接成一条链,直到有对象处理

命令模式

 将请求转换为一个包含与请求相关的所有信息的独立对象 可根据不同的请求将方法参数化或加入队列等待处理

解释器模式

 实现一个表达式接口,用于解释一个特定的上下文。例如:Java代码编译,Sql解析

迭代器模式

 遍历集合中元素且无需暴露集合底层表现(例如列表)形式 ,例如Java中的Iterator

中介者模式

 对象直接不直接交互,而是引入一个中间者进行简介交互,降低对象之间的耦合,同时简化对象间复杂的依赖关系

备忘录模式

在不破坏对象封装的前提下,保存对象之前的状态用于恢复,为了不破坏封装,创建快照操作由原始类自行完成。通常生成的快照(备忘录接口的实现)不可修改,只提供构造方法赋值

观察者模式

 订阅-发布结构,当消息发布时,消息推送者会遍历订阅者列表,并调用订阅者接口,将消息推送给订阅者

状态模式

 有限状态机,上下文的状态单独封装并抽象为一个接口,针对不同的状态有不同方法实现。例如:卧室的多色灯,如果当前为白色,重新打开,灯色变为黄色,继续重新打开,灯色为黄白色

策略模式

 定义一系列算法,将每一个算法封装成一个类,并让它们可以相互替换。例如:地图导航根据用户的选择产生导航策略,比如步行导航,驾车或打车等。以上的各种导航都是对导航接口的封装,针对用户的选择提供不同的导航类。

模板方法模式

 定义一个算法框架,将一些方法实现延迟到子类。例如:开车:(1)挂挡 (2)起步 (3)行驶,开手动挡车:(1)踩离合挂挡 (2)松离合踩油门起步 (3)行驶,开自动挡车:巴拉巴拉。。。

访问者模式

将数据结构与数据操作分离,多用于解决稳定的数据结构和易变的数据操作耦合问题。例如:Shape类,有子类Circle,Square,Triangle,现在需要为Shape添加一个calculatePerimeter方法,思路很简单吧,只需要给Shape加一个calculatePerimeter声明,然后在子类中实现就可以了,那如果再加上计算面积呢?如果计算其他乱七八糟的指标呢?每次都需要修改接口和实现,显然不符合开闭原则。

这个时候就会用到访问者模式了,可以定义一个访问者Visitor,声明visiteCircle(),visiteSquare(),visiteTriangle()方法,然后由PerimeterVisitor实现具体的访问方法,避免对原代码的修改。那如何调用这些方法呢?访问者访问的时候并不知道传入的是哪个子类对象,总不能写一大堆instanceOf来判断子类对象吧。

访问者确实不知道具体子类,不过子类自己知道啊,如果把方法调用放到每个子类里,问题是不是就解决了?

比如,Shape类添加accept(Visitor visitor)接口,Circle中实现

double accept(Visitor visitor) {
    visitor.visiteCircle();
}

好了,现在问题解决了,当需要计算周长时,可以用PerimeterVisitor实现访问各个Shape的方法,调用时,通过shape.accept(perimeterVisitor)就可以了,每个Shape子类都有自己的访问实现。如果要添加面积计算之类的,再写一个AreaVisitor之类的就好了。

posted @ 2023-01-29 14:19  马儿跑  阅读(13)  评论(0编辑  收藏  举报