前言
1. 单例模式(Singleton Pattern):保证一个类只有一个实例,并提供一个全局的访问点。
2. 工厂模式(Factory Pattern):定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。
3. 观察者模式(Observer Pattern):定义对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会被自动通知并更新。
4. 装饰器模式(Decorator Pattern):动态地给一个对象添加一些额外的职责,而不会影响到其他对象。
5. 策略模式(Strategy Pattern):定义一系列的算法,将每个算法封装起来,并使它们可以相互替换。
6. 命令模式(Command Pattern):将请求封装成一个对象,从而使用户可以用不同的请求对客户进行参数化。
7. 适配器模式(Adapter Pattern):将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的类能够一起工作。
8. 外观模式(Facade Pattern):为子系统中的一组接口提供一个统一的接口,从而使得子系统更加容易使用。
9. 状态模式(State Pattern):允许一个对象在其内部状态改变时改变其行为。
10. 模板方法模式(Template Method Pattern):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中实现。
11.代理模式(代理模式):是一种结构型设计模式,它允许通过代理对象控制对另一个对象的访问。代理通常充当客户端和真实对象之间的中介,用于控制对真实对象的访问或添加一些额外的行为。
这些是Python中常用的设计模式,通过使用这些设计模式可以提高代码的可读性、可维护性和重用性。
代理模式
# 主题接口
class Subject:
def request(self):
pass
# 真实主题
class RealSubject(Subject):
def request(self):
print("RealSubject: Handling request")
# 代理类
class Proxy(Subject):
def __init__(self, real_subject):
self.real_subject = real_subject
def request(self):
# 在访问真实主题之前可以执行一些额外的操作
print("Proxy: Logging request")
# 调用真实主题的方法
self.real_subject.request()
# 在访问真实主题之后可以执行一些额外的操作
print("Proxy: Post-processing request")
# 客户端代码
if __name__ == "__main__":
# 创建真实主题
real_subject = RealSubject()
# 创建代理并传入真实主题
proxy = Proxy(real_subject)
# 客户端通过代理访问真实主题
proxy.request()
Subject
是主题接口,定义了真实主题和代理共同的接口。RealSubject
是真实主题,实现了主题接口的具体操作。Proxy
是代理类,它包含一个真实主题的实例,并在访问真实主题前后执行一些额外的操作。
优点:
-
控制对对象的访问: 代理模式允许在访问真实对象之前或之后执行一些额外的操作,从而对对象的访问进行控制。这包括权限控制、验证等。
-
实现懒加载: 虚拟代理可以实现懒加载,即只有在需要时才创建和加载真实对象,从而提高性能。
-
实现远程代理: 代理模式可以用于在不同地址空间中代理对象,实现远程代理。
-
实现缓存代理: 代理模式可以用于缓存对象的状态,以减少资源的消耗,提高性能。
缺点:
-
复杂性增加: 引入代理会增加系统的复杂性,因为需要创建额外的类和接口,并且在设计中需要考虑更多的层次关系。
-
性能损耗: 在某些情况下,代理模式可能引入一些性能损耗,特别是在频繁访问真实对象的情况下。
-
可能引入单点故障: 如果代理对象负责管理真实对象的生命周期,那么代理对象可能成为单点故障的潜在源。
应用场景
- 远程代理: 用于在不同地址空间中代理对象。
- 虚拟代理: 用于按需创建开销较大的对象,或延迟对象的创建。
- 保护代理: 用于控制对对象的访问权限。
- 缓存代理: 用于缓存对象的状态,以提高性能。