设计模式 【第一章】设计模式

一、什么是设计模式?

每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样你就能一次又一次地使用该方案而不必做重复劳动。”

每一个设计模式系统地命名、解释和评价了面向对象系统中一个重要的和重复出现的设计。

GoF(Gang of Four)

设计模式四个基本要素:模式名称、问题、解决方案、效果

二、设计模式七大原则

1、开放封闭原则:一个软件实体如类,模块和函数应该对扩展是开放的,对修改是关闭的。即软件实体应尽量在不修改原有代码的情况下进行扩展(装饰器)

2、里氏替换原则:重写父类里面的方法,逻辑可能不一样,但是返回的结果参数啥的要一样(所有引用基类的地方必须能透明的使用其子类的对象)

3、依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象,要针对接口编程,而不是针对实现编程。(接口类)

4、接口隔离原则:使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要实现的接口

5、迪米特法则:一个软件实体应当尽可能少的与其他实体发生相互作用

6、单一职责原则:一个类只负责一项职责(不要存在多于一个导致类变更的原因,即一个类只负责一项职责)

7、合同复用原则:多用组合少用继承

       一个类重用另一个类的代码有两种方式

  •  继承
  •  组合

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())
复制代码

三、设计模式分类

创建型模式:

总结创建型模式:

  依赖于继承的创建型模式:工厂方法模式

  依赖于组合的创建型模式:抽象工厂模式,创建者模式

行为型模式:

结构性模式:

 

 

 
 

 

posted @ 2018-03-05 20:38  小河马的博客  阅读(302)  评论(0编辑  收藏  举报