职责链模式
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(),visiteSquare()方法,然后由PerimeterVisitor实现具体的访问方法,避免对原代码的修改。那如何调用这些方法呢?访问者访问的时候并不知道传入的是哪个子类对象,总不能写一大堆instanceOf来判断子类对象吧。
访问者确实不知道具体子类,不过子类自己知道啊,如果把方法调用放到每个子类里,问题是不是就解决了?
比如,Shape类添加accept(Visitor visitor)接口,Circle中实现
double accept(Visitor visitor) { visitor.visiteCircle(); }
好了,现在问题解决了,当需要计算周长时,可以用PerimeterVisitor实现访问各个Shape的方法,调用时,通过shape.accept(perimeterVisitor)就可以了,每个Shape子类都有自己的访问实现。如果要添加面积计算之类的,再写一个AreaVisitor之类的就好了。
标签:对象,子类,接口,Shape,模式,设计模式,行为,访问者 From: https://www.cnblogs.com/maerpao/p/17070872.html