设计模式|结构型模式总结

news/2025/2/26 17:41:19

1. 介绍

结构型设计模式(Structural Patterns) 主要关注类与对象的组合,以提高代码的灵活性和可维护性。这些模式帮助创建更大结构,同时保持代码的低耦合性。

结构型设计模式包括以下七种:

  1. 适配器模式(Adapter)

  2. 桥接模式(Bridge)

  3. 组合模式(Composite)

  4. 装饰器模式(Decorator)

  5. 外观模式(Facade)

  6. 享元模式(Flyweight)

  7. 代理模式(Proxy)


2. 适配器模式(Adapter)

目的:使接口不兼容的类能够协同工作。

实现方式:通过包装(Wrapper)转换接口。

示例(Python 实现):

class OldSystem:
    def specific_request(self):
        return "Old System Data"

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

old_system = OldSystem()
adapter = Adapter(old_system)
print(adapter.request())

3. 桥接模式(Bridge)

目的:分离抽象部分和实现部分,使它们可以独立变化。

示例

class Implementation:
    def operation(self):
        pass

class ConcreteImplementationA(Implementation):
    def operation(self):
        return "Implementation A"

class Abstraction:
    def __init__(self, implementation):
        self.implementation = implementation
    
    def operation(self):
        return self.implementation.operation()

abstraction = Abstraction(ConcreteImplementationA())
print(abstraction.operation())

4. 组合模式(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):
        return "+".join([child.operation() for child in self.children])

leaf = Leaf()
composite = Composite()
composite.add(leaf)
print(composite.operation())

5. 装饰器模式(Decorator)

目的:动态地给对象增加额外的功能。

示例

def decorator(func):
    def wrapper():
        print("Before Function Call")
        func()
        print("After Function Call")
    return wrapper

@decorator
def function():
    print("Hello")

function()

6. 外观模式(Facade)

目的:提供一个统一的接口,简化子系统的复杂性。

示例

class SubsystemA:
    def operation(self):
        return "SubsystemA Operation"

class SubsystemB:
    def operation(self):
        return "SubsystemB Operation"

class Facade:
    def __init__(self):
        self.a = SubsystemA()
        self.b = SubsystemB()
    
    def operation(self):
        return f"{self.a.operation()} + {self.b.operation()}"

facade = Facade()
print(facade.operation())

7. 享元模式(Flyweight)

目的:减少内存占用,通过共享相似对象来避免创建大量相同对象。

示例

class Flyweight:
    _instances = {}
    
    @staticmethod
    def get_instance(key):
        if key not in Flyweight._instances:
            Flyweight._instances[key] = Flyweight()
        return Flyweight._instances[key]

fw1 = Flyweight.get_instance("A")
fw2 = Flyweight.get_instance("A")
print(fw1 is fw2)  # True

8. 代理模式(Proxy)

目的:控制对象的访问,如权限控制、远程代理、虚拟代理。

示例

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

class Proxy:
    def __init__(self, real_subject):
        self.real_subject = real_subject
    
    def request(self):
        print("Proxy: Checking Access")
        return self.real_subject.request()

real = RealSubject()
proxy = Proxy(real)
print(proxy.request())

9. 总结

结构型设计模式 通过合理组织类和对象,使系统更灵活、可扩展。根据不同需求,选择合适的模式:

模式主要作用
适配器模式连接不同接口的类
桥接模式分离抽象和实现,提高扩展性
组合模式处理树形结构,使单个对象和组合对象一致
装饰器模式动态添加功能,提高灵活性
外观模式提供统一接口,简化复杂系统调用
享元模式共享对象,减少内存占用
代理模式控制对象访问,如远程代理、权限管理

http://www.niftyadmin.cn/n/5869000.html

相关文章

如何让传统制造企业从0到1实现数字化突破?

随着全球制造业不断向智能化、数字化转型,传统制造企业面临着前所未有的机遇与挑战。数字化转型不仅是技术的革新,更是管理、文化、业务流程等全方位的变革。从零开始,如何带领一家传统制造企业走向数字化突破,是许多企业领导者面…

多线程进阶 : 八股文面试题 一 [Java EE 多线程 锁和死锁相关问题]

目录 锁策略: 1. 乐观锁 vs 悲观锁 2. 轻量级锁 vs 重量级锁 3. 自旋锁 vs 挂起等待锁 4. 公平锁 vs 非公平锁 5. 可重入锁 vs 不可重入锁 6. 读写锁 vs 互斥锁 Java中 synchronized 内部实现策略 (内部原理) Java中的synchronized具体采用了哪些锁策略呢? 死锁相关 …

DeepSeek05-大模型WebUI

一、说明: 将DeepSeek部署到前台Web界面的方法主要有以下几种推荐方案,涵盖开源工具、第三方客户端及特定场景适配方案: Open WebUIChatbox AICherry StudioSillyTavern 二、Open WebUI 安装配置教程 特点:Open WebUI 是一个开…

The First项目报告:MyShell开启AI创作经济新纪元

随着加密货币和区块链技术的不断发展,MyShell作为一个前瞻性的Web3 AI平台,迅速崭露头角。MyShell致力于通过去中心化的方式,将AI技术与区块链相结合,为全球创客社区提供一个开放、模块化的AI应用生态。2025年2月25日,…

idea里的插件spring boot helper 如何使用,有哪些强大的功能,该如何去习惯性的运用这些功能

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…

【WebDav】坚果云使用WebDav访问文件夹内文档大于750份无法返回问题

坚果云分页多次加载解决办法 问题坚果云使用WebDav访问限制 现象PropFind请求返回数据少于文件夹内数据坚果云请求响应体坚果云请求响应头 结论文档遍历实现python循环方式实现 问题 坚果云使用WebDav访问限制 在批量请求时使用大部份的WebDav库请求坚果云时都会出现仅请求到前…

Fisher信息矩阵与Hessian矩阵:区别与联系全解析

Fisher信息矩阵与Hessian矩阵:区别与联系全解析 在统计学和机器学习中,Fisher信息矩阵(FIM)和Hessian矩阵是两个经常出现的概念,它们都与“二阶信息”有关,常用来描述函数的曲率或参数的敏感性。你可能听说…

AI 编码 2.0 分析、思考与探索实践:从 Cursor Composer 到 AutoDev Sketch

在周末的公司【AI4SE 效能革命与实践:软件研发的未来已来】直播里,我分享了《AI编码工具 2.0 从 Cursor 到 AutoDev Composer》主题演讲,分享了 AI 编码工具 2.0 的核心、我们的思考、以及我们的 AI 编码工具 2.0 探索实践。 在这篇文章中&am…