| 软件代码开发技术 | https://edu.cnblogs.com/campus/gdgy/2021Softwarecodedevelopmenttechnology/ |
| ----------------- |--------------- |
| 作业要求| https://edu.cnblogs.com/campus/gdgy/2021Softwarecodedevelopmenttechnology/homework/11833 |
| 作业目标 | 谈谈看过设计模式方面内容的心得体会 |
设计原则
为什么要提倡“Design Pattern呢?根本原因是为了代码复用,增加可维护性。那么怎么才能实现代码复用呢?面向对象有几个原则:开闭原则、
里氏代换原则、依赖倒转原则、接口隔离原则、合成/聚合复用原则、最小知识原则。开闭原则具有理想主义的色彩,它是面向对象设计的终极目
标。其他几条,则可以看做是开闭原则的实现方法。设计模式就是实现了这些原则,从而达到了代码复用、增加可维护性的目的。
- 开闭原则:模块应对扩展开放,而对修改关闭。模块应尽量在不修改原(是“原”,指原来的代码)代码的情况下进行扩展。
- 里氏代换原则:如果调用的是父类的话,那么换成子类也完全可以运行。
可以说:里氏代换原则是继承复用的一个基础。 - 依赖倒转原则:抽象不应该依赖于细节,细节应当依赖于抽象。要针对接口编程,而不是针对实现编程。传递参数,或者在组合聚合关系中,
尽量引用层次高的类。 - 合成/聚合复用原则:
合成/聚合复用原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能
的目的。它的设计原则是:要尽量使用合成/聚合,尽量不要使用继承。就是说要少用继承,多用合成关系来实现。 - 接口隔离原则:
定制服务的例子,每一个接口应该是一种角色,不多不少,不干不该干的事,该干的事都要干。
6.最少知识原则:一个对象应对其他对象有尽可能少的了解。
下面是几种设计模式python的实现。
1.单例模式:
'''
实现__new__方法,然后将类的一个实例绑定到类变量_instance上;
如果cls._instance为None,则说明该类还没有被实例化过,new一个
该类的实例,并返回;如果cls._instance不为None,直接返回_instance
'''
class Singleton(object):
def __init__(self):
pass
def __new__(cls, *args, **kwargs):
if not hasattr(Singleton, "_instance"):
Singleton._instance = object.__new__(cls)
return Singleton._instance
obj1 = Singleton()
obj2 = Singleton()
print(obj1 is obj2)
2.工厂模式:
class Person:
def __init__(self):
self.name = None
self.gender = None
def getName(self):
return self.name
def getGender(self):
return self.gender
class Male(Person):
def __init__(self, name: str):
super().__init__()
print("Hello Mr." + name)
class Female(Person):
def __init__(self, name: str):
super().__init__()
print("Hello Miss." + name)
class Factory:
def getPerson(self, name: str, gender: str):
if 'M' == gender:
return Male(name)
elif 'F' == gender:
return Female(name)
factory = Factory()
person = factory.getPerson("Chetan", "M")
3.适配器模式:
# 客户希望调用的类(但它的request客户不想用)
class Target(object):
def request(self):
print("普通请求")
# 客户希望的一个接口
class Adaptee(object):
def specific_request(self):
print("特殊请求")
# 利用继承和重载使得构造出客户希望的类和希望接口的组合
class Adapter(Target):
def __init__(self):
self.adaptee = Adaptee()
def request(self):
self.adaptee.specific_request()
target = Adapter()
target.request()