设计模式-设计原则(SOLID原则)

开放封闭原则

类,模块,函数应该对扩展开放,对修改关闭

里氏替换原则

所有引用基类的地方必须能透明地使用其子类的对象

class BaseMent(object):
	def return_something(self):
		pass

class child(BaseMent):
	def return_something(self):
		pass

def a_fun(c):
	res = c.return_something()
	.....
#a_fun中传入一个对象调用return_something(),保证BaseMent和child中继承的方法的参数和返回值必须一样,
#保证里氏替换原则,不然a_fun中使用返回值进行接下来的逻辑会出错

依赖倒置原则

1、上层模块不应该依赖底层模块,它们都应该依赖于抽象。
2、抽象不应该依赖于细节,细节应该依赖于抽象。
针对接口编程而不是针对实现编程

from abc import ABCMeta,abstractmethod

#这个类就是底层和上层的抽象
#这个就是抽象
class payment(object):
	__metaclass__ =  ABCMeta
	@abstractmethod
	def pay(self,money):
		pass

#这两个支付类就是模拟底层的实现逻辑
#下面是细节
class AliPay(payment):
	def pay(self,money):
		print "支付宝支付%d" % money
		pass

class WeChatPay(payment):
	def pay(self,money):
		pass

#模拟上层调用逻辑
p = AliPay()
p.pay(100)
#抽象不应该依赖于细节,细节应该依赖于抽象

接口隔离原则

使用多个专门的接口,不要使用总接口,即client不应该依赖不需要的接口
举例总接口

from abc import ABCMeta,abstractmethod

class Animal(object):
	__metaclass__ = ABCMeta #抽象类提供的元类
	@abstractmethod
	def walk(self):
		pass

	@abstractmethod
	def swim(self):
		pass

	@abstractmethod
	def fly(self):
		pass

class pig(Animal):
	def walk(self):
		pass

pig = pig()
pig.walk()
#假设猪只会走路,不会飞,但是继承抽象类就要实现所有抽象方法,会报错

在这里插入图片描述
所以不要使用总接口,应该把接口分开,只用专用的接口
修改

from abc import ABCMeta,abstractmethod

class LandAnimal(object):
	__metaclass__ = ABCMeta #抽象类提供的元类
	@abstractmethod
	def walk(self):
		pass

class WaterAnimal(object):
	__metaclass__ = ABCMeta  # 抽象类提供的元类
	@abstractmethod
	def swim(self):
		pass

class SkyAnimal(object):
	__metaclass__ = ABCMeta  # 抽象类提供的元类
	@abstractmethod
	def fly(self):
		pass

class pig(LandAnimal):
	def walk(self):
		pass

单一职责原则

一个类应该只有一个发生变化的原因,人话就是:一个类负责一个职责,参考上面的动物类

你可能感兴趣的:(python,设计模式)