模型-视图-控制器(MVC):
各个部分的基本功能在MVC模式中,Model主要负责数据和业务逻辑,而View主要负责呈现,也就是用户界面,Controller主要负责Model和View的交互
一.结构化设计
1.概念:结构化设计主要包括以下步骤:
①体系结构设计:定义软件的主要结构元素及其关系
②数据设计:基于实体联系图确定软件涉及的文件系统的结构及数据库的表结构
③接口设计:描述用户界面,软件和其他硬件设备、其他软件系统及使用人员的外部接口,以及各种构件之间的内部接口
④过程设计:确定软件各个组成部分内的算法及内部数据结构,并选定某种过程的表达形式来描述各种算法
注:这些设计的具体体现是结构图,结构图中的元素包括模块、调用、数据、控制信息和转接符号
2.结构化分析与结构化设计的关系:
软件设计必须依托软件的需求来进行,结构化分析的结果为结构化设计提供了最基本的输入信息,其关系为:
(1)根据加工规格说明书和控制规格说明书进行过程设计
(2)根据数据字典和实体关系图进行数据设计
(3)根据数据流图进行接口设计
(4)根据数据流图进行体系结构设计
注:该设计方法特别适合数据处理领域的问题,但是不适合解决大规模的、特别复杂的项目
数据字典有4类条目:
数据流、数据项、数据存储和基本加工
二、面对对象技术
1.面对对象的基本概念
面对对象=对象+分类+继承+通过消息的通信,可以说,采用这4个概念开发的软件系统是面对对象的
①对象
对象是基本的运行时的实体,既包括数据(属性),也包括作用于数据的操作(行为)。一个对象通常可由对象名、属性、和方法部分组成。
②消息和消息通信
对象之间进行通信的一种构造叫作消息,当一个消息发送给某个对象时,要求接受对象去执行某些活动的信息。接受信息的对象通过解释任何做出响应。
消息就是向对象发出的服务请求,它通常包括提供服务的对象标识、消息名、输入信息和回答
信息。消息通信则是面向对象方法学中的一个重要原则,它与对象的封装原则密不可分,为对象间
I提供了唯一 合法的动态联系的途径。
③类
在分析和设计时,通常把注意力集中在类上,类分为实体类、接口类(边界类)和控制类、,
实体类表示世界真实的实体,如人和事物,接口类的对象为用户提供一种与系统合作交互的方式,分为人和系统两大类,其中人的接口可以是窗口、对话框、二维码等;控制类的对象用来控制活动流,充当协调者
④继承与泛化
继承是父类和子类之间共享数据和方法的机制,继承是面向对象方法中重要的概念,用来说明特殊类(子类)与一般类(父类)的关系,通常用泛化来说明一般类与特殊类之间的关系,它们之间是一对多关系。
⑤多态
不同的对象收到同一消息可以产生完全不同的结果,多态的实现受到继承的支持,多态(多种形式)性则是指一般类中定义的属性或服务被特殊类继承后,可以具有不同的数据类型或表现出不同的行为,通常是使用重载和改写两项技术来实现的。
分为4类多态:
通用的多态:
参数的、包含的
特定的多态:
过载的、强制的
参数多态是应用最广泛的多态,包含多态在许多语言都存在,例子是子类型化,即一个类型是另一个类型的子类型,过载多态是同一个名字在不同的上下文所代表的含义不同
⑥动态绑定
动态绑定是类的继承以及多态相联系的
⑦封装
面向对象系统中的封装单位是对象,对象之间只能通过接口进行信息交流,对象外部不能对对象中的数据随意地进行访问。封装的目的是使对象的定义和实现分离,这样,就能减少耦合,类内部的实现可以自由改变而不会影响其他的类或对象。同时,类具有严密的接口保护,使对象的属性或服务不会随意地被使用,对象的状态易于控制,可靠性随之增强。
2.面对对象分析
①认定对象
②组织对象
③对象间的相互作用
④基于对象的操作
3.面对对象设计
面对对象设计同样遵循抽象、信息隐藏、功能独立、模块化等设计原则
①面对对象设计活动
(1)识别类及对象
(2)定义对象
(3)定义服务
(4)识别关系
(5)识别包
面对对象分析基于用例模型,通过对象建模记录确定的对象、对象封装的数据和行为以及对象之间的关系。面对对象分析包括三个活动:建模系统功能,发现并且确定业务对象,组织对象并确定其关系
面对对象设计是在分析对象模型的基础上,设计各个对象、对象之间的关系(如层次关系、继承关系等)和通信方式(如消息模式)等,主要作用是对OOA的结果作进一步的规范化整理
4.面对对象设计原则
①单一职责原则:设计目的单一的类
②开放—封闭原则:对扩展开放,对修改封闭(多扩展,少修改)
③李氏替换原则:子类可以替换父类
④依赖倒置原则:要依赖于抽象,而不是具体实现;针对接口编程,不要针对实现编程
⑤接口隔离原则:使用多个专门的接口比使用单一的总接口要好
⑥组合重用原则:要尽量使用组合,而不是继承关系达到重用的目的
⑦迪米特原则(最少知识法则):一个对象应当对其他对象有尽可能少的了解8
5.UML(统一建模语言)
在UML的各种视图中,用例视图从外部参与者的角度描述系统功能:
逻辑视图从系统的静态结构和动态行为角度显示系统内部如何实现系统功能;
而源代码结构和实际的执行代码则是通过实现视图反映。
逻辑视图:以问题域的语汇组成的类和对象集合。
进程视图:可执行线程和进程作为活动类的建模,它是逻辑视图的一一次执行实例,描绘了所设
计的并发与同步结构。
实现视图:对组成基于系统的物理代码的文件和构件进行建模。
部署视图:把构件部署到一组物理的、可计算的节点上,表示软件到硬件的映射及分布结构。
用例视图:最基本的需求分析模型。
①事物
UML中有4种事物:结构事物、行为事物、分组事物和注释事物
②关系
UML有4种关系:依赖、关联、泛化和实现
依赖:一个事物发生变化会影响另一个事物
关联:关联是一种结构关系,它描述了一组链,链是对象之间的连接,聚集是一种特殊类型的关联,它描述了整体和部分间的结构关系;聚合概念区分为聚合和组合,组合与聚合都体现着"部
分"和"整体"的关系,但组合是一种很强的"拥有"关系,"部分"和"整体"的生命周期通常一样。整体对象完全支配其组成部分,包括它们的创建和销毁等;
而聚合有时候' '部分"对象可以在不同的"整体"对象之间共享,并且"部分"对象的生命周期也可以与"整体"对象不同,甚至"部分"对象可以脱离"整体"对象而单独存在。组合与聚合都是关联关系的特殊种类。
注:在关联上可以标注重复度和角色
泛化:泛化是一种特殊/一般关系,特殊元素(子元素)的对象可替代一般元素(父元素)的对象。子元素共享了父元素的结构和行为。
实现:在两种情况下会使用实现 关系,一种是在接口和实现他们的类和构件之间,另一种是在用例和实现他们的协作之间
③UML中的图
静态结构:主要包括用例图、类图和包图;
动态视图:主要包括活动图、状态图、序列图和协作图。动态视图中,交互视图描述”了执行系统功能的各个角色之间相互传递消息的顺序关系,主要包括序列图、协作图
可以分为静态图和动态图
顺序图、通信图、定时图和交互概览图又统称为交互图
静态图包括:
1.类图
类图展现了一组对象、接口、协作、和它们之间的关系。通常包含下述内容
(1)类
(2)接口
(3)协作
(4)依赖、泛化和关联关系
(1)对系统的词汇建模
(2)对逻辑数据库模式建模
(3)对简单的协作建模
2.对象图
展现了某一时刻一组对象以及它们之间的关系,一般包括对象和链
3.包图
不能执行,展现由模型本身分解而成的组织单元以及其间的依赖关系,包可以拥有其他元素,可以是类、接口、构件、结点、协作、用例和图,甚至是嵌套的其他包,拥有是一种关系,元素被声明在包里,一个元素只能被一个包所拥有,同一种元素的名称必须唯一
4.组合结构图
用于描述一个分类器(如类、构件、或用例)的内部结构,展示一组相互协作的实例如何完成特定的任务,描述设计、架构模式或者策略。
5.构件图
展现一组构件之间的组织和依赖,与类图相关,通常把构件映射为一个或多个类、接口或协作。
在该类图中存在两种类似棒棒糖和插座的符号,棒棒糖符号表示“供接口”;插座式的符号表示“需接口”,该图是描述系统构件与构件之间、类与接口之间的关系图
6.部署图
软件的部件应该部署在哪个硬件的节点上面,用来对面对对象系统的物理方面建模的方法。
动态图包括:
1.用例图
该图的归类有分歧,大部分时候归结为动态,小部分时候归结为静态,该图的内容是系统和外部的交互关系
通常包括以下内容:
(1)用例
(2)参与者
(3)用例之间的拓展关系(<<extend>>)和包含关系(<<include>>),参与者与用例之间的关联关系,用例与用例以及参与者与参与者之间的泛化关系。
例题:
解析:
交互图:序列图、通信图、交互概览图、计时图
2.顺序图/序列图:
强调了时间顺序的通信图,描述了以时间顺序组织的对象之间的交互活动
序列图有两个不同与通信图的特征 :
(1)序列图有对象生命线,对象生命线是一条垂直的虚线,
(2)序列图有控制焦点,控制焦点是一个瘦高的矩形
3.通信图/协作图
强调收发消息的对象的结构组织,强调参加交互的对象的组织。
通信图有两个不同于序列图的特性:
(1)通信图有路径
(2)通信图有顺序号
4.计时图
是另一种新增的、特别适合实时和嵌入式系统建模的交互图,适合分析周期和非周期性任务
5.状态图
状态图展示了一个状态机,它由状态、转换、事件和活动组成。关注系统的动态视图,强调对象行为的事件顺序。
6.活动图
与流程图的结构一致,是一种特殊的状态图,展示了系统内从一个活动到另一个活动的流程
6.面向对象设计——设计模式
设计模式的要素:模式名称、问题、解决方案、效果
三种模式的概念及其层次关系:
1.架构模式:是软件设计中的高层决策,例如C/S结构就属于架构模式
2.设计模式:
反映了开发软件系统过程中所作的基本设计决策,而设计模式则是主要关注软件系统的设计,与具体的实现语言无关,是在软件开发过程中,经过验证的,用于解决在特定环境下的、重复出现的、特定问题的解决方案
3.惯用法:
是最底层的模式,关注软件系统的设计与实现,实现时通过特定的程序设计语言来描述构件与构建之间的关系。每种编程语言都有它自己特定的模式,即语言的惯用法。例如c++语言的惯用法就是:引用--计数
设计模式的分类
设计模式可以被分成三种:创建型模式、结构型模式、行为型模式;创建型模式与对象的创建有关,结构型设计模式处理类或对象的组合;行为型模式对类或对象怎样交互和怎样分配职责进行描述
(1)创建型设计模式
1.Abstract Factory (抽象工厂模式)
(1)意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类
(2) 适用性
一个系统要独立与它的产品的创建、组合和表示时
一个系统要由多个产品系列中的一个来配置时
当要强调一系列相关的产品对象的设计以便进行联合使用时
当提供一个产品类库,只想显示它们的接口而不是实现时
2.Builder(生成器)
(1)意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
(2)适用性
当创建复杂对象的算法应该独立与该对象的组成部分以及他们的装配方式时
当构造过程必须允许被构造的对象有不同的表示时
3.Factory Method(工厂方法)
(1)意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到其子类
(2)适用性:
当一个类不知道它所必须创建的对象的类的时候
当一个类希望由它的子类来指定它所创建的对象的时候
当类将创建对象的职责委托给多个帮助子类中某一个
4.原型
(1)意图:当原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象
3.Singleton(单例)
(1)保证一个类仅有一个实例,并提供一个访问它的全局访问点
(2)适用性:
当类只有一个实例而客户可以从一个众所周知的访问点去访问它时 。
当这个唯一的实例应该是通过子类化可拓展的,并且客户无须更改代码就能使用一个拓展的实例时
(2)结构型设计模式
1.Adapter(适配器)
(1)意图:将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
2.Bridge(桥接)
(1) 意图:将抽象部分与实现部分分离,使它们都可以独立的变化
3.Composite(组合)
(1)意图:将对象组合成树形结构表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性
4.Decorator(装饰)
(1)意图:动态地给一个对象添加一些额外的职责,就增加功能而言,Decorator模式比生成子类更加灵活
5.Facade(外观)
(1)意图:为子系统中的一组接口提供一个一致的界面
6.Flyweight(亨元)
(1)意图:运用共享技术有效地支持大量细粒度的对象
7.Proxy(代理)
(1)意图:为其他对象提供一种代理以控制对这个对象的访问
(3)行为设计模式
1.Chain of Responsibility(责任链模式)
(1)意图:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止
2.Command(命令)
(1)意图:将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作
3.Interpreter(解释器)
(1)意图:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子
4.Iterator(迭代器)
(1)意图:提供一种方法顺序访问一个聚合对象中的各个元素
5.Mediator(中介者) (一个后端模型被多个前端用户界面连接)
用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显示的相互引用,从而使耦合度松散,可以独立的改变他们之间的交互
6.Memento(备忘录)
在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态
7.Oberver(观察者)
1. 定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于他的对象都得到通知并被自动更新
2.类应该对扩展开放,对修改关闭
8.State(状态)
允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎改变了它的类
9.Strategy(策略)
把算法一个个封装起来,并且使它们之间可以相互替换,使算法可以独立于它们的客户而变化
10. Template Method(模板方法)
使得子类可以不改变一个算法的结构即可重定义算法的某些步骤
11.Visitor(访问者)
允许在不改变元素的类的前提下定义作用于这些元素的新操作