一、常见结构型设计模式
装饰器模式(Decorator): 无需子类化拓展对象功能
代理模式(Proxy): 把一个对象的操作代理到另一个对象
适配器模式(Adapter): 通过一个间接层适配统一接口
外观模式(Facade): 简化复杂对象的访问问题
享元模式(Flyweight): 通过对象复用(池)改善资源利用,比如连接池
MVC Model-View-Controller: 解耦展示逻辑和业务逻辑
二、代理模式
把一个对象的操作代理另一个对象
- 通过json 模块的 dumps方法 对对象进行json编码,通过json_encode(o) 方式进行代理,间接调用了json.dumps(o)
import json
def json_encode(o):
"""将对象使用json编码"""
return json.dumps(o)
def json_decode(s):
"""将字符串使用json解码"""
return json.loads(s)
d = {'key1': 'value1', 'key2': 'value2'}
encode_res = json_encode(d)
print(encode_res,type(encode_res))
decode_res = json_decode(encode_res)
print(decode_res,type(decode_res))
输出结果:
三、适配器模式
通过一个间接层适配统一接口
class Dog(object):
def __init__(self):
self.name = "Dog"
def bark(self):
return 'woof'
class Cat(object):
def __init__(self):
self.name = 'Cat'
def meow(self):
return 'meow'
class Adapter:
def __init__(self, obj, **adapter_methods):
self.obj = obj
self.__dict__.update(adapter_methods)
def __getattr__(self, attr):
return getattr(self.obj, attr)
objects = []
dog = Dog()
objects.append(Adapter(dog, make_noise=dog.bark))
cat = Cat()
objects.append(Adapter(cat, make_noise=cat.meow))
for obj in objects:
print(f"{obj.name} goes {obj.make_noise()}")
输出结果: