项目
博客
归档
资源链接
关于我
项目
博客
归档
资源链接
关于我
设计的七大原则及UML介绍
2020-11-12
·
softbabet博主
·
原创
·
集合
·
本文共 395个字,预计阅读需要 2分钟。
## 介绍 7大原则:**开闭原则,依赖倒置原则,单一职责原则,接口隔离原则, 迪米特法则,里氏代替原则,合成/复用原则** 设计模式分类: 创建型模式:工厂方法模式,抽象工厂模式,建造者模式。单例模式,原型模式 结构模式:适配器模式,装饰者模式,代理模式,外观模式,桥接模式,组合模式,享元模式 行为模式:策略模式,观察者模式,责任链模式,备忘录模式,模板方法模式,迭代器模式,中介者模式,命令模式,访问者模式,解释器模式,状态模式 ## UML类图及时序图 定义:统一建模语言(unified modeling language),非专利的第三代加密和规约语言。 特定:是一种开放的方法。用于说明,可视化,构建和编写一个正在开发面向对象的,软件密集系统的制品的开放方法。展现了一系列最佳工厂实践,这些最佳实践在对大规模复杂系统进行建模方面,特别是软件架构层次已经被验证有效。 UML2.2分类: 结构式图形:强调系统式的建模 分类:静态图(类图,对象图,包图),实现图(组件图,部署图),剖面图,复合结构图 行为式图形:强调系统模型中触发的事件 分类:活动图,状态图,用例图 交互式图形:属于行为式图形子集合,强调系统模型中资料流程 分类:通讯图,交互概述图,时序图,时间图 #### UML类图 Class Diagram,用于表示类,接口,实例等之间相互的静态关系。类图中并不只是类。 UML箭头方向:从子类指向父类:通过extends,子类一定知道父类定义,但是父类不一定知道子类定义,**只有知道对方信息才能指向对方。空闲三角箭头:继承或者实现** UML线(有箭头):**实线- 继承,虚线-实现** UML线(无箭头):**实线- 关联,虚线-依赖** 线起始点:**空心菱形 - 聚合,实现菱形 - 组合** 常见数组表达及含义,假设有A类和B类,数组标记在A类侧: 0..1: 0个或者1个实例 0..*: 0个或者多个实例 1..1: 1个实例 1 只能有一个实例 1..*: 至少有一个实例 #### 时序图 Sequence Diagram,是显示对象之间交互的图,这些对象是按时间顺序排列的。 建模包含的元素:对象(Actor),生命线(Lifeline),控制焦点(Focus of control),消息(Message)等  #### 类的表示 第一行:类的名字,抽象类用斜体表示,接口要加
第二行:类的属性,访问权限:+(最大public),-(最小private),#(protected),~或者什么都不加(default) 第三行:类的行为,斜体 - 抽象方法, 返回值表示 -- :返回值类型  #### 时序图的表示  ## 软件设计七大原则 #### 开闭原则 一个软件实体如,模块和函数应该**对扩展开放,对修改关闭**。用抽象构建框架,用实现扩展细节。这样可提高软件的可复用性和维护性,例如:版本更新->不修改源代码,可以增加新功能。 实现:在原来的类上进行继承extends来实现扩展内容 , 创建使用: 原来的类 x = new 扩展的类,再强制子类 代码:openclose #### 依赖倒置原则 **高层模块不应该依赖低层模块**,二者都应该依赖其抽象。**抽象不应该依赖细节,细节应该依赖抽象**。针对**接口编程**,不要针对实现编程。优点:可以减**少类间的耦合性**,提高系统稳定性,提高代码可读性和维护性,可以降低修改程序所造成的风险 实现:高层要使用底层,在高层中以注入方式(高层内部添加底层属性),底层new出来或者从容器中创建给高层。面向接口编程。 代码:dependenceinversion #### 单一职责原则 不要存在多云一个导致类变更的原因。**一个类/接口/方法只负责一项职责**。优点:降低类复杂度,提高类的可读性,提高系统的可维护性,降低变更引起的风险 实现:不同的行为封装在不同的接口中,不同的分别来使用不同的实现。 代码:singleresponsibilty #### 接口隔离原则 用**多个专门的接口**,而不使用单一的总接口,客户端不应该依赖它不需要的接口。**一个类对一个类的依赖应该建立在最小的接口上**。建立单一接口,不要建立庞大臃肿的接口。尽量细化接口,接口中的方法尽量少。注意适度原则,一定要适度。符合我们常说的**高内聚低耦合**的设计思想,从而使类具有很好的可读性,可扩展性和可维护性。 代码:interfacesegregation #### 迪米特法则 一个对象应该**对其它对象保持最少**的了解。少知道原则。尽量**降低类与类之间的耦合**。强调只和朋友交流,不和陌生人说话。 代码:demeter #### 里氏代替原则 如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都替换成o2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型。 一个软件实体如果适用一个父类的话,那么一定适用于子类,所有引用父类是地方必须能透明适用其子类的对象,**子类对象能够替换父类对象**,而程序不变。 **子类可用扩展父类的功能,按时不能改变父类原有的功能。** **子类可用实现父类的抽象方法,但是不能覆盖父类的非抽象方法** **子类中可用增加自己特有的方法。** **当子类的方法重载父类的方法时,方法的前置条件(及方法的输入参数)要比父类方法是输入参数更宽松。** **当子类的方法实现父类的方法时(重写/重载或者实现抽象方法),方法的后置条件(输入/返回值)要比父类更加阳光或者相等。** 优点:约束继承泛滥,开闭原则的一种体现。加强程序的健壮性,同时变更时也可以做到非常好的兼容性,提高程序维护扩展性。降低需求变更时引入的风险。 代码:liskovsubstitution #### 合成/复用原则 尽量**使用对象组合/聚合**,而不是继承关系达到软件复用的目的。 聚合has -A和组合contains-A,可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的用性相对较少。继承is-A少用。 代码:compositionaggregation