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

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

一、设计模式详解

(一)设计模式的定义

  • 设计模式 是对软件开发中常见问题的解决方案,是经过实践验证的经验总结。
  • 优点:
    • (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) 选择合适的模式,解决具体问题。
  • 学习设计模式的步骤:
    • 理解模式的定义与应用场景。
    • 掌握模式的代码实现。
    • 在实际开发中灵活运用。

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

相关文章:

  • 30. C语言 动态内存管理详解:从malloc到realloc
  • Highcharts 柱形图:深入解析与最佳实践
  • 代码随想录算法训练营第三十八天-动态规划-完全背包-322. 零钱兑换
  • 【教学类-89-02】20250128新年篇02——姓名藏头对联(星火讯飞+Python,五言对联,有横批)
  • DeepSeek-R1 蒸馏模型及如何用 Ollama 在本地运行DeepSeek-R1
  • python -m pip和pip的主要区别
  • 定制Centos镜像(一)
  • Unity 资源 之 宝藏资源分享Motion Warping: Climb Interact
  • 2023年版本IDEA复制项目并修改端口号和运行内存
  • 寒假学web--day10
  • 【UE插件】Sphinx关键词语音识别
  • 前部分知识复习02
  • 单元测试在复杂业务逻辑开发中的重要性与实践
  • 性能测试丨Nginx 性能数据监控
  • 【Python实现机器遗忘算法】复现2021年顶会 AAAI算法Amnesiac Unlearning
  • Node.js日志记录新篇章:morgan中间件的使用与优势
  • Fort Firewall:全方位守护网络安全
  • 数据结构与算法之数组: LeetCode 380. O(1) 时间插入、删除和获取随机元素 (Ts版)
  • TS开发的类型索引目录
  • kubernetes 核心技术-调度器
  • 公式与函数的应用
  • 【前端SEO】使用Vue.js + Nuxt 框架构建服务端渲染 (SSR) 应用满足SEO需求
  • 基于 PyTorch 的深度学习模型开发实战
  • 搭建 docxify 静态博客教程
  • 13、Java JDBC 编程:连接数据库的桥梁
  • Java并发编程实战:深入探索线程池与Executor框架