设计模式:空对象模式
空对象模式(Null Object Pattern)是一种行为型设计模式,它用于处理对象不存在的情况,而不是使用空引用(null)。通过使用空对象,可以避免在代码中频繁检查对象是否为 null 而导致的空指针异常。空对象模式包含以下主要角色:1. 抽象对象(Abstract Object): 定义了一个抽象接口,声明了在客户端中使用的操作。2. 具体对象(Concrete Object): 实现了抽象对象接口,提供了具体的功能。3. 空对象(Null Object): 实现了抽象对象接口,但它的方法不执行任何操作,或者返回默认值,用于代表对象不存在的情况。4. 客户端(Client): 使用抽象对象接口与具体对象或空对象进行交互,而无需在代码中显式检查对象是否为 null。下面是一个简单的空对象模式的例子,假设有一个日志记录器,可以选择使用具体的日志实现或者使用空对象代表不记录日志的情况:# 抽象对象接口:日志记录器class Logger: def log(self, message): pass# 具体对象类:文件日志记录器class FileLogger(Lo...
设计模式:状态模式
状态模式(State Pattern)是一种行为型设计模式,它允许一个对象在其内部状态改变时改变其行为。状态模式将对象的行为和状态封装在不同的状态类中,使得在状态切换时可以动态地改变对象的行为。状态模式包含以下主要角色:1. 上下文(Context): 定义了客户端感兴趣的接口,同时维护一个具体状态的实例,并在状态切换时改变其行为。2. 抽象状态类(State): 定义了一个接口,用于封装上下文的一个特定状态的行为。3. 具体状态类(Concrete State): 实现了抽象状态接口,负责具体状态下的行为。下面是一个简单的状态模式的例子,假设有一个电梯(上下文),可以根据不同的状态(停止、运行、开门、关门)来改变其行为:# 上下文类:电梯class ElevatorContext: def __init__(self): self._state = StoppedState(self) def set_state(self, state): self._state = state def request_open_door(self): ...
设计模式:观察者模式
观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。观察者模式将对象之间的耦合度降低,使得一个对象的变化可以通知其他对象,而不需要它们之间相互了解细节。观察者模式包含以下主要角色:1. 主题(Subject): 被观察的对象,它维护一组观察者,提供方法用于添加和删除观察者,并在状态发生改变时通知观察者。2. 具体主题(Concrete Subject): 实现了主题接口,负责维护被观察对象的状态,并在状态改变时通知观察者。3. 观察者(Observer): 定义了一个更新的接口,用于在主题状态发生改变时接收通知。4. 具体观察者(Concrete Observer): 实现了观察者接口,负责接收主题的通知,并进行相应的更新操作。下面是一个简单的观察者模式的例子,假设有一个天气站(主题)负责记录和通知当前的天气情况,而多个手机应用程序(观察者)希望在天气改变时得到通知:# 主题接口class Subject: def add_observer(self, obser...
设计模式:备忘录模式
备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不暴露对象实现细节的情况下,捕获并存储对象的内部状态,以便将来可以恢复到该状态。备忘录模式通常用于实现撤销操作。备忘录模式包含以下主要角色:1. 发起人(Originator): 负责创建一个备忘录对象,用于记录当前状态,并可以使用备忘录对象恢复到之前的状态。2. 备忘录(Memento): 存储发起人对象的内部状态,同时可以限制发起人对象访问备忘录的权限。3. 管理者(Caretaker): 负责存储和管理备忘录对象,但不对备忘录的内容进行操作。下面是一个简单的备忘录模式的例子,假设我们有一个文本编辑器,用户可以编辑文本并通过撤销操作恢复到之前的状态:# 备忘录类class TextEditorMemento: def __init__(self, content): self._content = content def get_content(self): return self._content# 发起人类:文本编辑器class TextEditorOriginat...
设计模式:中介者模式
中介者模式(Mediator Pattern)是一种行为型设计模式,它定义了一个对象,该对象封装了一组对象的交互方式,使得这些对象不需要直接相互通信,而是通过中介者进行通信。中介者模式的目的是降低对象之间的耦合度,使得系统更易于维护和扩展。中介者模式包含以下主要角色:1. 中介者(Mediator): 定义了对象之间的交互接口,负责协调对象的行为。通常包含 colleague_changed 等方法,用于处理对象之间的通信。2. 具体中介者(Concrete Mediator): 实现了中介者接口,负责实际协调对象之间的交互。3. 同事类(Colleague): 定义了对象的接口,包含一个指向中介者的引用。同事对象通过中介者来通信。4. 具体同事类(Concrete Colleague): 实现了同事接口,负责实际的业务逻辑,并通过中介者来与其他同事对象通信。下面是一个简单的中介者模式的例子,假设我们有一个聊天室应用,其中包含多个用户,用户之间通过中介者(聊天室)进行消息的发送和接收:# 中介者接口class Mediator: def send_message(self, me...
设计模式:迭代器模式
迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供一种顺序访问集合元素的方法,而无需暴露集合的内部表示。通过迭代器模式,可以在不暴露集合底层结构的情况下,访问集合中的每个元素。迭代器模式包含以下主要角色:1. 迭代器接口(Iterator): 定义了访问和遍历集合元素的接口,通常包含 has_next 和 next 方法。2. 具体迭代器类(ConcreteIterator): 实现了迭代器接口,负责对集合进行迭代。3. 可迭代对象接口(Iterable): 定义了创建迭代器对象的接口。4. 具体可迭代对象类(ConcreteIterable): 实现了可迭代对象接口,负责创建具体迭代器对象。5. 客户端(Client): 使用迭代器模式来访问集合元素,而不必关心集合的内部结构。下面是一个简单的迭代器模式的例子,假设我们有一个书架(Bookshelf)类,表示一组书籍,我们希望通过迭代器来遍历书架中的书籍:# 迭代器接口class Iterator: def has_next(self): pass def next(self): ...
设计模式:解释器模式
解释器模式(Interpreter Pattern)是一种行为型设计模式,它定义了一种语言文法的表示,并提供了解释器来解释该语言中的句子。解释器模式使得可以定义一个语言,并通过解释器来解释该语言中的语句。解释器模式包含以下主要角色:1. 抽象表达式(Abstract Expression): 定义了一个解释器的接口,包含一个 interpret 方法。2. 终结符表达式(Terminal Expression): 实现了抽象表达式接口,表示文法中的终结符。3. 非终结符表达式(Non-terminal Expression): 实现了抽象表达式接口,表示文法中的非终结符。4. 上下文环境(Context): 包含解释器之外的一些全局信息。5. 客户端(Client): 构建解释器表达式,并调用解释器来解释表达式。下面是一个简单的解释器模式的例子,假设我们有一个简单的数学表达式语言,支持加法和减法:# 抽象表达式class Expression: def interpret(self, context): pass# 终结符表达式:数字class NumberExpr...
设计模式:命令模式
命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成对象,从而使得可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。命令模式包含以下主要角色:1. 命令接口(Command): 声明了执行命令的接口,通常包含一个 execute 方法。2. 具体命令类(ConcreteCommand): 实现了命令接口,负责具体的命令执行。3. 调用者(Invoker): 负责调用命令对象执行请求,它不知道具体的命令细节,只知道调用命令对象的 execute 方法。4. 接收者(Receiver): 实际执行命令的对象,知道如何实现具体的业务逻辑。5. 客户端(Client): 创建命令对象,并设置命令的接收者。客户端决定哪些命令被执行。下面是一个简单的命令模式的例子,假设我们有一个遥控器,可以通过按钮来控制一些家电设备:# 命令接口class Command: def execute(self): pass# 具体命令类:开灯命令class LightOnCommand(Command): def __init__(...
设计模式:责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它通过一条处理链来处理请求,请求沿着链传递,直到有一个处理者能够处理它为止。责任链模式允许多个对象都有机会处理请求,而无需显式指定处理者。责任链模式包含以下主要角色:1. 处理者接口(Handler): 定义了处理请求的接口,通常包含一个指向下一个处理者的引用。2. 具体处理者类(ConcreteHandler): 实现了处理者接口,负责处理请求。如果它能够处理请求,则处理之;否则,将请求传递给下一个处理者。3. 客户端(Client): 创建责任链,并向责任链中的第一个处理者发送请求。下面是一个简单的责任链模式的例子,假设有一个报销系统,需要按照一定规则来审批报销请求:# 处理者接口class Approver: def set_next_approver(self, next_approver): pass def process_request(self, amount): pass# 具体处理者类class Manager(Approver)...
设计模式:代理模式
代理模式(Proxy Pattern)是一种结构型设计模式,其目的是通过创建一个代理对象,控制对其他对象的访问。代理模式可以在访问对象时引入一些额外的逻辑,例如权限验证、延迟加载、缓存等。代理模式包含以下主要角色:1. 抽象主题(Subject): 定义了代理对象和真实对象的共同接口,客户端通过抽象主题访问真实对象。2. 真实主题(RealSubject): 定义了实际的业务逻辑,是代理模式中被代理的对象。3. 代理(Proxy): 实现了抽象主题接口,并持有对真实主题的引用。在代理对象中可以添加一些额外的逻辑,然后调用真实主题的方法。4. 客户端(Client): 使用代理对象来访问真实对象的客户端代码。下面是一个简单的代理模式的例子,假设我们有一个图片显示的接口,其中包含了加载和显示图片的方法,我们希望通过代理来控制对图片的访问:# 抽象主题class ImageSubject: def display(self): pass# 真实主题class RealImage(ImageSubject): def __init__(self, filename):...
设计模式:享元模式
享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享对象来减小系统中对象的数量,从而提高系统性能。享元模式适用于系统中存在大量相似对象的场景,通过共享这些相似对象的公共部分,减少内存占用和提高性能。享元模式包含以下主要角色:1. 享元接口(Flyweight): 定义了享元对象的接口,包括需要共享的操作。2. 具体享元类(ConcreteFlyweight): 实现了享元接口,包括享元对象的内部状态。具体享元对象必须是可共享的,即它们的状态是不可变的。3. 非共享具体享元类(UnsharedConcreteFlyweight): 实现了享元接口,但其状态不可共享。在享元模式中,非共享具体享元对象是可选的,用于存储不适合共享的特定状态。4. 享元工厂(FlyweightFactory): 负责创建和管理享元对象。它通常包含一个享元对象池,用于存储和复用已创建的享元对象。5. 客户端(Client): 使用享元对象的客户端代码。下面是一个简单的享元模式的例子,假设我们有一个文本编辑器,其中包含大量的字符对象,我们希望通过享元模式来减少内存占用:# 享元接口cla...
设计模式:外观模式
外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个简化接口,用于访问系统中一组接口的子系统。外观模式定义了一个高层接口,使得客户端可以通过这个接口访问子系统,而不需要了解子系统的详细实现。外观模式包含以下主要角色:1. 外观(Facade): 提供了一个简化的接口,将客户端与子系统的交互进行封装。2. 子系统(Subsystem): 实现了系统的功能,客户端可以通过外观模式提供的接口来访问子系统的功能。3. 客户端(Client): 使用外观模式提供的接口来访问子系统。下面是一个简单的外观模式的例子,假设我们有一个音响系统,其中包含了多个子系统(CD播放器、投影仪、音响等):# 子系统:CD播放器class CDPlayer: def on(self): print("CD Player is ON") def play(self): print("CD is playing") def off(self): print("CD Player is OF...
设计模式:装饰器模式
装饰器模式是一种结构型设计模式,它允许动态地向对象添加新的功能,同时不改变其结构。这种模式通过创建一个包装类,即装饰器,来包装原始类的实例,并在包装类中添加额外的行为。装饰器模式包含以下主要角色:1. 组件(Component): 定义一个对象接口,可以动态地给这些对象添加职责。2. 具体组件(ConcreteComponent): 实现了组件接口的具体类,是被装饰的对象。3. 装饰器(Decorator): 持有一个指向组件对象的引用,并实现了组件接口。装饰器可以有多个层次,每个层次可以为组件对象添加新的功能。4. 具体装饰器(ConcreteDecorator): 扩展了装饰器接口,实现了具体的装饰逻辑。下面是一个简单的装饰器模式的例子,假设我们有一个咖啡类,我们想通过装饰器为咖啡添加不同的调料:# 组件接口class Coffee: def cost(self): pass# 具体组件:普通咖啡class SimpleCoffee(Coffee): def cost(self): return 5# 装饰器class CoffeeDecor...
设计模式:组合模式
组合模式是一种结构型设计模式,它将对象组织成树形结构,使得客户端可以统一处理单个对象和对象组合。组合模式对单个对象和组合对象的操作具有一致性,使得客户端代码无需区分处理单个对象和组合对象。组合模式包含以下主要角色:1. 组件(Component): 声明了组合中对象的接口,可以是抽象类或接口,定义了统一的操作方法。2. 叶子(Leaf): 表示组合中的叶子节点,实现了组件接口。3. 复合(Composite): 表示组合中的复合节点,实现了组件接口。它包含了子组件,可以是叶子节点或其他复合节点。4. 客户端(Client): 通过组件接口操作组合结构的对象。下面是一个简单的组合模式的例子,假设我们要表示一个文件系统:# 组件接口class Component: def display(self): pass# 叶子节点:文件class File(Component): def __init__(self, name): self.name = name def display(self): print(f"File:...
设计模式:过滤器模式
过滤器模式(Filter Pattern)是一种结构型设计模式,它通过一系列条件来过滤集合中的对象。这种模式主要用于通过不同的标准来过滤一组对象,以获取满足特定标准的对象子集。过滤器模式包含以下主要角色:1. 过滤器接口(Filter): 定义了过滤器的接口,包括一个过滤方法。2. 具体过滤器类(ConcreteFilter): 实现了过滤器接口,包含了具体的过滤逻辑。3. 目标类(Target): 表示要过滤的对象集合。4. 具体目标类(ConcreteTarget): 实现了目标类接口,表示实际的对象集合。5. 客户端(Client): 使用过滤器来过滤目标对象集合的类。下面是一个使用过滤器模式的简单例子,假设我们有一个表示人的类,我们想根据不同的条件来过滤人的集合:# 过滤器接口class Filter: def filter(self, persons): pass# 具体过滤器类:过滤年龄大于等于18岁的人class AdultFilter(Filter): def filter(self, persons): return [pers...
设计模式:桥接模式
桥接模式是一种结构型设计模式,它将抽象部分和实现部分分离,使它们可以独立变化而互不影响。桥接模式通过组合而不是继承的方式实现这种分离,从而更好地应对类的多层次变化。桥接模式包含以下主要角色:1. 抽象类(Abstraction): 定义抽象部分的接口,维护一个指向实现部分的引用。它可以是一个抽象类或接口。2. 扩充抽象类(RefinedAbstraction): 对抽象类进行扩展,增加更多的功能。3. 实现类接口(Implementor): 定义实现部分的接口,它通常是一个接口或抽象类。4. 具体实现类(ConcreteImplementor): 实现实现类接口的具体类。下面是一个简单的桥接模式的例子:# 实现类接口class Implementor: def operation_implementation(self): pass# 具体实现类Aclass ConcreteImplementorA(Implementor): def operation_implementation(self): print("Concrete Imp...
设计模式:适配器模式
适配器模式是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。这种模式通常用于系统需要与现有接口不兼容的类协同工作的情况。适配器模式允许这些不兼容的接口协同工作,使得客户端代码无需修改就能够使用这些类。适配器模式包含以下主要角色:1. 目标接口(Target): 客户端期望的接口,适配器会实现这个接口,以便客户端可以调用它。2. 适配器类(Adapter): 实现了目标接口并持有一个被适配对象的引用。适配器类将客户端的请求转发给被适配对象。3. 被适配对象(Adaptee): 需要被适配的类,它有一个不符合目标接口的接口。下面是一个简单的适配器模式的例子:# 目标接口class Target: def request(self): pass# 被适配对象class Adaptee: def specific_request(self): print("Adaptee's specific request")# 适配器类class Adapter(Target): def __init__(se...
设计模式:原型模式
原型模式是一种创建型设计模式,它用于通过复制现有对象来创建新对象,而不是通过实例化类。这样可以在运行时动态地创建对象,而无需指定其具体类。在原型模式中,一个对象充当原型,其他对象通过复制这个原型来创建。在使用原型模式时,通常会有一个原型管理器(Prototype Manager)来维护原型对象的注册表。这个注册表允许客户端代码注册和检索原型对象。当需要创建新对象时,客户端可以从注册表中获取一个原型对象,并通过克隆操作来创建新对象。下面是一个简单的用例,以说明原型模式的基本思想:import copy# 定义原型类class Prototype: def clone(self): pass# 具体原型类class ConcretePrototype(Prototype): def __init__(self, value): self.value = value def clone(self): return copy.deepcopy(self)# 原型管理器class PrototypeManager: def __i...
设计模式:建造者模式
建造者模式是一种创建型设计模式,其主要目的是将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。这样,可以通过相同的构建过程得到不同的表示形式。以下是建造者模式的一般结构和关键要点:1. 产品类(Product):表示被构建的复杂对象。通常包含多个部分。public class Product { private String part1; private String part2; // 构造函数、getter和setter方法}2. 抽象建造者类(Builder):定义构建产品的抽象方法,以及获取构建结果的方法。public abstract class Builder { public abstract void buildPart1(); public abstract void buildPart2(); public abstract Product getResult();}3. 具体建造者类(ConcreteBuilder):实现抽象建造者接口,具体定义如何构建各个部分。public class Concret...
设计模式:单例模式
单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点以访问该实例。单例模式通常用于控制对资源的访问,例如数据库连接、日志记录器、配置管理器等,以确保在整个应用程序中只有一个实例,从而避免不必要的资源消耗。以下是一个简单的 Python 示例,演示了如何实现单例模式:class Singleton: _instance = None def __new__(cls): if not cls._instance: cls._instance = super(Singleton, cls).__new__(cls) return cls._instance# 测试单例模式singleton1 = Singleton()singleton2 = Singleton()print(singleton1 is singleton2) # 输出: True,说明两个变量引用的是同一个实例在这个例子中,__new__ 方法是 Python 中用于创建对象的一个特殊方法。在创建对象时,首先调用 __new__ 方法,...