七大原则
软件实体应当对扩展开放,对修改关闭
- 1.子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法
- 2.子类中可以增加自己特有的方法
- 3.当子类的方法重载父类的方法时,方法的前置条件(即方法的输入参数)要比父类的方法更宽松
- 4.当子类的方法实现父类的方法时(重写/重载或实现抽象方法),方法的后置条件(即方法的的输出/返回值)要比父类的方法更严格或相等
- 1.每个类尽量提供接口或抽象类,或者两者都具备。
- 2.变量的声明类型尽量是接口或者是抽象类。
- 3.任何类都不应该从具体类派生。
- 4.使用继承时尽量遵循里氏替换原则。
- 单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分
- 单一职责原则的核心就是控制类的粒度大小、将对象解耦、提高其内聚性,降低类的复杂度。一个类只负责一项职责,其逻辑肯定要比负责多项职责简单得多。
如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。
要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法。
23种设计模式
按照架构分为3种
单例模式
1 2 3 4 5 6 7 8 9
| # 简单单例 import threading class Single: lock = threading.Lock() def __new__(cls, *args, **kwargs): with Single.lock: if not hasattr(cls, '_instance'): cls._instance = super().__new__(cls, *args, **kwargs) return cls._instance
|
装饰器模式AOP
装饰器实现日志
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| from functools import wraps import time
def log(func): @wraps(func) def decorator(*args, **kwargs): with open(func.__name__, 'wb') as f: current_time = time.time() res = func(*args, **kwargs) cost_time = time.time() - current_time f.write('执行{}函数,花费了{}s'.format(func.__name__, cost_time).encode('utf-8')) return res return decorator @log def task(*args, **kwargs): time.sleep(2) print(args) print(kwargs) return 'axiba'
print(task(123, 5, 6))
|
装饰器实现缓存
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| from functools import wraps import time
def cache(func): cache = {} def decorator(n): if n in cache: return cache[n] else: cache[n] = func(n) return cache[n] return decorator
@cache def fib(n): if n <= 1: return n return fib(n-1) + fib(n-2)
print(fib(100))
|
观察者模式
迭代器模式
代理模式
工厂模式