如何避免过度设计,正确地使用设计模式?

计算机是为了让人们变轻松而承担现实世界中一部分工作的机器,但现实世界与软件之间存在着很大的沟壑,为了填补这个沟壑,我们需要进行3个阶段的工作,即「业务分析」、「需求定义」、「设计」,而使用UML的建模就是顺利推进这些工作的技术——这便是使用设计模式的目的 。
在谈如何使用设计模式之前,人邮君先带大家来弄清楚,什么是面向对象 。
什么是面向对象简单说在程序中一切都是对象 。对象即为人对各种具体物体抽象后的一个概念,人们每天都要接触各种各样的对象,如手机就是一个对象,汽车是一个对象,汽车轮胎也是一个对象 。
面向对象是一种自上而下的设计,先设计组件再完成拼装 。比如,我们呀先造轮胎,造发动机这些汽车零件,最后再拼装成汽车 。这就是面向对象编程 。
面向对象的设计离不开设计模式,使用设计模式可以重构整体架构,提高代码复用性,较少冗余 。
设计模式三大特性、六大原则、23种模式听起来很高大上,实际上,在我们生活中和面向对象编程中,你肯定不知不觉的已经使用过很多设计模式 。比如某村大喇叭广播了,谁谁家狗丢了,全体村民监听这次广播,会对自己感兴趣的消息做出对应的反应,如果不感兴趣直接忽略 。这就是我们说的监听者模式 。
在使用设计模式时,可以通过了解三大特性、六大原则与23种模式,来帮助大家找到正确使用设计模式的根本逻辑 。

如何避免过度设计,正确地使用设计模式?

文章插图
 
一、三大特性封装:把数据和函数封装到一个类里,体现类内和类外 。
继承:由于有了封装,需要通过继承在类之间复用代码 。
多态:Python本身是一门多态语言,因此不需去处理多态的问题 。JAVA中则会区分虚类和普通类 。
因此这三个特性是一个递进的关系 。
二、六大原则
  • 开闭原则(Open Close Principle)
开闭原则就是说对扩展开放,对修改关闭 。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果 。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级 。想要达到这样的效果,我们需要使用接口和抽象类,这在后面的几个原则里,也有提到,比如里氏代换原则,依赖倒转原则等 。
  • 里氏代换原则(Liskov Substitution Principle)
这是面向对象设计的基本原则之一 。里氏代换原则中谈到,任何基类可以出现的地方,子类一定可以出现 。LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为 。这条原则可以理解为,对“开-闭”原则的补充,实现“开-闭”原则的关键步骤是抽象化,而基类与子类的继承关系就是抽象化的具体实现 。
  • 依赖倒转原则(Dependence Inversion Principle)
这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体 。
  • 接口隔离原则(Interface Segregation Principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好 。这还是一个降低类之间的耦合度的意思,从这儿我们可以看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便,记住:降低依赖,降低耦合 。
  • 迪米特法则(最少知道原则)(Demeter Principle)
为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立 。
  • 合成复用原则(Composite Reuse Principle)
原则是尽量使用合成/聚合的方式,而不是使用继承 。
三、23种设计模式1.策略模式-Strategy 它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户 。
2.装饰模式-Decorator 动态的给一个对象添加有一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活 。
3.代理模式-Proxy 为其他对象提供一种代理以控制对这个对象的访问 。
4.工厂方法模式-Factory method 定义一个拥有创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类 。
5.原型模式-Prototype 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 。
6.模板方式模式-Template method 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 。


推荐阅读