Bootstrap

【面试】【详解】设计模式

一、设计模式详解

(一)设计模式的定义

  • 设计模式 是对软件开发中常见问题的解决方案,是经过实践验证的经验总结。
  • 优点:
    • (1) 提高代码复用性。
    • (2) 增强代码的可维护性和可扩展性。
    • (3) 提供代码的可读性和团队协作能力。

(二)创建型模式

1. 单例模式
  • 定义:保证一个类仅有一个实例,并提供全局访问点。

  • 应用场景:

    • (1) 数据库连接池。
    • (2) 日志管理。
  • 代码示例(Python):

class Singleton:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super().__new__(cls, *args, **kwargs)
        return cls._instance

# 测试
singleton1 = Singleton()
singleton2 = Singleton()
print(singleton1 is singleton2)  # 输出 True
2. 工厂方法模式
  • 定义:定义一个创建对象的接口,让子类决定实例化哪个类。

  • 应用场景:

    • (1) 产品分类生产。
    • (2) 数据解析工具。
  • 代码示例(Python):

from abc import ABC, abstractmethod

class Product(ABC):
    @abstractmethod
    def use(self):
        pass

class ConcreteProductA(Product):
    def use(self):
        return "Product A is used"

class ConcreteProductB(Product):
    def use(self):
        return "Product B is used"

class Factory:
    @staticmethod
    def create_product(product_type):
        if product_type == 'A':
            return ConcreteProductA()
        elif product_type == 'B':
            return ConcreteProductB()
        else:
            raise ValueError("Unknown product type")

# 测试
product = Factory.create_product('A')
print(product.use())  # 输出 Product A is used

(三)结构型模式

1. 适配器模式
  • 定义:将一个类的接口转换为用户期望的另一个接口。

  • 应用场景:

    • (1) 第三方接口的兼容。
    • (2) 系统迁移时的新旧模块对接。
  • 代码示例(Python):

class OldSystem:
    def old_method(self):
        return "Old system method"

class NewSystem:
    def new_method(self):
        return "New system method"

class Adapter:
    def __init__(self, old_system):
        self.old_system = old_system

    def new_method(self):
        return self.old_system.old_method()

# 测试
old_system = OldSystem()
adapter = Adapter(old_system)
print(adapter.new_method())  # 输出 Old system method
2. 装饰器模式
  • 定义:动态地为对象添加新功能。

  • 应用场景:

    • (1) 日志记录。
    • (2) 数据校验。
  • 代码示例(Python):

def logger(func):
    def wrapper(*args, **kwargs):
        print(f"Function {func.__name__} is called with {args} and {kwargs}")
        return func(*args, **kwargs)
    return wrapper

@logger
def add(a, b):
    return a + b

# 测试
result = add(3, 5)  # 输出 Function add is called with (3, 5) and {}
print(result)       # 输出 8

(四)行为型模式

1. 观察者模式
  • 定义:定义对象间的一对多依赖关系,使得一个对象状态改变时,所有依赖它的对象都得到通知。

  • 应用场景:

    • (1) 事件系统。
    • (2) 消息广播。
  • 代码示例(Python):

class 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, message):
        for observer in self._observers:
            observer.update(message)

class Observer:
    def update(self, message):
        raise NotImplementedError

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

# 测试
subject = Subject()
observer1 = ConcreteObserver()
observer2 = ConcreteObserver()
subject.attach(observer1)
subject.attach(observer2)
subject.notify("Hello Observers!")
# 输出 Observer received: Hello Observers!(两次)
2. 策略模式
  • 定义:定义一系列算法,将每个算法封装起来,使它们可以互换。

  • 应用场景:

    • (1) 不同支付方式的选择。
    • (2) 日志策略切换。
  • 代码示例(Python):

class PaymentStrategy:
    def pay(self, amount):
        raise NotImplementedError

class CreditCardPayment(PaymentStrategy):
    def pay(self, amount):
        print(f"Paid {amount} using Credit Card")

class PayPalPayment(PaymentStrategy):
    def pay(self, amount):
        print(f"Paid {amount} using PayPal")

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

    def execute_payment(self, amount):
        self.strategy.pay(amount)

# 测试
payment_method = PayPalPayment()
context = Context(payment_method)
context.execute_payment(100)  # 输出 Paid 100 using PayPal

(五)总结

  • 设计模式的关键:
    • (1) 解耦代码,提高扩展性。
    • (2) 选择合适的模式,解决具体问题。
  • 学习设计模式的步骤:
    • 理解模式的定义与应用场景。
    • 掌握模式的代码实现。
    • 在实际开发中灵活运用。
;