P1 设计模式介绍 1.1 面向对象
- 三大特性:封装、继承、多态
- 接口:若干抽象方法的集合
- python 抽象方法的实现
定义抽象方法
class Payment1:
def pay(self, money):
raise NotImplementedError
class Alipay1(Payment1):
def pay(self, money):
print('支付宝1支付%s'%money)
p = Alipay1()
p.pay(100)
from abc import ABCMeta, abstractmethod
class Payment2(metaclass=ABCMeta):
@abstractmethod
def pay(self, money):
pass
class Alipay2(Payment2):
def pay(self, money):
print('支付宝2支付%s'%money)
p = Alipay2()
p.pay(100)
1.2 面向对象设计原则
1.2.1 简介
1. 程序中的模块分类
抽象模块-》底层模块-》高层模块
抽象模块:就是抽象接口
底层模块:定义的父类
高层模块:定义的字类
1.2.2 面向对象设计SOLID原则
-
开放封闭原则:对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展 -
里氏替换原则:所有引用父类的地方必须能透明地使用其子类的的对象 里氏替换原则(Liskov Substitution Principle,LSP)由麻省理工学院计算机科学实验室的里斯科夫(Liskov)
女士在 1987 年的“面向对象技术的高峰会议”(OOPSLA)上发表的一篇文章《数据抽象和层次》
(Data Abstraction and Hierarchy)里提出来的,她提出:继承必须确保超类所拥有的性质在子类中仍然成立
(Inheritance should ensure that any property proved about supertype objects also holds for
subtype objects)。
class Person:
def show_name(slef, name):
print("报自己的名字")
return 1
class User(Person):
def show_name(slef, name):
xxx("处理手段1")
xxx("处理手段2")
print("报自己的名字")
xxx("处理手段3")
return 1
-
依赖倒置原则 高层模块不应该依赖底层模块,都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现编程。 from abc import ABCMeta, abstractmethod
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self, money)->str:
pass
class Alipay(Payment):
def pay(self, money):
内部逻辑
return str
-
接口隔离原则 使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。 from abc import ABCMeta, abstractmethod
class Animal(metaclass=ABCMeta):
@abstractmethod
def walk(self):
pass
@abstractmethod
def swim(self):
pass
@abstractmethod
def fly(self):
pass
class Tiger(Animal):
def walk(self):
print("老虎走路")
解决方法:要把动物这个接口拆开分别是,陆地动物、水里动物、飞行动物,即可,
那么青蛙会游泳也会走路,这个时候就可以使用多继承了
让青蛙继承两个类(水里动物和陆地动物)
-
单一职责原则 不要存在多于一个导致类变更的原因,通俗的说,即一个类只负责一项职责。 1.2 设计模式分类
1. 创建型模式
[ ] 工厂方法模式
[ ] 抽象工厂模式
[ ] 创建者模式
[ ] 原型模式
[ ] 单例模式
2. 结构型模式
[ ] 设配器模式
[ ] 桥模式
[ ] 组合模式
[ ] 装饰模式
[ ] 外观模式
[ ] 享元模式
[ ] 代理模式
3. 行为型模式
[ ] 解释器模式
[ ] 责任链模式
[ ] 命令模式
[ ] 迭代器模式
[ ] 中介者模式
[ ] 备忘录模式
[ ] 观察者模式
[ ] 状态模式
[ ] 策略模式
[ ] 访问者模式
[ ] 模板方法模式
|