适用人群:有编程基础的开发者
学习时长:约1-2周(每天1-2小时)
重要程度:★★★☆☆(进阶提升)
一、什么是设计模式?
设计模式是前人总结的代码设计经验,用于解决特定场景下的常见问题。
| 类型 | 模式 | 说明 |
|---|---|---|
| 创建型 | 单例、工厂、建造者 | 对象创建方式 |
| 结构型 | 适配器、装饰器、代理 | 对象组合方式 |
| 行为型 | 观察者、策略、模板方法 | 对象交互方式 |
二、创建型模式
2.1 单例模式(Singleton)
# 保证一个类只有一个实例
class Database:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
cls._instance.connection = None
return cls._instance
def connect(self):
if not self.connection:
self.connection = "数据库连接已建立"
return self.connection
# 使用
db1 = Database()
db2 = Database()
print(db1 is db2) # True
// JavaScript单例
class Database {
static instance = null
static getInstance() {
if (!Database.instance) {
Database.instance = new Database()
}
return Database.instance
}
constructor() {
this.connection = null
}
connect() {
if (!this.connection) {
this.connection = '数据库连接已建立'
}
return this.connection
}
}
2.2 工厂模式(Factory)
# 根据参数创建不同对象
class User:
def __init__(self, name, role):
self.name = name
self.role = role
class UserFactory:
@staticmethod
def create(name, role):
if role == 'admin':
return AdminUser(name)
elif role == 'editor':
return EditorUser(name)
else:
return User(name, role)
class AdminUser(User):
def __init__(self, name):
super().__init__(name, 'admin')
self.permissions = ['read', 'write', 'delete']
class EditorUser(User):
def __init__(self, name):
super().__init__(name, 'editor')
self.permissions = ['read', 'write']
# 使用
user = UserFactory.create('张三', 'admin')
2.3 建造者模式(Builder)
# 分步构建复杂对象
class QueryBuilder:
def __init__(self):
self._table = None
self._conditions = []
self._order = None
self._limit = None
def table(self, table):
self._table = table
return self
def where(self, condition):
self._conditions.append(condition)
return self
def order_by(self, field, direction='ASC'):
self._order = f"{field} {direction}"
return self
def limit(self, limit):
self._limit = limit
return self
def build(self):
sql = f"SELECT * FROM {self._table}"
if self._conditions:
sql += " WHERE " + " AND ".join(self._conditions)
if self._order:
sql += f" ORDER BY {self._order}"
if self._limit:
sql += f" LIMIT {self._limit}"
return sql
# 使用
query = (QueryBuilder()
.table('users')
.where('age > 18')
.where('status = "active"')
.order_by('created_at', 'DESC')
.limit(10)
.build())
# SELECT * FROM users WHERE age > 18 AND status = "active" ORDER BY created_at DESC LIMIT 10
三、结构型模式
3.1 适配器模式(Adapter)
# 将不兼容的接口转换为兼容接口
class OldPaymentSystem:
def process_old_payment(self, amount):
return f"旧系统处理支付:{amount}元"
class NewPaymentSystem:
def pay(self, amount, currency):
return f"新系统处理支付:{amount}{currency}"
class PaymentAdapter:
def __init__(self, old_system):
self.old_system = old_system
def pay(self, amount, currency='CNY'):
return self.old_system.process_old_payment(amount)
# 使用
old_system = OldPaymentSystem()
adapter = PaymentAdapter(old_system)
adapter.pay(100) # 旧系统处理支付:100元
3.2 装饰器模式(Decorator)
# 动态添加功能
def log_decorator(func):
def wrapper(*args, **kwargs):
print(f"调用函数:{func.__name__}")
result = func(*args, **kwargs)
print(f"函数返回:{result}")
return result
return wrapper
def cache_decorator(func):
cache = {}
def wrapper(*args):
if args in cache:
print("从缓存返回")
return cache[args]
result = func(*args)
cache[args] = result
return result
return wrapper
@log_decorator
@cache_decorator
def expensive_calculation(n):
return sum(range(n))
# 使用
expensive_calculation(1000000)
3.3 代理模式(Proxy)
# 控制对象访问
class RealImage:
def __init__(self, filename):
self.filename = filename
self.load_from_disk()
def load_from_disk(self):
print(f"加载图片:{self.filename}")
def display(self):
print(f"显示图片:{self.filename}")
class ProxyImage:
def __init__(self, filename):
self.filename = filename
self.real_image = None
def display(self):
if not self.real_image:
self.real_image = RealImage(self.filename)
self.real_image.display()
# 使用
image = ProxyImage("photo.jpg") # 不立即加载
image.display() # 第一次调用时才加载
四、行为型模式
4.1 观察者模式(Observer)
# 一对多依赖关系,状态变化时通知所有观察者
class EventEmitter:
def __init__(self):
self._listeners = {}
def on(self, event, callback):
if event not in self._listeners:
self._listeners[event] = []
self._listeners[event].append(callback)
def emit(self, event, *args, **kwargs):
if event in self._listeners:
for callback in self._listeners[event]:
callback(*args, **kwargs)
def off(self, event, callback):
if event in self._listeners:
self._listeners[event].remove(callback)
# 使用
emitter = EventEmitter()
emitter.on('user_created', lambda user: print(f"用户已创建:{user}"))
emitter.on('user_created', lambda user: print(f"发送欢迎邮件给:{user}"))
emitter.emit('user_created', '张三')
4.2 策略模式(Strategy)
# 定义算法族,使它们可以互相替换
class PaymentStrategy:
def pay(self, amount):
raise NotImplementedError
class Alipay(PaymentStrategy):
def pay(self, amount):
return f"支付宝支付:{amount}元"
class WechatPay(PaymentStrategy):
def pay(self, amount):
return f"微信支付:{amount}元"
class CreditCard(PaymentStrategy):
def pay(self, amount):
return f"信用卡支付:{amount}元"
class PaymentContext:
def __init__(self, strategy):
self.strategy = strategy
def pay(self, amount):
return self.strategy.pay(amount)
# 使用
context = PaymentContext(Alipay())
context.pay(100) # 支付宝支付:100元
context = PaymentContext(WechatPay())
context.pay(100) # 微信支付:100元
4.3 模板方法模式(Template Method)
# 定义算法骨架,子类实现具体步骤
class DataParser:
def parse(self, filepath):
data = self.read_file(filepath)
parsed = self.parse_data(data)
self.save(parsed)
def read_file(self, filepath):
with open(filepath, 'r') as f:
return f.read()
def parse_data(self, data):
raise NotImplementedError
def save(self, data):
print(f"保存数据:{len(data)}条")
class CSVParser(DataParser):
def parse_data(self, data):
return data.split('\n')
class JSONParser(DataParser):
def parse_data(self, data):
import json
return json.loads(data)
# 使用
parser = CSVParser()
parser.parse('data.csv')
五、设计原则
| 原则 | 说明 | 示例 |
|---|---|---|
| 单一职责 | 一个类只做一件事 | UserService只处理用户逻辑 |
| 开闭原则 | 对扩展开放,对修改关闭 | 用继承/接口扩展功能 |
| 里氏替换 | 子类可以替换父类 | Admin可以替换User |
| 接口隔离 | 接口要小而专 | 分离读写接口 |
| 依赖反转 | 依赖抽象而非具体 | 依赖接口而非实现类 |
学习建议
- 先理解SOLID原则,这是设计模式的基础
- 掌握常用模式:单例、工厂、观察者、策略
- 在实际项目中应用,不要为了用而用
- 理解模式的适用场景,知道什么时候该用
- 不要过度设计,简单优先