1、什么是设计模式?html
每个模式描述了一个在咱们周围不断重复发生的问题,以及该问题的解决方案的核心。这样你就能一次又一次地使用该方案而没必要作重复劳动。” 每个设计模式系统地命名、解释和评价了面向对象系统中一个重要的和重复出现的设计。 GoF(Gang of Four) 设计模式四个基本要素:模式名称、问题、解决方案、效果
2、设计模式七大原则编程
一、开放封闭原则:一个软件实体如类,模块和函数应该对扩展是开放的,对修改是关闭的。即软件实体应尽可能在不修改原有代码的状况下进行扩展(装饰器)设计模式
二、里氏替换原则:重写父类里面的方法,逻辑可能不同,可是返回的结果参数啥的要同样(全部引用基类的地方必须能透明的使用其子类的对象)ide
三、依赖倒置原则:高层模块不该该依赖低层模块,两者都应该依赖其抽象,要针对接口编程,而不是针对实现编程。(接口类)函数
四、接口隔离原则:使用多个专门的接口,而不使用单一的总接口,即客户端不该该依赖那些它不须要实现的接口post
五、迪米特法则:一个软件实体应当尽量少的与其余实体发生相互做用spa
六、单一职责原则:一个类只负责一项职责(不要存在多于一个致使类变动的缘由,即一个类只负责一项职责)设计
七、合同复用原则:多用组合少用继承3d
一个类重用另外一个类的代码有两种方式代理
- 继承
- 组合
a、下面来讲一下接口隔离原则
#假如说如今有这样的动物类
from abc import abstractmethod,ABCMeta #借助abc模块来实现接口
#接口类就是为了提供标准,约束后面的子类
# class Animal(metaclass=ABCMeta):
# @abstractmethod
# def walk(self):
# pass
#
# @abstractmethod
# def fly(self):
# pass
#
# @abstractmethod
# def swim(self):
# pass
#
# class Frog(Animal):
# '''像是这样定义一个青蛙类,因为接口类的方法都要被实现,而青蛙只会走,没不要要实现其余的方法
# 动物不一样会的功能也会不一样,因此这时候咱们就能够选择用接口隔离原则
# '''
# def walk(self):
# print('青蛙会走')
#
# obj = Frog()
# obj.walk() #会报错
# =====================改进-=================
class AnimalOnLand(metaclass=ABCMeta):
'''在陆地上的动物'''
@abstractmethod
def walk(self):
pass
class AnimalInSky(metaclass=ABCMeta):
'''飞行动物'''
@abstractmethod
def fly(self):
pass
class AnimalInWater(metaclass=ABCMeta):
'''在水里的动物'''
@abstractmethod
def swim(self):
pass
class Tiger(AnimalOnLand):
def walk(self):
print('老虎在地上')
class Frog(AnimalOnLand,AnimalInWater):
def swim(self):
print('青蛙会游')
def walk(self):
print('会跳')
obj = Tiger()
obj.walk()
obj = Frog()
obj.walk()
obj.swim()
接口隔离原则
1 #假如说如今有这样的动物类 2 from abc import abstractmethod,ABCMeta #借助abc模块来实现接口 3 #接口类就是为了提供标准,约束后面的子类 4 5 # class Animal(metaclass=ABCMeta): 6 # @abstractmethod 7 # def walk(self): 8 # pass 9 # 10 # @abstractmethod 11 # def fly(self): 12 # pass 13 # 14 # @abstractmethod 15 # def swim(self): 16 # pass 17 # 18 # class Frog(Animal): 19 # '''像是这样定义一个青蛙类,因为接口类的方法都要被实现,而青蛙只会走,没不要要实现其余的方法 20 # 动物不一样会的功能也会不一样,因此这时候咱们就能够选择用接口隔离原则 21 # ''' 22 # def walk(self): 23 # print('青蛙会走') 24 # 25 # obj = Frog() 26 # obj.walk() #会报错 27 28 29 # =====================改进-================= 30 class AnimalOnLand(metaclass=ABCMeta): 31 '''在陆地上的动物''' 32 @abstractmethod 33 def walk(self): 34 pass 35 36 class AnimalInSky(metaclass=ABCMeta): 37 '''飞行动物''' 38 @abstractmethod 39 def fly(self): 40 pass 41 42 class AnimalInWater(metaclass=ABCMeta): 43 '''在水里的动物''' 44 @abstractmethod 45 def swim(self): 46 pass 47 48 class Tiger(AnimalOnLand): 49 def walk(self): 50 print('老虎在地上') 51 52 class Frog(AnimalOnLand,AnimalInWater): 53 def swim(self): 54 print('青蛙会游') 55 56 def walk(self): 57 print('会跳') 58 59 obj = Tiger() 60 obj.walk() 61 62 obj = Frog() 63 obj.walk() 64 obj.swim()
b、继承和组合
# 合同复用原则:多用组合少用继承
class A:
def test(self):
return '你好啊'
class B(A): #继承
def test(self):
return 123
class C:
def __init__(self):
self.a = A() #组合
self.a.test()
def test(self):
return 789
print(B().test())
print(C().a)
print(C().a.test())
print(C().test())
继承和组合示例
1 # 合同复用原则:多用组合少用继承 2 class A: 3 def test(self): 4 return '你好啊' 5 6 class B(A): #继承 7 def test(self): 8 return 123 9 10 class C: 11 def __init__(self): 12 self.a = A() #组合 13 self.a.test() 14 15 def test(self): 16 return 789 17 18 print(B().test()) 19 20 print(C().a) 21 print(C().a.test()) 22 print(C().test())
3、设计模式分类
建立型模式:
总结建立型模式:
依赖于继承的建立型模式:工厂方法模式
依赖于组合的建立型模式:抽象工厂模式,建立者模式
行为型模式:
结构性模式: