• 设计模式的分类和六大原则


    设计模式的分类和六大原则 

    设计模式的分类

    总的来说,设计模式分位三大类:

    1. 创建型模式(5种)
      工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
    2. 结构型模式(7种)
      适配器模式、装饰器模式、代理模式、外观模式(门面模式)、桥接模式、组合模式、享元模式
    3. 行为型模式(11种)
      策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

    六大原则

    总原则:开闭原则

    定义:一个软件实体应该对扩展开放,对修改关闭。

    当一个软件实体需要扩展的时候,不要去修改原有的代码,而是去扩展原有的代码。
    开闭原则是最基础的一个原则,六大原则都是开闭原则的具体形态。
    采用开闭原则的原因:

    1. 避免测试复杂化:
      通过扩展实现变化,测试只需要对新增类进行单元测试即可,只需要保证新类提供的方法正确就行。

    2. 提高代码复用性:
      避免以后为了修改一个微小的缺陷或增加新功能,却要在整个项目中到处查找相关的代码逐一修改。

    3. 提高可维护性:
      开发新功能时,扩展一个类往往比修改一个类更容易。

    1. 单一职责原则

    定义:有且仅有一个原因引起类的变更

    优点:

    1. 类的复杂性降低
    2. 可读性提高
    3. 易维护
    4. 修改类引起的风险降低

    临界点:

    1. 过度的划分会使类剧增,增加系统的复杂度

    2. 里氏代换原则

    定义:所有引用基类的地方必须能透明地使用其子类的对象

    优点:

    1. 提高代码的重用性
    2. 提高代码的可拓展性
    3. 提高项目的开放性

    缺点:

    1. 记成是入侵式的,只要继承,就有父类的属性和方法
    2. 降低代码灵活性,子类多了父类的约束
    3. 增强耦合性,父类的常量/变量/方法改动时,必须考虑子类的修改

    四层含义:

    1. 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
    2. 子类中可以增加自己特有的方法。
    3. 当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
    4. 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

    3. 依赖倒转原则

    定义:

    1. 高层模块不应该依赖低层模块,两者都要依赖其抽象(模块间的依赖通过抽象产生,实现类不直接发生依赖)
    2. 抽象不应该依赖细节(接口或者抽象类不依赖实现类)
    3. 细节可以依赖抽象(实现类依赖接口或抽象类)

    处理:

    1. 每个类尽量都有接口或者抽象类
    2. 变量的表面类型尽量是接口或者抽象类
    3. 任何类都不应该从具体类派生
    4. 尽量不要复写基类已实现的方法
    5. 结合里氏替换原则使用

    4. 接口隔离原则

    定义:客户端不应该依赖不需要的接口,类之间的依赖关系应该建立在最小的接口上

    四层含义:

    1. 接口尽量小,不要出现臃肿的接口
    2. 接口要高内聚
    3. 只提供访问者需要的方法,每个接口中不存在子类用不到却必须要实现的内容,可以将接口拆分
    4. 接口设计限度:设计粒度越小系统越灵活,结构会越复杂,可维护性降低

    处理:

    1. 一个接口只服务一个子模块或者业务逻辑
    2. 尽量压缩接口内的方法,保证都是有用的,避免臃肿
    3. 已被污染的接口尽量去修改,若变更风险大,采用适配器模式转化处理
    4. 深入了解业务逻辑

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

    定义:一个对象应该对其他对象有最小的了解(低耦合)

    含义:

    1. 方法尽量不引入类中不存在的对象
    2. 尽量不要暴露过多public方法和非晶态public变量,尽量内敛
    3. 如果一个方法放在本类中,既不增加类间的关系,也不对本类产生负面影响,就可放置在本类中

    总结:

    核心观念就是类间解耦,低耦合。其负面影响就是产生了大量的中转或者跳转类,导致系统复杂性提高,也为维护带来了难度。需要反复权衡,既做到结构清晰,又要高内聚低耦合。
    如果一个类需要跳转两次以上才能访问到另一个类,就需要想办法重构了。

    6. 合成复用原则

    定义:是在一个新的对象里面使用一些已有的对象,使其成为新对象的一部分。新对象通过委派达到复用已有功能的效果。

    优点:

    使用对象的合成/聚合将有助于保持每个类被封装,并被集中在单个任务上。这样类和集成层次会保持较小规模,并且不太可能增长为不可控制的庞然大物

    缺点:

    通过这种方式复用建造的系统会有较多的对象需要管理;为了能将多个不同的对象作为组合块来使用,必须仔细地对接口进行定义

    简单地说:尽量首先使用合成/聚合的方式,而不是使用继承

  • 相关阅读:
    关于将so 打包入APK的问题
    求 在独立service 中 调用contentprovider的方法
    ndk 环境下 c版 md5
    请教大牛们一个问题
    编写 service 与导出 jar 时注意的问题
    引入已编译好的动态库
    PHP 日期格式说明
    Ocaml 插件
    【转】简单至极的 PHP 缓存类
    PHP mysqlnd cannot connect to MySQL 4.1+ using old authentication
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/15862259.html
Copyright © 2020-2023  润新知