aoi学院

Aisaka's Blog, School of Aoi, Aisaka University

开闭原则——面向对象设计原则

在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。

  1. 开闭原则
  2. 里氏替换原则
  3. 依赖倒置原则
  4. 单一职责原则
  5. 接口隔离原则
  6. 迪米特法则
  7. 合成复用原则

开闭原则的定义

开闭原则(Open Closed Principle,OCP)由勃兰特·梅耶(Bertrand Meyer)提出,他在 1988 年的著作《面向对象软件构造》(Object Oriented Software Construction)中提出:软件实体应当对扩展开放,对修改关闭(Software entities should be open for extension,but closed for modification),这就是开闭原则的经典定义。

这里的软件实体包括以下几个部分:

  1. 项目中划分出的模块
  2. 类与接口
  3. 方法

开闭原则的含义是:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。

阅读全文 »

设计模式不是为每个人准备的,而是基于业务来选择设计模式,需要时就能想到它。要明白一点,技术永远为业务服务,技术只是满足业务需要的一个工具。我们需要掌握每种设计模式的应用场景、特征、优缺点,以及每种设计模式的关联关系,这样就能够很好地满足日常业务的需要。

许多设计模式的功能类似,界限不是特别清楚(为了能让大家更好的理解,后面会列出类似功能设计模式之间的对比)。大家不要疑惑,设计模式不是为了特定场景而生的,而是为了让大家可以更好和更快地开发。

设计模式只是实现了七大设计原则的具体方式,套用太多设计模式只会陷入模式套路陷阱,最后代码写的凌乱不堪。

在实际工作中很少会规定必须使用哪种设计模式,这样只会限制别人。不能为了使用设计模式而去做架构,而是有了做架构的需求后,发现它符合某一类设计模式的结构,在将两者结合。

设计模式要活学活用,不要生搬硬套。想要游刃有余地使用设计模式,需要打下牢固的程序设计语言基础、夯实自己的编程思想、积累大量的时间经验、提高开发能力。目的都是让程序低耦合,高复用,高内聚,易扩展,易维护。


阅读全文 »

分类箭头特征记忆技巧
箭头方向从子类指向父类1. 定义子类需要通过 extends 关键字指定父类; 2. 子类一定是知道父类定义的,但父类并不知道子类的定义; 3. 只有知道对方信息时才能指向对方; 4. 箭头的方向是从子类指向父类
继承/实现用线条连接两个类;空心三角箭头表示继承或实现实线表示继承,是is-a的关系,表示扩展,不虚,很结实
虚线表示实现,虚线代表“虚”无实体
关联/依赖用线条连接两个类;普通箭头表示关联或依赖1. 虚线表示依赖关系:临时用一下,若即若离,虚无缥缈,若有若无; 2. 表示一种使用关系,一个类需要借助另一个类来实现功能; 3. 一般一个类将另一个类作为参数使用,或作为返回值
1. 实线表示关联关系:关系稳定,实打实的关系,“铁哥们”; 2. 表示一个类对象和另一个类对象有关联; 3. 通常一个类中有另一个类对象作为属性
组合/聚合用菱形表示:像一个盛东西的器皿(如盘子)1. 聚合:空心菱形,代表空器皿里可以放很多相同的东西,聚集在一起(箭头方向所指的类); 2. 整体和局部的关系,两者有独立的生命周期,是 has-a 的关系; 3. 弱关系,消极的词:弱-空
1. 组合:实心菱形,代表器皿里已经有实体结构的存在,生死与共; 2、 整体与局部的关系,和聚合关系对比,关系更加强烈,两者具有相同的生命周期,contains-a 的关系 3. 强关系,积极的词;强-满
阅读全文 »

在 UML 2.0 的 13 种图中,类图(Class Diagrams)是使用频率最高的 UML 图之一。类图描述系统中的类,以及各个类之间的关系的静态视图,能够让我们在正确编写代码之前对系统有一个全面的认识。类图是一种模型类型,确切地说,是一种静态模型类型。类图表示类、接口和它们之间的协作关系,用于系统设计阶段。


阅读全文 »

UML统一建模语言是什么

UML(Unified Modeling Language,统一建模语言)是用来设计软件蓝图的可视化建模语言,是一种为面向对象系统的产品进行说明、可视化和编制文档的标准语言,独立于任何一种具体的程序设计语言。

1997 年 UML 被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际标准。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。


阅读全文 »

GoF 的 23 种设计模式的分类和功能

设计模式有两种分类方法,即根据模式的目的来分和根据模式的作用的范围来分。

  1. 根据目的来分

    根据模式是用来完成什么工作来划分,这种方式可分为创建型模式、结构型模式和行为型模式 3 种。

    1. 创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。GoF 中提供了单例、原型、工厂方法、抽象工厂、建造者等 5 种创建型模式。
    2. 结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,GoF 中提供了代理、适配器、桥接、装饰、外观、享元、组合等 7 种结构型模式。
    3. 行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。GoF 中提供了模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器等 11 种行为型模式。
  2. 根据作用范围来分

    根据模式是主要用于类上还是主要用于对象上来分,这种方式可分为类模式和对象模式两种。

    1. 类模式:用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻便确定下来了。GoF中的工厂方法、(类)适配器、模板方法、解释器属于该模式。
    2. 对象模式:用于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运行时刻是可以变化的,更具动态性。GoF 中除了以上 4 种,其他的都是对象模式。
阅读全文 »

软件设计模式的产生背景

“设计模式”这个术语最初并不是出现在软件设计中,而是被用于建筑领域的设计中。

1977 年,美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫·亚历山大(Christopher Alexander)在他的著作《建筑模式语言:城镇、建筑、构造(A Pattern Language: Towns Building Construction)中描述了一些常见的建筑设计问题,并提出了 253 种关于对城镇、邻里、住宅、花园和房间等进行设计的基本模式。

1979 年他的另一部经典著作《建筑的永恒之道》(The Timeless Way of Building)进一步强化了设计模式的思想,为后来的建筑设计指明了方向。

1987 年,肯特·贝克(Kent Beck)和沃德·坎宁安(Ward Cunningham)首先将克里斯托夫·亚历山大的模式思想应用在 Smalltalk 中的图形用户接口的生成中,但没有引起软件界的关注。

直到 1990 年,软件工程界才开始研讨设计模式的话题,后来召开了多次关于设计模式的研讨会。

1995 年,艾瑞克·伽马(ErichGamma)、理査德·海尔姆(Richard Helm)、拉尔夫·约翰森(Ralph Johnson)、约翰·威利斯迪斯(John Vlissides)等 4 位作者合作出版了《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software)一书,在本教程中收录了 23 个设计模式,这是设计模式领域里程碑的事件,导致了软件设计模式的突破。这 4 位作者在软件开发领域里也以他们的“四人组”(Gang of Four,GoF)匿名著称。

直到今天,狭义的设计模式还是本文所介绍的 23 种经典设计模式。


阅读全文 »

背景

作为一个程序员,拥有一个个人博客,是沉淀知识,打造影响力的必备要素。但是因为现在的写作平台实在是太多了,在选择一个适合自己的博客的时候,就像买东西一样,总是挑花了眼。每个博客平台各有各的优点和不足,这里就我自己的一些想法和性格,对目前市面上的写作平台做一个筛选,选出最适合自己的博客平台。


阅读全文 »

余弦相似度

即计算两个向量间的夹角的余弦值,计算公式如下:

根据线性代数的知识,余弦是通过点积和模长来计算。
在向量中,模长需要L2范数计算。

余弦相似度越接近1,证明越相似(cosθ->1,θ->0)。所以,余弦相似度的取值范围是[-1, 1]。

阅读全文 »