软件设计模式(原则)

类图以及类图之间的关系

  • 类的特性:封装,继承,多态。
  • “可见性”表示该属性对类外的元素是否可见,包括公有(Public)、私有(Private)、受保护(Protected)和朋友(Friendly)4 种,在类图中分别用符号+、-、#、~表示。
  • 类图 : 显示系统中的类,接口,协作以及他们之间的关系和静态结构的一种静态模型,描述软件系统的结构化设计,事系统分析与设计阶段的重要产物。
  • 依赖关系:对象之间的临时关联关系,某个类的方法通过局部变量,方法的参数或者对静态方法的调用来访问另一个类的某些方法完成任务。
  • 关联 :对象之间的引用关系,表示一类对象与另一类对象之间的联系(如师生关系)
  • 聚合关系 :整体与部分之间的关系,has-a关系。成员对象是整体对象的一部分,但是成员对象可以独立于整体对象而存在。(如大学和老师的关系,学校停办,老师依旧存在)
  • 组合关系 : 更强烈的整体与局部之间的关系,是cxmtains -a关系,整体对象控制着部分对象的生命周期,一旦整体对象不存在了,部分对象随之消失。(如头与嘴巴)
  • 泛化关系:对象之间的耦合度最大的关系,是父子关系(继承关系)
  • 实现关系:接口与实现类之间的关系,类实现了接口并实现了其中所有的抽象方法。

开闭原则

软件对外扩展开放,对修改关闭,当应用的需求改变时,在不修改软件实体的源码的前提下,可以扩展功能,满足新需求,使得实体拥有一定的灵活性,稳定性和延续性。

  • 实现:抽象约束,封装变化,通过接口或者抽象类为软件实体定义一个相对稳定的抽象层,将相同的可变因素封装在相同的具体实现类中。
  • 特点:抽象的灵活性好,只要抽象合理,可以保持软件架构基本不变,而软件的易变的细节可以从抽象层的实现类来扩展,当软件需要变化时,只需要根据需求重新派生一个实现类来扩展。
  • 例子:手机或者电脑的桌面主题:所有个性的主题的共有特性封装在一个抽象类中,每个具体的主题实现抽象类增加自己的特性。

里氏替换原则

子类可以扩展父类的功能,但是不能改变父类原有的功能,克服继承中的重写父类造成的可复用性变差的缺点,子类继承父类时,除了添加新的方法,尽量不要重写父类的方法。

  • 如 正方体不是长方体,如果正方体要继承长方体,需要重写其中的方法。应向上封装一个图形类。

依赖倒置原则

核心:面向接口编程,不是面向实现编程。

  • 高层和底层模块要依赖抽象,细节实现要依赖于抽象。细节多变而抽象层稳定,以抽象为基础建立的架构更稳定。
  • 使用抽象层(抽象类或接口)指定规范和契约,不涉及具体操作,实现类去实现抽象类的抽象方法,展现自己的细节。通过面向接口的编程降低类之间的耦合性。
  • 任何类不应在具体类钟产生。

单一功能原则

一个类应该有且仅有一个变化因素,一个类负责一个职责,提高可读性,提高可维护性,将对象解耦,提高内聚性。将类的不同职责分离,封装到不同的类或者模块中。

接口隔离原则

  • 将臃肿庞大的接口拆分成更小的和更具体的接口,为每个类建立自己的专用接口,实现接口隔离,提高类的内聚性,降低耦合度,大小合理而保证系统稳定性,实现类可以使用相应的接口实现需要的方法。

迪米特法则

最少知识原则,只与直接朋友交谈,不跟陌生人说活。即两个软件实体不需要直接通信的条件下,可以通过第三方转发调用,可以降低类之间的耦合度,提高模块的相对独立性,从而提高了类的可复用率和系统的扩展性。

  • “朋友”是指:当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对象存在关联、聚合或组合关系,可以直接访问这些对象的方法。
  • 过度使用迪米特法则会使系统产生大量的中介类,从而增加系统的复杂性,使模块之间的通信效率降低。所以,在釆用迪米特法则时需要反复权衡,确保高内聚和低耦合的同时,保证系统的结构清晰。
    实现
  1. 从依赖者的角度来说,只依赖应该依赖的对象。
  2. 从被依赖者的角度说,只暴露应该暴露的方法。
    实例
    明星通过经纪人 与粉丝和经纪人沟通。

合成复用原则

又叫组合/聚合复用原则,它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。
继承复用

  1. 继承复用破坏了类的封装性。因为继承会将父类的实现细节暴露给子类,父类对子类是透明的,所以这种复用又称为“白箱”复用。
  2. 子类与父类的耦合度高。父类的实现的任何改变都会导致子类的实现发生变化,这不利于类的扩展与维护。
  3. 它限制了复用的灵活性。从父类继承而来的实现是静态的,在编译时已经定义,所以在运行时不可能发生变化。

合成复用

  1. 它维持了类的封装性。因为成分对象的内部细节是新对象看不见的,所以这种复用又称为“黑箱”复用。
  2. 新旧类之间的耦合度低。这种复用所需的依赖较少,新对象存取成分对象的唯一方法是通过成分对象的接口。
  3. 复用的灵活性高。这种复用可以在运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象。
  4. 合成复用原则是通过将已有的对象纳入新对象中,作为新对象的成员对象来实现的,新对象可以调用已有对象的功能,从而达到复用。
    骑车分类例子
    汽车按“动力源”划分可分为汽油汽车、电动汽车等;按“颜色”划分可分为白色汽车、黑色汽车和红色汽车等。
    软件设计模式(原则)_第1张图片

你可能感兴趣的:(软件设计模式)