行为型模式:优化软件行为的技巧
- 策略模式(Strategy Pattern)
策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。比如,在一个电商系统中,计算商品运费可以有不同的算法,如按重量计算、按距离计算、按固定金额计算等。通过策略模式,将这些算法封装成不同的策略类,客户端可以根据不同的需求选择不同的运费计算策略,使得系统更加灵活,易于扩展新的算法。 - 模板方法模式(Template Method Pattern)
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中实现。比如,制作咖啡和制作茶都有一些相似的步骤,如烧水、冲泡等,但具体的冲泡方式不同。可以在一个抽象类中定义一个制作饮品的模板方法,包含烧水、冲泡等步骤,其中冲泡步骤由具体的咖啡类和茶类子类来实现,这样既复用了相同的代码逻辑,又能根据不同的需求进行定制。 - 观察者模式(Observer Pattern)
观察者模式定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。例如,在一个新闻发布系统中,当有新的新闻发布时,订阅该新闻频道的所有用户都会收到通知。在软件中,被观察的对象(主题)维护一个观察者列表,当主题状态改变时,遍历列表通知所有观察者。 - 迭代器模式(Iterator Pattern)
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。比如,在一个集合类中,我们可以通过迭代器来遍历集合中的元素,而不需要了解集合的具体实现是数组还是链表。迭代器模式使得集合的遍历操作更加统一,并且可以在不改变集合结构的情况下增加新的遍历方式。 - 责任链模式(Chain of Responsibility Pattern)
责任链模式将请求的发送者和接收者解耦,使多个对象都有机会处理这个请求。这些对象连成一条链,请求沿着链传递,直到有一个对象处理它为止。例如,在一个请假审批系统中,请假请求可能先由小组长审批,然后如果超过一定天数,再由部门经理审批,最后由总经理审批。通过责任链模式,将不同的审批者连接成一条链,请求在链上传递,每个审批者根据自己的职责决定是否处理该请求。 - 命令模式(Command Pattern)
命令模式将一个请求封装为一个对象,从而使我们可以用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。比如在一个游戏中,玩家的操作(如攻击、移动等)可以封装成命令对象,这样可以方便地对这些操作进行管理,如记录操作日志、实现撤销功能等。 - 备忘录模式(Memento Pattern)
备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。例如,在一个文本编辑器中,我们可以通过备忘录模式保存文本的某个历史版本,当需要撤销操作时,就可以从备忘录中恢复到之前的状态。 - 状态模式(State Pattern)
状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。比如,一个手机有不同的状态,如开机、关机、静音等,在不同的状态下,手机对相同的操作(如来电)会有不同的反应。通过状态模式,将每个状态封装成一个状态类,手机对象根据当前的状态来决定如何响应操作,使得代码更加清晰,易于维护和扩展新的状态。 - 访问者模式(Visitor Pattern)
访问者模式将数据结构与数据操作分离。当一个数据结构包含多种类型的元素,且需要对这些元素进行多种不同的操作时,使用访问者模式可以将这些操作封装到不同的访问者类中,而不需要在数据结构的类中添加大量的操作方法。例如,在一个图形系统中,有圆形、方形、三角形等不同的图形对象,现在需要对这些图形进行计算面积、计算周长等不同的操作。通过访问者模式,可以创建计算面积的访问者类和计算周长的访问者类,分别对不同的图形进行相应的操作。 - 中介者模式(Mediator Pattern)
中介者模式用一个中介对象来封装一系列的对象交互。对象之间不再直接交互,而是通过中介者进行交互,这样可以降低对象之间的耦合度。比如在一个聊天系统中,多个用户之间的聊天消息不是直接发送给对方,而是通过服务器(中介者)来转发。在软件中,当多个对象之间存在复杂的交互关系,导致代码难以维护时,使用中介者模式可以将这些交互逻辑集中到中介者对象中,简化对象之间的关系。 - 解释器模式(Interpreter Pattern)
解释器模式给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。例如,在一个简单的数学表达式解析系统中,我们可以定义一个文法来表示数学表达式,然后创建一个解释器来解析和计算这些表达式的值。解释器模式适用于一些特定的领域,当需要处理一些简单的语言解析任务时,可以使用这种模式。