初窥设计模式

       毕业一个月了,作为一名半路出家的程序员,深感基础知识的薄弱,现在是时候履行诺言,一步一步地完成自己学习清单上的所有计划了。话不多说,就从设计模式开始吧。

    设计模式简介

      1.设计模式是许多软件开发者在长时间的开发生涯中对面临的常见问题的解决方案的经验总结,代表了一种最佳实践

      2.使用设计模式是为了更好的复用代码,让代码更好的被他人理解,保证代码的可靠性。同时也保证了代码一定的规范性

      3.每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题以及该问题的核心解决方案,在项目中合理的运用设计模式可以解决许多问题,这也是设计模式大受欢迎的原因所在。但在使用方面主要取决于一个程序员的经验。

   设计模式的两大核心原理

       1.对接口编程而不是对实现编程

       2.优先使用对象组合而不是继承

     组合对象和继承的区别

      面向对象系统中功能复用的两种最常用技术是类继承和对象组合(object composition)。正如我们已解释过的,类继承允许你根据其他类的实现来定义一个类的实现。这种通过生成子类的复用通常被称为白箱复用(white-box reuse)。术语“白箱”是相对可视性而言:在继承方式中,父类的内部细节对子类可见。

  对象组合是类继承之外的另一种复用选择。新的更复杂的功能可以通过组装或组合对象来获得(将其他对象作为新对象的属性出现)。对象组合要求被组合的对象具有良好定义的接口。这种复用风格被称为黑箱复用(black-box reuse),因为对象的内部细节是不可见的。对象只以“黑箱”的形式出现。

        继承和组合各有优缺点。类继承是在编译时刻静态定义的,且可直接使用,因为程序设计语言直接支持类继承。类继承可以较方便地改变被复用的实现。当一个子类重定义一些而不是全部操作时,它也能影响它所继承的操作,只要在这些操作中调用了被重定义的操作。

        但是类继承也有一些不足之处。首先,因为继承在编译时刻就定义了,所以无法在运行时刻改变从父类继承的实现。更糟的是,父类通常至少定义了部分子类的具体表示。因为继承对子类揭示了其父类的实现细节,所以继承常被认为“破坏了封装性” 。子类中的实现与它的父类有如此紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当你需要复用子类时,实现上的依赖性就会产生一些问题。如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。一个可用的解决方法就是只继承抽象类,因为抽象类通常提供较少的实现。

        对象组合是通过获得对其他对象的引用而在运行时刻动态定义的。组合要求对象遵守彼此的接口约定,进而要求更仔细地定义接口,而这些接口并不妨碍你将一个对象和其他对象一起使用。这还会产生良好的结果:因为对象只能通过接口访问,所以我们并不破坏封装性;只要类型一致,运行时刻还可以用一个对象来替代另一个对象;更进一步,因为对象的实现是基于接口写的,所以实现上存在较少的依赖关系。

  对象组合对系统设计还有另一个作用,即优先使用对象组合有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。另一方面,基于对象组合的设计会有更多的对象 (而有较少的类),且系统的行为将依赖于对象间的关系而不是被定义在某个类中。

      设计模式的分类

         1.创建型模式:这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活

         2.结构型模式:这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式

         3.行为型模式:这些设计模式特别关注对象之间的通信。

         4.J2EE模式:这些设计模式特别关注表示层。这些模式是由 Sun Java Center 鉴定的。 

      设计模式六大原则      

       1、开闭原则(Open Close Principle)

       开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。

      2、里氏代换原则(Liskov Substitution Principle)

      里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

      3、依赖倒转原则(Dependence Inversion Principle)

      这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。

      4、接口隔离原则(Interface Segregation Principle)

      这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。

     5、迪米特法则,又称最少知道原则(Demeter Principle)

      最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。

    6、合成复用原则(Composite Reuse Principle)

     合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。

     结语

       以上概念参考与菜鸟教程:http://www.runoob.com/design-pattern/design-pattern-intro.html,主要是让自己对设计模式有一个基本概念,不至于处于一个懵懂的状态,不利于后面的学习,毕竟如果连一个要学的东西的最基本的概念都说不清又怎么可以称得上是学习呢?

猜你喜欢

转载自blog.csdn.net/weixin_40655220/article/details/81517206