当前位置: 首页 > article >正文

深入解析常见的设计模式

在本篇博文中,我们将逐个深入解析常见的设计模式,包括它们的目的、结构和具体示例,帮助你更好地理解和应用这些模式。

一、创建型模式

1. 单例模式(Singleton)

目的:确保一个类只有一个实例,并提供全局访问。

示例

class Singleton:  
    _instance = None  

    def __new__(cls):  
        if cls._instance is None:  
            cls._instance = super(Singleton, cls).__new__(cls)  
        return cls._instance  

singleton1 = Singleton()  
singleton2 = Singleton()  

print(singleton1 is singleton2)  # Output: True

2. 工厂方法模式(Factory Method)

目的:定义一个创建对象的接口,使子类决定实例化哪一个类。

示例

class Product:  
    def operation(self):  
        pass  

class ConcreteProductA(Product):  
    def operation(self):  
        return "Result of ConcreteProductA"  

class ConcreteProductB(Product):  
    def operation(self):  
        return "Result of ConcreteProductB"  

class Creator:  
    def factory_method(self):  
        raise NotImplementedError  

class ConcreteCreatorA(Creator):  
    def factory_method(self):  
        return ConcreteProductA()  

class ConcreteCreatorB(Creator):  
    def factory_method(self):  
        return ConcreteProductB()  

creator = ConcreteCreatorA()  
product = creator.factory_method()  
print(product.operation())  # Output: Result of ConcreteProductA

3. 抽象工厂模式(Abstract Factory)

目的:提供一个创建一系列相关或依赖对象的接口。

示例

class AbstractFactory:  
    def create_product_a(self):  
        pass  

    def create_product_b(self):  
        pass  

class ConcreteFactory1(AbstractFactory):  
    def create_product_a(self):  
        return "Product A1"  

    def create_product_b(self):  
        return "Product B1"  

class ConcreteFactory2(AbstractFactory):  
    def create_product_a(self):  
        return "Product A2"  

    def create_product_b(self):  
        return "Product B2"  

factory = ConcreteFactory1()  
print(factory.create_product_a())  # Output: Product A1

4. 建造者模式(Builder)

目的:将复杂对象的构建与表示分离,使同样的构建过程可以创建不同的表示。

示例

class Product:  
    def __init__(self):  
        self.parts = []  

    def add(self, part):  
        self.parts.append(part)  

class Builder:  
    def __init__(self):  
        self.product = Product()  

    def build_part1(self):  
        self.product.add("Part1")  

    def build_part2(self):  
        self.product.add("Part2")  

    def get_product(self):  
        return self.product  

builder = Builder()  
builder.build_part1()  
builder.build_part2()  
product = builder.get_product()  
print(product.parts)  # Output: ['Part1', 'Part2']

5. 原型模式(Prototype)

目的:通过复制现有实例来创建新实例,而不是使用构造函数。

示例

import copy  

class Prototype:  
    def clone(self):  
        return copy.deepcopy(self)  

class ConcretePrototype(Prototype):  
    def __init__(self, value):  
        self.value = value  

prototype = ConcretePrototype("Original")  
clone = prototype.clone()  
clone.value = "Clone"  
print(prototype.value)  # Output: Original  
print(clone.value)       # Output: Clone

二、结构型模式

1. 适配器模式(Adapter)

目的:将一个类的接口转换成客户希望的另一个接口。

示例

class Target:  
    def request(self):  
        return "Target: Default behavior"  

class Adaptee:  
    def specific_request(self):  
        return "Adaptee: Specific behavior"  

class Adapter(Target):  
    def __init__(self, adaptee):  
        self.adaptee = adaptee  

    def request(self):  
        return self.adaptee.specific_request()  

adaptee = Adaptee()  
adapter = Adapter(adaptee)  
print(adapter.request())  # Output: Adaptee: Specific behavior

2. 桥接模式(Bridge)

目的:将抽象部分与其实现部分分离,以便可以独立变换。

示例

class Abstraction:  
    def __init__(self, implementor):  
        self.implementor = implementor  

    def operation(self):  
        return f"Abstraction: {self.implementor.operation_impl()}"  

class Implementor:  
    def operation_impl(self):  
        return "Implementor"  

class ConcreteImplementorA(Implementor):  
    def operation_impl(self):  
        return "ConcreteImplementorA"  

implementor = ConcreteImplementorA()  
abstraction = Abstraction(implementor)  
print(abstraction.operation())  # Output: Abstraction: ConcreteImplementorA

3. 组合模式(Composite)

目的:将对象组合成树形结构以表示"部分-整体"的层次结构。

示例

class Component:  
    def operation(self):  
        pass  

class Leaf(Component):  
    def operation(self):  
        return "Leaf"  

class Composite(Component):  
    def __init__(self):  
        self.children = []  

    def add(self, component):  
        self.children.append(component)  

    def operation(self):  
        results = [child.operation() for child in self.children]  
        return f"Composite: [{', '.join(results)}]"  

composite = Composite()  
composite.add(Leaf())  
composite.add(Leaf())  
print(composite.operation())  # Output: Composite: [Leaf, Leaf]

4. 装饰模式(Decorator)

目的:动态地给对象添加一些额外的职责。

示例

class Component:  
    def operation(self):  
        return "Basic Component"  

class Decorator(Component):  
    def __init__(self, component):  
        self.component = component  

    def operation(self):  
        return f"Decorator: {self.component.operation()}"  

decorated_component = Decorator(Component())  
print(decorated_component.operation())  # Output: Decorator: Basic Component

5. 外观模式(Facade)

目的:为一个复杂子系统提供一个简单接口。

示例

class Subsystem1:  
    def operation1(self):  
        return "Subsystem1: Ready"  

class Subsystem2:  
    def operation2(self):  
        return "Subsystem2: Ready"  

class Facade:  
    def __init__(self):  
        self.subsystem1 = Subsystem1()  
        self.subsystem2 = Subsystem2()  

    def operation(self):  
        return f"{self.subsystem1.operation1()} and {self.subsystem2.operation2()}"  

facade = Facade()  
print(facade.operation())  # Output: Subsystem1: Ready and Subsystem2: Ready

6. 享元模式(Flyweight)

目的:通过共享技术来尽量减少内存使用。

示例

class Flyweight:  
    def __init__(self, intrinsic_state):  
        self.intrinsic_state = intrinsic_state  

    def operation(self, extrinsic_state):  
        return f"Intrinsic: {self.intrinsic_state}, Extrinsic: {extrinsic_state}"  

class FlyweightFactory:  
    def __init__(self):  
        self.flyweights = {}  

    def get_flyweight(self, key):  
        if key not in self.flyweights:  
            self.flyweights[key] = Flyweight(key)  
        return self.flyweights[key]  

factory = FlyweightFactory()  
flyweight1 = factory.get_flyweight("X")  
flyweight2 = factory.get_flyweight("Y")  
print(flyweight1.operation("A"))  # Output: Intrinsic: X, Extrinsic: A

7. 代理模式(Proxy)

目的:通过一个代理对象来控制对另一个对象的访问。

示例

class RealSubject:  
    def request(self):  
        return "RealSubject: Handling request"  

class Proxy:  
    def __init__(self):  
        self.real_subject = RealSubject()  

    def request(self):  
        return f"Proxy: Forwarding request to {self.real_subject.request()}"  

proxy = Proxy()  
print(proxy.request())  # Output: Proxy: Forwarding request to RealSubject: Handling request

三、行为型模式

1. 责任链模式(Chain of Responsibility)

目的:将请求的发送者与接收者解耦。

示例

class Handler:  
    def set_next(self, handler):  
        self.next_handler = handler  
        return handler  

    def handle(self, request):  
        if self.next_handler:  
            return self.next_handler.handle(request)  
        return None  

class ConcreteHandlerA(Handler):  
    def handle(self, request):  
        if request == "A":  
            return "Handler A handled the request"  
        return super().handle(request)  

class ConcreteHandlerB(Handler):  
    def handle(self, request):  
        if request == "B":  
            return "Handler B handled the request"  
        return super().handle(request)  

handler_a = ConcreteHandlerA()  
handler_b = ConcreteHandlerB()  
handler_a.set_next(handler_b)  

print(handler_a.handle("A"))  # Output: Handler A handled the request  
print(handler_a.handle("B"))  # Output: Handler B handled the request

2. 命令模式(Command)

目的:将请求封装为一个对象,以便于参数化客户代码。

示例

class Command:  
    def execute(self):  
        pass  

class ConcreteCommand(Command):  
    def __init__(self, receiver):  
        self.receiver = receiver  

    def execute(self):  
        self.receiver.action()  

class Receiver:  
    def action(self):  
        return "Receiver: Action executed"  

receiver = Receiver()  
command = ConcreteCommand(receiver)  
command.execute()  # Output: Receiver: Action executed

3. 解释器模式(Interpreter)

目的:为语言定义一个文法,并提供一个解释器。

示例

class Expression:  
    def interpret(self, context):  
        pass  

class TerminalExpression(Expression):  
    def interpret(self, context):  
        return context.split().count("Hello")  

context = "Hello world! Hello everyone!"  
terminal = TerminalExpression()  
print(terminal.interpret(context))  # Output: 2

4. 迭代器模式(Iterator)

目的:提供一种顺序访问聚合对象元素的方法,而无需暴露其内部表示。

示例

class Iterator:  
    def __init__(self, collection):  
        self.collection = collection  
        self.index = 0  

    def next(self):  
        item = self.collection[self.index]  
        self.index += 1  
        return item  

    def has_next(self):  
        return self.index < len(self.collection)  

collection = ["A", "B", "C"]  
iterator = Iterator(collection)  
while iterator.has_next():  
    print(iterator.next())  # Output: A, B, C

5. 中介者模式(Mediator)

目的:通过一个中介对象来减少对象之间的通信复杂度。

示例

class Mediator:  
    def notify(self, sender, event):  
        pass  

class ConcreteMediator(Mediator):  
    def __init__(self, component1, component2):  
        self.component1 = component1  
        self.component2 = component2  

    def notify(self, sender, event):  
        if sender == self.component1 and event == "A":  
            self.component2.do_b()  

class Component1:  
    def __init__(self, mediator):  
        self.mediator = mediator  

    def do_a(self):  
        print("Component1: Doing A")  
        self.mediator.notify(self, "A")  

class Component2:  
    def __init__(self, mediator):  
        self.mediator = mediator  

    def do_b(self):  
        print("Component2: Doing B")  

mediator = ConcreteMediator(Component1(mediator), Component2(mediator))  
mediator.component1.do_a()  
# Output:  
# Component1: Doing A  
# Component2: Doing B

6. 备忘录模式(Memento)

目的:在不暴露对象实现细节的情况下,捕获对象的内部状态。

示例

class Memento:  
    def __init__(self, state):  
        self.state = state  

class Originator:  
    def __init__(self):  
        self.state = None  

    def set_state(self, state):  
        self.state = state  

    def save(self):  
        return Memento(self.state)  

    def restore(self, memento):  
        self.state = memento.state  

originator = Originator()  
originator.set_state("State1")  
memento = originator.save()  
originator.set_state("State2")  
originator.restore(memento)  
print(originator.state)  # Output: State1

7. 观察者模式(Observer)

目的:定义对象间的一对多依赖关系,使得当一个对象改变状态时,所有依赖于它的对象都会得到通知。

示例

class Observer:  
    def update(self, message):  
        pass  

class ConcreteObserver(Observer):  
    def update(self, message):  
        print(f"Observer received: {message}")  

class Subject:  
    def __init__(self):  
        self.observers = []  

    def subscribe(self, observer):  
        self.observers.append(observer)  

    def unsubscribe(self, observer):  
        self.observers.remove(observer)  

    def notify(self, message):  
        for observer in self.observers:  
            observer.update(message)  

# 创建观察者和主题  
observer1 = ConcreteObserver()  
observer2 = ConcreteObserver()  
subject = Subject()  

# 订阅观察者  
subject.subscribe(observer1)  
subject.subscribe(observer2)  

# 通知所有观察者  
subject.notify("Hello Observers!")  
# Output:  
# Observer received: Hello Observers!  
# Observer received: Hello Observers!

8. 状态模式(State)

目的:允许一个对象在其内部状态改变时改变其行为。

示例

class State:  
    def handle(self):  
        pass  

class ConcreteStateA(State):  
    def handle(self):  
        return "State A: Handling"  

class ConcreteStateB(State):  
    def handle(self):  
        return "State B: Handling"  

class Context:  
    def __init__(self):  
        self.state = ConcreteStateA()  

    def set_state(self, state):  
        self.state = state  

    def request(self):  
        return self.state.handle()  

context = Context()  
print(context.request())  # Output: State A: Handling  

context.set_state(ConcreteStateB())  
print(context.request())  # Output: State B: Handling

9. 策略模式(Strategy)

目的:定义一系列算法,将每一个算法封装起来,并使它们可以互换。

示例

class Strategy:  
    def execute(self):  
        pass  

class ConcreteStrategyA(Strategy):  
    def execute(self):  
        return "Strategy A executed!"  

class ConcreteStrategyB(Strategy):  
    def execute(self):  
        return "Strategy B executed!"  

class Context:  
    def __init__(self, strategy):  
        self.strategy = strategy  

    def set_strategy(self, strategy):  
        self.strategy = strategy  

    def execute_strategy(self):  
        return self.strategy.execute()  

context = Context(ConcreteStrategyA())  
print(context.execute_strategy())  # Output: Strategy A executed!  

context.set_strategy(ConcreteStrategyB())  
print(context.execute_strategy())  # Output: Strategy B executed!

10. 模板方法模式(Template Method)

目的:定义一个算法的框架,而将一些步骤延迟到子类中。

示例

class AbstractClass:  
    def template_method(self):  
        self.step1()  
        self.step2()  

    def step1(self):  
        pass  

    def step2(self):  
        pass  

class ConcreteClass(AbstractClass):  
    def step1(self):  
        return "Step 1 completed."  

    def step2(self):  
        return "Step 2 completed."  

concrete = ConcreteClass()  
concrete.template_method()  
# Output: Step 1 completed. Step 2 completed.

11. 访问者模式(Visitor)

目的:将操作封装到一个访问者对象中,以便于在不改变目标对象类的情况下增加新的操作。

示例

class Element:  
    def accept(self, visitor):  
        pass  

class ConcreteElementA(Element):  
    def accept(self, visitor):  
        visitor.visit(self)  

class ConcreteElementB(Element):  
    def accept(self, visitor):  
        visitor.visit(self)  

class Visitor:  
    def visit(self, element):  
        pass  

class ConcreteVisitor(Visitor):  
    def visit(self, element):  
        return f"Visited {type(element).__name__}"  

elements = [ConcreteElementA(), ConcreteElementB()]  
visitor = ConcreteVisitor()  

for element in elements:  
    print(element.accept(visitor))  # Output: Visited ConcreteElementA  Visited ConcreteElementB

以上是对观察者模式及其他行为型设计模式的详细介绍和示例。如果你还有其他问题或者想深入了解的内容,随时告诉我!


 


http://www.kler.cn/a/410084.html

相关文章:

  • uniop触摸屏维修eTOP40系列ETOP40-0050
  • 使用java模拟记录软件免费试用次数
  • 【Flutter】搭建Flutter开发环境,安卓开发
  • Linux系统Docker部署开源在线协作笔记Trilium Notes与远程访问详细教程
  • 汽车HiL测试:利用TS-GNSS模拟器掌握硬件性能的仿真艺术
  • leetcode 面试150之 156.LUR 缓存
  • 三种蓝牙架构实现方案
  • python基础练习
  • ThingsBoard安装测试
  • 学习python的第十三天之函数——函数传参中的传值和传址问题
  • 基于FPGA的2FSK调制-串口收发-带tb仿真文件-实际上板验证成功
  • 网络常见命令
  • 美妆连锁新纪元:多门店电商系统如何重塑美妆产业新生态
  • 如何在 UniApp 中实现 iOS 版本更新检测
  • go-rod vs Selenium:自动化测试工具的比较与选择
  • STM32C011开发(1)----开发板测试
  • 人名分类器(nlp)
  • 44.扫雷第二部分、放置随机的雷,扫雷,炸死或成功 C语言
  • C++11(上)
  • DockerFile 构建基础镜像
  • 泷羽sec-linux
  • 【QT项目】基于C++的数据链路层帧封装实验(CRC校验算法实现)
  • Java基础1.0
  • Paddle Inference部署推理(五)
  • Cmakelist.txt之win-c-udp-server
  • ffmpeg 视频滤镜:高斯模糊-gblur