zoukankan      html  css  js  c++  java
  • 设计模式专栏(1)—— 概述

    该专栏是为了让lz更通俗地理解这个高深的设计模式,希望也可以帮助到你。

    专栏目录:

    (1)概述

    (2)创建型模式之抽象工厂模式、工厂方法模式、建造者模式、原型模式、单例模式;

    (3)结构型模式之适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式;

    (4)行为型模式之职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式。

    设计模式(即:使代码编写真正工程化):

    定义:

    设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。(来自百度百科)。

     分类:

    设计模式一共分为三种类型:创建型模式、结构型模式、结构型模式。

    创建型模式:

    主要用于创建对象。主要是想将系统使用的具体类封装起来,隐藏这些类的实例构建和结合的方式。包含的设计模式有抽象工厂模式、工厂方法模式、建造者模式、原型模式、单例模式这5种。

    结构型模式:

    用于处理类或对象的组合,它提供类和对象之间如何更好组合的方式。是从程序的结构上解决模块之间的耦合问题。包含的设计模式有适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式;

    行为型模式:

    用于描述对象是怎样交互和怎样分配职责,不仅要描述对象,还要描述对象之间的通信方式。包含的设计模式有职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式。

    设计模式要满足的几大原则:

    我在讲原则之前,我想先说说耦合和内聚这两个词的概念和理解:

    1.耦合

    对象之间的耦合度指的是对象之间的依赖度,指导使用和维护对象的主要问题是对象之间的多重依赖性。对象之间的耦合越高,维护成本越高。因此对象的设计应使类和构件之间的耦合最小。耦合是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。 

    所以耦合描述的是两个模块之间的关系。

    2.内聚

    内聚(Cohesion)是一个模块内部各成分之间相关联程度的度量。标志一个模块内各个元素彼此结合的紧密程度,它是信息隐蔽和局部化概念的自然扩展。内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系。

    所以内聚描述的是一个模块内部的关系。

    因此一个好的设计应该是低耦合,高内聚。就是同一个模块内的各个元素之间要高度紧密,但是各个模块之间的相互依存度却要不那么紧密。跟自己内部的关系要强大,要少依赖别人。

    1.单一职责原则(SRP)

    顾名思义,单一职责就是说对一个类而言,应该仅有一个引起它变化的原因。

    如果一个类承担的职责过多,就等于把这些职责耦合在一起了。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭受到意想不到的破坏。

    一个模块满足单一职责原则就实现了解耦和增强了内聚性。

    2.开放-关闭原则(OCP)

    定义:软件实体对于扩展是开放的,对于修改是关闭的。

    优点:

    (1)可复用性好:我们可以在软件完成以后,仍然可以对软件进行扩展,加入新的功能,非常灵活。因此,这个软件系统就可以通过不断地增加新的组件,来满足不断变化的需求。
    (2)可维护性好:由于对于已有的软件系统的组件,特别是它的抽象底层不去修改,因此,我们不用担心软件系统中原有组件的稳定性,这就使变化中的软件系统有一定的稳定性和延续性。

    3.依赖倒转原则(DIP)

    定义:A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。B.抽象不应该依赖于具体实现,具体实现应该依赖于抽象。

    简单来说,就是要实现面向接口编程。这样这大大降低了客户程序与实现细节的耦合度,只要抽象不变,客户程序就不需要变化。

    4.接口隔离原则(ISP)

    定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。使用多个专门的接口比使用单一的总接口要好。

    一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。

    简单来说,我们应该满足一个接口负责一种职责,然后类实现的时候就去实现自己的责任接口。

    5.迪米特原则(LKP)——最少知道原则

    定义:一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。

    如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

    6.里氏代换原则(LSP)

    定义:任何基类可以出现的地方子类一定可以出现。

    里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

    7.合成复用原则(CARP)

    定义:在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的。它的设计原则是:要尽量使用合成/聚合,尽量不要使用继承。

    简单来说:就是少用继承,多用聚合。

    后记:下一次就开始正式更新那23个设计模式了,期待吧!!!

     

  • 相关阅读:
    uva 11294 Wedding
    uvalive 4452 The Ministers’ Major Mess
    uvalive 3211 Now Or Later
    uvalive 3713 Astronauts
    uvalive 4288 Cat Vs. Dog
    uvalive 3276 The Great Wall Game
    uva 1411 Ants
    uva 11383 Golden Tiger Claw
    uva 11419 SAM I AM
    uvalive 3415 Guardian Of Decency
  • 原文地址:https://www.cnblogs.com/Gabby/p/6550585.html
Copyright © 2011-2022 走看看