2020 11.23曾宇欣

软件设计模式的概念与意义:

  1. 软件设计模式的概念

    • 软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码经验总结,具有一定的普遍性,可以反复使用。其目的是为了提高代码的可重用性,代码的可读性和代码的可靠性。
  2. 学习设计模式的意义

    • 设计模式的本质是面向对象设计原则的实际运用,是对类的封装性,继承性和多态性以及类的关联关系和组合关系的充分理解。设计模式的优点如下:
      • 可以提高程序员的思维能力、编程能力和设计能力。
      • 使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,缩短软件的开发周期。
      • 使设计的代码可重用性高,可读性强,可靠性高、灵活性好,可维护性高。
  3. 软件设计模式的基本要素软件设计模式使人们可以更加简单方便地复用成功的设计和体系结构,它通常包含以下几个基本要素:模式名称、别名、动机、问题、解决方案、效果、结构、模式角色、合作关系、实现方法、适用性、已知应用、例程、模式扩展和相关模式等,其中最关键的元素包括以下 4 个主要部分。

    1. 模式名称

    每一个模式都有自己的名字,通常用一两个词来描述,可以根据模式的问题、特点、解决方案、功能和效果来命名。模式名称(PatternName)有助于我们理解和记忆该模式,也方便我们来讨论自己的设计。

    2. 问题

    问题(Problem)描述了该模式的应用环境,即何时使用该模式。它解释了设计问题和问题存在的前因后果,以及必须满足的一系列先决条件。

    3. 解决方案

    模式问题的解决方案(Solution)包括设计的组成成分、它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象的 组合)来解决这个问题。

    4. 效果

    描述了模式的应用效果以及使用该模式应该权衡的问题,即模式的优缺点。主要是对时间和空间的衡量,以及该模式对系统的灵活性、扩充性、可移植性的影响,也考虑其实现问题。显式地列出这些效果(Consequence)对理解和评价这些模式有很大的帮助。

设计模式的六大原则

  1. 开闭原则:

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

    • 里氏替换原则主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中蕴含的原理。里氏替换原是继承复用的基础,它反映了基类与子类之间的关系,是对开闭原则的补充,是对实现抽象化的具体步骤的规范

    • 里氏替换原则的作用

      1. 里氏替换原则是实现开闭原则的重要方式之一。
      2. 它克服了继承中重写父类造成的可复用性变差的缺点。
      3. 它是动作正确性的保证。即类的扩展不会给已有的系统引入新的错误,降低了代码出错的可能性。
      4. 加强程序的健壮性,同时变更时可以做到非常好的兼容性,提高程序的维护性、可扩展性,降低需求变更时引入的风险。
    • 里氏替换原则的实现方法

      • 里氏替换原则通俗来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。

      • 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法

      • 子类中可以增加自己特有的方法

      • 当子类的方法重载父类的方法时,方法的前置条件(即方法的输入参数)要比父类的方法更宽松

      • 当子类的方法实现父类的方法时(重写/重载或实现抽象方法),方法的后置条件(即方法的的输出/返回值)要比父类的方法更严格或相等

      //举例里氏替换原则在“企鹅不是鸟”实例中的应用
      //鸟类
      class Bird {
      int flySpeed;
      public void setSpeed(int speed){
      flySpeed = speed;
      }
      public int getFlyTime(int distance){
      return (distance / flyspeed);
      }
      }
      //燕子类
      class Swallow extends Bird{}
      //企鹅类
      class Penguin extends Bird{
      public void setSpeed(int speed)
      {
      flySpeed=0;
      }
      }
      public static void mian(String[] args){
      Bird b1 = new Swallow();
      Bird b2 = new Penguin();
      b1.setSpeed(120);
      b2.setSpeed(120);
      System.out.println("如果飞行300公里:");
      System.out.println("燕子将飞行"+bird1.getFlyTime(300)+"小时.");
      System.out.println("企鹅将飞行"+bird2.getFlyTime(300)+"小时。");
      }

      此程序会报错,企鹅重写了鸟类的setSpeed方法,这违背了里氏替换原则。正确的做法是取消企鹅的继承关系,定义鸟类和企鹅更一般的父类,比如动物类,他们都具有奔跑的能力。

标签

评论

© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1