GOF设计模式分三大类:
适配器模式(Adapter Pattern)
定义:将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。
解决问题:如何在不修改现有系统的前提下重用没有源码的第三方类库?
使用场景:
组成:
优点:
实现方法一:对象适配器模式
在对象适配器模式(使用频率更高)中,适配器与适配者之间是关联关系。
对象适配器模式结构图
对象适配器模式示例
使用适配器模式来重用算法库中的QuickSort和BinarySearch算法
# 模块adapters.py
"""目标"""
class ScoreOperation:
"""抽象成绩操作类:目标接口"""
def sort(self, scores: list[int]) -> list[int]:
raise NotImplementedError
def search(self, scores: list[int], key: int) -> int:
raise NotImplementedError
"""适配器"""
class OperationAdapter(ScoreOperation):
def __init__(self):
self.sort_obj = QuickSort() # 被适配者对象
self.search_obj = BinarySearch() # 被适配者对象
def sort(self, scores):
return self.sort_obj.quick_sort(scores) # 调用被适配者方法
def search(self, scores, key):
return self.search_obj.binary_search(scores, key) # 调用被适配者方法
"""被适配者"""
class QuickSort:
def quick_sort(self, data: list[int]):
# 快速排序算法(略)
return sorted(data)
class BinarySearch:
def binary_search(self, data: list[int], key: int):
# 二分查找算法(略)
return data.index(key) if key in data else None
引入配置文件config.json
{
"class_name": "OperationAdapter"
}
工具类JsonUtil
# 模块 utils.py
from pathlib import Path
import json
class JsonUtil:
@staticmethod
def get_class_name():
"""读取配置文件,返回配置文件中的配置"""
path = Path("config.json")
contents = path.read_text(encoding="utf-8")
conf = json.loads(contents)
return conf.get("class_name", None)
客户端代码
import adapters
from utils import JsonUtil
class_name = JsonUtil.get_class_name()
klass = getattr(adapters, class_name, None)
if klass is None:
raise ValueError
operation: adapters.ScoreOperation = klass()
scores = [92, 98, 91, 100, 85, 80]
result = operation.sort(scores)
print(f"成绩排序结果:{result}")
print("查找成绩90:", end="")
if operation.search(result, 90):
print("找到成绩90。")
else:
print("没有找到成绩90。")
print("查找成绩92:", end="")
if operation.search(result, 92):
print("找到成绩92。")
else:
print("没有找到成绩92。")
输出结果
成绩排序结果:[80, 85, 91, 92, 98, 100]
查找成绩90:没有找到成绩90。
查找成绩92:找到成绩92。
实现方式二:类适配器模式
实现方式三:双向适配器模式
Django缓存框架设计理念:缓存 API 应该为不同的缓存后端提供一致的接口。Django 提供了多种缓存后端的支持,如本地内存、文件、数据库、Memcached 或 Redis 等。为了能够使用不同的缓存后端,Django 实现了缓存适配器,这些适配器为不同的缓存系统提供了统一的接口。
# 底层缓存API示例
from django.core.cache import cache
# cache.set(key, value, timeout=DEFAULT_TIMEOUT, version=None)
cache.set('my_key', 'hello, world!', 30)
# cache.get(key, default=None, version=None)
cache.get('my_key')
参考资料:Django缓存框架
您正在阅读的是《设计模式Python版》专栏!关注不迷路~