设计模式

七大原则

开闭原则

软件实体应当对扩展开放,对修改关闭

里氏替换原则

  • 1.子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法
  • 2.子类中可以增加自己特有的方法
  • 3.当子类的方法重载父类的方法时,方法的前置条件(即方法的输入参数)要比父类的方法更宽松
  • 4.当子类的方法实现父类的方法时(重写/重载或实现抽象方法),方法的后置条件(即方法的的输出/返回值)要比父类的方法更严格或相等

依赖倒置原则

  • 1.每个类尽量提供接口或抽象类,或者两者都具备。
  • 2.变量的声明类型尽量是接口或者是抽象类。
  • 3.任何类都不应该从具体类派生。
  • 4.使用继承时尽量遵循里氏替换原则。

单一职责原则

  • 单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分
  • 单一职责原则的核心就是控制类的粒度大小、将对象解耦、提高其内聚性,降低类的复杂度。一个类只负责一项职责,其逻辑肯定要比负责多项职责简单得多。

迪米特原则

如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。

合成复用原则

它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。

接口隔离原则

要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法。

23种设计模式

按照架构分为3种

  • 1.创建型模式
  • 2.结构型模式
  • 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))

观察者模式

迭代器模式

代理模式

工厂模式

分享到