1. 介绍
结构型设计模式(Structural Patterns) 主要关注类与对象的组合,以提高代码的灵活性和可维护性。这些模式帮助创建更大结构,同时保持代码的低耦合性。
结构型设计模式包括以下七种:
-
适配器模式(Adapter)
-
桥接模式(Bridge)
-
组合模式(Composite)
-
装饰器模式(Decorator)
-
外观模式(Facade)
-
享元模式(Flyweight)
-
代理模式(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_systemdef 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):passclass ConcreteImplementationA(Implementation):def operation(self):return "Implementation A"class Abstraction:def __init__(self, implementation):self.implementation = implementationdef operation(self):return self.implementation.operation()abstraction = Abstraction(ConcreteImplementationA())
print(abstraction.operation())
4. 组合模式(Composite)
目的:处理树形结构,使单个对象和组合对象的使用一致。
示例:
class Component:def operation(self):passclass 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 = {}@staticmethoddef 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_subjectdef request(self):print("Proxy: Checking Access")return self.real_subject.request()real = RealSubject()
proxy = Proxy(real)
print(proxy.request())
9. 总结
结构型设计模式 通过合理组织类和对象,使系统更灵活、可扩展。根据不同需求,选择合适的模式:
模式 | 主要作用 |
---|---|
适配器模式 | 连接不同接口的类 |
桥接模式 | 分离抽象和实现,提高扩展性 |
组合模式 | 处理树形结构,使单个对象和组合对象一致 |
装饰器模式 | 动态添加功能,提高灵活性 |
外观模式 | 提供统一接口,简化复杂系统调用 |
享元模式 | 共享对象,减少内存占用 |
代理模式 | 控制对象访问,如远程代理、权限管理 |