*设计模式是解决特定问题的经验丰富的通用解决方案,它们是在软件设计中反复出现的问题的可重用设计。以下是23种经典的设计模式,以Python语言的代码示例呈现: *
工厂方法模式是一种创建型设计模式,它提供了一个接口来创建对象,但允许子类决定要实例化的类。这种模式使一个类的实例化延迟到其子类。
from abc import ABC, abstractmethod
class Creator(ABC):
@abstractmethod
def factory_method(self):
pass
def some_operation(self):
product = self.factory_method()
result = f"Creator: The same creator's code has just worked with {product.operation()}"
return result
class ConcreteCreator1(Creator):
def factory_method(self):
return ConcreteProduct1()
class ConcreteCreator2(Creator):
def factory_method(self):
return ConcreteProduct2()
class Product(ABC):
@abstractmethod
def operation(self):
pass
class ConcreteProduct1(Product):
def operation(self):
return "{Result of ConcreteProduct1}"
class ConcreteProduct2(Product):
def operation(self):
return "{Result of ConcreteProduct2}"
抽象工厂模式是一种创建型设计模式,它提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定它们的具体类。这种模式通过提供一组接口来创建产品家族,使得客户端代码与实际创建的具体类解耦。
from abc import ABC, abstractmethod
class AbstractFactory(ABC):
@abstractmethod
def create_product_a(self):
pass
@abstractmethod
def create_product_b(self):
pass
class ConcreteFactory1(AbstractFactory):
def create_product_a(self):
return ConcreteProductA1()
def create_product_b(self):
return ConcreteProductB1()
class ConcreteFactory2(AbstractFactory):
def create_product_a(self):
return ConcreteProductA2()
def create_product_b(self):
return ConcreteProductB2()
class AbstractProductA(ABC):
@abstractmethod
def useful_function_a(self):
pass
class ConcreteProductA1(AbstractProductA):
def useful_function_a(self):
return "The result of the product A1."
# Similar classes for ConcreteProductA2, ConcreteProductB1, ConcreteProductB2
建造者模式是一种创建型设计模式,它允许你创建一个复杂对象的表示,而无需直接实例化该对象。建造者模式主要用于通过一个指挥者类指导整个构建过程,将构建过程与表示分离,使得相同的构建过程可以创建不同的表示。
class Director:
def __init__(self):
self.builder = None
def construct(self, builder):
self.builder = builder
self.builder.build_part_a()
self.builder.build_part_b()
class Builder:
@abstractmethod
def build_part_a(self):
pass
@abstractmethod
def build_part_b(self):
pass
@abstractmethod
def get_result(self):
pass
class ConcreteBuilder1(Builder):
def __init__(self):
self.product = Product1()
def build_part_a(self):
self.product.add("PartA1")
def build_part_b(self):
self.product.add("PartB1")
def get_result(self):
return self.product
class ConcreteBuilder2(Builder):
# Similar to ConcreteBuilder1
```
原型模式是一种创建型设计模式,其核心思想是通过复制(克隆)一个现有对象来创建新的对象,而不是通过实例化进行创建。这种模式适用于对象的创建成本较高,但复制的成本较低的情况。
import copy
class Prototype:
def clone(self):
return copy.deepcopy(self)
class ConcretePrototype(Prototype):
def __init__(self, value):
self.value = value
def __str__(self):
return f"ConcretePrototype: {self.value}"
单例模式是一种创建型设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点。
class Singleton:
_instance = None
def __new__(cls):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance
适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端期望的另一个接口。这种模式允许原本由于接口不兼容而不能一起工作的类能够一起工作。
class Target:
def request(self):
return "Target: The default target's behavior."
class Adaptee:
def specific_request(self):
return ".eetpadA eht fo roivaheb laicepS"
class Adapter(Target, Adaptee):
def request(self):
return f"Adapter: (TRANSLATED) {self.specific_request()[::-1]}"
桥接模式是一种结构型设计模式,它将一个抽象部分与其实现部分分离,使它们可以独立地变化。这种模式通过将继承关系转化为组合关系,从而降低了抽象和实现两个层次的耦合度。
class Abstraction:
def __init__(self, implementation):
self.implementation = implementation
def operation(self):
return f"Abstraction: Base operation with:\n{self.implementation.operation_implementation()}"
class ExtendedAbstraction(Abstraction):
def operation(self):
return f"ExtendedAbstraction: Extended operation with:\n{self.implementation.operation_implementation()}"
class Implementation:
def operation_implementation(self):
pass
class ConcreteImplementationA(Implementation):
def operation_implementation(self):
return "ConcreteImplementationA: Here's the result on the platform A."
# Similar class ConcreteImplementationB
组合模式是一种结构型设计模式,它允许将对象组合成树形结构以表示部分-整体的层次结构。通过使用组合模式,客户端可以统一对待单个对象和组合对象。
class Component(ABC):
@abstractmethod
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 remove(self, component):
self.children.remove(component)
def operation(self):
results = []
for child in self.children:
results.append(child.operation())
return f"Branch({', '.join(results)})"
装饰器模式是一种结构型设计模式,它允许向对象动态添加新功能,通过将对象包装在一个装饰器类的实例中,这个装饰器类可以添加额外的行为而不改变原始类的结构。
class Component(ABC):
@abstractmethod
def operation(self):
pass
class ConcreteComponent(Component):
def operation(self):
return "ConcreteComponent"
class Decorator(Component):
def __init__(self, component):
self._component = component
def operation(self):
return f"Decorator({self._component.operation()})"
class ConcreteDecoratorA(Decorator):
def operation(self):
return f"ConcreteDecoratorA({self._component.operation()})"
外观模式是一种结构型设计模式,它为一个复杂系统提供一个简化的接口,使得系统更容易使用。外观模式通过将系统的一组接口封装在一个高层接口中,为客户端提供一个简单而一致的入口点。
class Subsystem1:
def operation1(self):
return "Subsystem1: Ready!"
def operation_n(self):
return "Subsystem1: Go!"
class Subsystem2:
def operation1(self):
return "Subsystem2: Get ready!"
def operation_z(self):
return "Subsystem2: Fire!"
class Facade:
def __init__(self, subsystem1, subsystem2):
self._subsystem1 = subsystem1
self._subsystem2 = subsystem2
def operation(self):
results = []
results.append(self._subsystem1.operation1())
results.append(self._subsystem2.operation1())
results.append(self._subsystem1.operation_n())
results.append(self._subsystem2.operation_z())
return "\n".join(results)
享元模式是一种结构型设计模式,它旨在通过共享尽可能多的对象来有效支持大量小颗粒度的对象。这种模式适用于需要创建大量相似对象的情况,以减少内存占用和提高性能。
class Flyweight:
def operation(self, extrinsic_state):
pass
class ConcreteFlyweight(Flyweight):
def operation(self, extrinsic_state):
return f"ConcreteFlyweight: {extrinsic_state}"
class UnsharedConcreteFlyweight(Flyweight):
def operation(self, extrinsic_state):
return f"UnsharedConcreteFlyweight: {extrinsic_state}"
代理模式是一种结构型设计模式,它提供了一个代理对象,控制对其他对象的访问。代理对象充当另一个对象的接口,以控制对该对象的访问。
class Subject(ABC):
@abstractmethod
def request(self):
pass
class RealSubject(Subject):
def request(self):
return "RealSubject: Handling request."
class Proxy(Subject):
def __init__(self, real_subject):
self._real_subject = real_subject
def request(self):
if self.check_access():
return self._real_subject.request()
else:
return "Proxy: Access denied."
def check_access(self):
# Some logic to check access
return True
责任链模式是一种行为型设计模式,它允许你将请求沿着处理者链传递。每个处理者决定是否处理请求或将其传递给链中的下一个处理者。
class Handler(ABC):
@abstractmethod
def set_next(self, handler):
pass
@abstractmethod
def handle_request(self, request):
pass
class ConcreteHandler(Handler):
def __init__(self):
self._next_handler = None
def set_next(self, handler):
self._next_handler = handler
return handler
def handle_request(self, request):
if self._next_handler:
return self._next_handler.handle_request(request)
else:
return None
命令模式是一种行为型设计模式,它将请求封装成一个对象,使得可以参数化客户端对象,队列中的对象,或者日志中的对象,并支持撤销操作。
class Command(ABC):
@abstractmethod
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):
pass
class Invoker:
def __init__(self):
self._command = None
def set_command(self, command):
self._command = command
def execute_command(self):
self._command.execute()
解释器模式是一种行为型设计模式,它定义了一个语言的文法,并且用一个解释器来解释这个语言中的句子。
class Context:
def __init__(self):
self._input = None
self._output = None
class AbstractExpression(ABC):
@abstractmethod
def interpret(self, context):
pass
class TerminalExpression(AbstractExpression):
def interpret(self, context):
pass
class NonterminalExpression(AbstractExpression):
def interpret(self, context):
pass
迭代器模式是一种行为型设计模式,它提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部表示。
class Iterator(ABC):
@abstractmethod
def first(self):
pass
@abstractmethod
def next(self):
pass
@abstractmethod
def is_done(self):
pass
@abstractmethod
def current_item(self):
pass
class ConcreteIterator(Iterator):
def first(self):
pass
def next(self):
pass
def is_done(self):
pass
def current_item(self):
pass
中介者模式是一种行为型设计模式,它定义了一个封装一组对象之间交互的中介者对象,使对象之间不直接相互通信,而是通过中介者进行通信。
class Mediator(ABC):
@abstractmethod
def notify(self, colleague, event):
pass
class ConcreteMediator(Mediator):
def __init__(self, colleague1, colleague2):
self._colleague1 = colleague1
self._colleague2 = colleague2
def notify(self, colleague, event):
if event == "A":
self._colleague2.handle_notification(event)
elif event == "B":
self._colleague1.handle_notification(event)
class Colleague(ABC):
def __init__(self, mediator):
self._mediator = mediator
@abstractmethod
def handle_notification(self, event):
pass
class ConcreteColleague1(Colleague):
def handle_notification(self, event):
pass
class ConcreteColleague2(Colleague):
def handle_notification(self, event):
pass
备忘录模式是一种行为型设计模式,它允许在不暴露对象内部状态的情况下捕获并恢复对象之前的状态。这种模式通常用于需要在不破坏封装性的前提下保存和恢复对象状态的场景。
class Memento:
def __init__(self, state):
self._state = state
def get_state(self):
return self._state
class Originator:
def __init__(self, state):
self._state = state
def create_memento(self):
return Memento(self._state)
def restore(self, memento):
self._state = memento.get_state()
察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
class Subject(ABC):
@abstractmethod
def attach(self, observer):
pass
@abstractmethod
def detach(self, observer):
pass
@abstractmethod
def notify(self):
pass
class ConcreteSubject(Subject):
def __init__(self):
self._observers = []
def attach(self, observer):
self._observers.append(observer)
def detach(self, observer):
self._observers.remove(observer)
def notify(self):
for observer in self._observers:
observer.update()
class Observer(ABC):
@abstractmethod
def update(self):
pass
class ConcreteObserver(Observer):
def update(self):
pass
状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变其行为,使对象看起来好像修改了其类。这种模式属于行为型模式。
在状态模式中,一个对象可以在其内部状态发生变化时改变其行为,而客户端代码在使用对象时可以无需关心其内部状态的变化。这通过定义一系列表示不同状态的类来实现,然后将这些状态的对象委托给主对象。主对象在运行时可以切换当前状态,从而改变其行为。
通过使用状态模式,可以使得一个对象在不同的状态下表现出不同的行为,而且可以较为灵活地添加新的状态,而不需要修改已有的代码。这有助于将复杂的状态机逻辑分割成小块,使系统更易于理解和维护。
class State(ABC):
@abstractmethod
def handle(self):
pass
class ConcreteStateA(State):
def handle(self):
pass
class ConcreteStateB(State):
def handle(self):
pass
class Context:
def __init__(self, state):
self._state = state
def request(self):
self._state.handle()
策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换,使得客户端代码可以独立于具体的算法而变化。这种模式属于行为型模式。
在策略模式中,算法被封装成一个个的策略类,这些策略类都实现了一个共同的接口或继承自一个共同的抽象类。然后,客户端可以在运行时选择使用哪个策略,使得算法的选择可以动态变化。
通过使用策略模式,可以使得算法独立于其使用者,且易于扩展。客户端代码可以根据需要选择不同的策略,而不需要修改原有的代码。
class Strategy(ABC):
@abstractmethod
def execute(self):
pass
class ConcreteStrategyA(Strategy):
def execute(self):
pass
class ConcreteStrategyB(Strategy):
def execute(self):
pass
class Context:
def __init__(self, strategy):
self._strategy = strategy
def execute_strategy(self):
self._strategy.execute()
模板方法模式(Template Method Pattern)是一种行为设计模式,它定义了一个算法的骨架,但将一些步骤的具体实现延迟到子类。这种模式属于行为型模式。
在模板方法模式中,定义一个算法的骨架,将一些具体步骤的实现交给子类。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
通过使用模板方法模式,可以在不改变算法整体结构的情况下,让子类提供算法中某些步骤的具体实现。这使得代码更具灵活性和可维护性。
class AbstractClass(ABC):
@abstractmethod
def primitive_operation1(self):
pass
@abstractmethod
def primitive_operation2(self):
pass
def template_method(self):
self.primitive_operation1()
self.primitive_operation2()
class ConcreteClassA(AbstractClass):
def primitive_operation1(self):
pass
def primitive_operation2(self):
pass
class ConcreteClassB(AbstractClass):
def primitive_operation1(self):
pass
def primitive
访问者模式(Visitor Pattern)是一种行为设计模式,它允许定义在不改变元素类的前提下定义新操作。这种模式属于行为型模式。
在访问者模式中,将算法与数据结构分离。定义一个访问者类,该访问者类封装了对元素的一些操作,而元素类中则有一个接受访问者的方法。这样,在不修改元素类的前提下,可以通过创建不同的访问者来实现不同的操作。
通过使用访问者模式,可以在不改变元素类的情况下定义新的操作,而且可以轻松地添加新的访问者,以实现不同的操作。
from abc import ABC, abstractmethod
# Element接口
class Element(ABC):
@abstractmethod
def accept(self, visitor):
pass
# 具体元素A
class ConcreteElementA(Element):
def accept(self, visitor):
visitor.visit_concrete_element_a(self)
# 具体元素B
class ConcreteElementB(Element):
def accept(self, visitor):
visitor.visit_concrete_element_b(self)
# Visitor接口
class Visitor(ABC):
@abstractmethod
def visit_concrete_element_a(self, element):
pass
@abstractmethod
def visit_concrete_element_b(self, element):
pass
# 具体访问者1
class ConcreteVisitor1(Visitor):
def visit_concrete_element_a(self, element):
print("ConcreteVisitor1 visiting ConcreteElementA")
def visit_concrete_element_b(self, element):
print("ConcreteVisitor1 visiting ConcreteElementB")
# 具体访问者2
class ConcreteVisitor2(Visitor):
def visit_concrete_element_a(self, element):
print("ConcreteVisitor2 visiting ConcreteElementA")
def visit_concrete_element_b(self, element):
print("ConcreteVisitor2 visiting ConcreteElementB")
# 对象结构,包含元素的集合
class ObjectStructure:
def __init__(self):
self.elements = []
def attach(self, element):
self.elements.append(element)
def accept(self, visitor):
for element in self.elements:
element.accept(visitor)
# 使用
element_a = ConcreteElementA()
element_b = ConcreteElementB()
object_structure = ObjectStructure()
object_structure.attach(element_a)
object_structure.attach(element_b)
visitor1 = ConcreteVisitor1()
visitor2 = ConcreteVisitor2()
object_structure.accept(visitor1)
object_structure.accept(visitor2)
感谢你能看到最后,给大家准备了一些福利!
感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。
CSDN大礼包:全网最全《Python学习资料》免费赠送!(安全链接,放心点击)
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python兼职渠道推荐*
学的同时助你创收,每天花1-2小时兼职,轻松稿定生活费.
三、最新Python学习笔记
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
CSDN大礼包:gift::[全网最全《Python学习资料》免费赠送:free:!](https://blog.csdn.net/weixin_68789096/article/details/132275547?spm=1001.2014.3001.5502) (安全链接,放心点击)若有侵权,请联系删除