设计模式
2021-01-11 11:30:23 0 举报
AI智能生成
设计模式
作者其他创作
大纲/内容
UML类图实训
UML视图
用户视图
以用户观点表示系统的目标,是所有视图的核心,用于描述系统的需求
结构视图
表示系统的静态行为,描述系统的静态元素,以及它们之间的关系
行为试图
表示系统的动态行为,描述系统的组成元素在系统运行时的交互关系
实现视图
表示系统中逻辑元素的分布,描述系统中物理文件以及他们之间的关系
环境视图
表示系统中物理元素的分布,描述系统中硬件设备以及它们之间的关系
模型元素
指UML图中所使用的一些概念,同一个模型元素都必须保持相同的意义并且具有相同的符号
类与类的UML表示
类
具有相同属性、操作、关系对象集合的总称
类的UML表示
类名
每个类必须有一个名字,类名是一个字符串
属性
属性是指类的性质,即类的成员变量
可见性 名称:类型[ = 默认值 ]
操作
操作是类的任意一个实例对象都可以使用的行为,操作是类的成员方法
可见性 名称([参数列表])[:返回类型]
类之间的关系
关联关系
双向关联
默认情况下,关联是双向的
一条直线
单项关联
类的关联关系也可以是单向的
带箭头的实线
自关联
属性对象类型为该类本身
多重性关联
表示两个关联对象在数量上的对应关系
1..1
另一个类的一个对象只与一个该类对象有关系
0..*
另一个类的一个对象与零个或多个该类对象有关系
1..*
另一个类的1个对象与一个或多个该类对象有关系
0..1
另一个类的一个对象没有或只与一个该类对象有关系
m..n
另一个类的一个对象与最少m、最多n个该类对象有关系(m小于等于n)
聚合关系
表示一个整体与部分的关系,成员类是整体类的一部分但是成员类可以脱离整体对象单独存在
带空心菱形的直线
组合关系
类之间整体与部分的关系,但组合关系中部分和整体具有统一生存期
带实心菱形的直线
依赖关系
一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,大多数情况下依赖关系体现在某个类的方法使用另一个类做参数
带箭头的虚线
泛化关系
继承关系,描述父类与子类之间的关系
带空心三角形的直线
接口与实现关系
接口与类之间存在的实现关系
带空心三角形的虚线
面向对象设计原则实训
单一职责原则
一个类只负责一个功能领域中的相应职责
实现高内聚、低耦合的指导方针,它是最简单又最难运用的原则
开闭原则
软件实体对扩展开放,而对修改关闭
可扩展已有的软件系统使变化中的软件系统具有一定的适应性和灵活性,又具有一定的稳定性和延续性,这样的系统同时满足了可复用性与可维护性
关键是抽象化,并且从抽象化导出具体化实现。开闭原则一般是通过在原有模块中添加抽象层来实现的
里氏代换原则
所有引用基类的地方能够透明地使用其子类对象
运用里氏代换原则时尽量将一些需要扩展的类或者存在变化的类设计为抽象类或则接口,并将其作为基类,在程序中尽量针对基类对象进行编程
如果需要对类的行为进行修改,可以通过扩展基类来增加新的子类,无需修改使用该基类对象的代码
依赖倒转原则
抽象不依赖于细节,细节应该依赖于抽象
一个具体类应该只实现接口和抽象类中声明过的方法,而不要给出多余的方法,否则将无法调用到在子类中增加的新方法
引入抽象层后,系统将具有很好的灵活性,系统行为发生变化只需要对抽象层进行扩展,修改配置文件,无需修改系统源码,在不修改的情况下扩展系统的功能
接口隔离原则
使用多个专门的接口,而不是使用单一的总接口
将大接口中的方法根据其职责不同分别放在不同的小接口中,以确保每个接口使用起来都较为方便,并且承担某一单一角色
合成复用原则
尽量使用对象组合,而不是继承来达到复用的目的
复用时尽量使用组合/聚合关系(关联关系),少用继承
创建型模式实训
创建型模式主要用于创建对象;结构型模式主要用于处理类或对象的组合;行为型模式主要用于描述类或对象的交互以及职责分部
简单工厂模式
定义一个类,根据参数的不同返回不同类的实例,这些类具有公共的父类和一些公共的方法。简单工厂模式不属于GoF设计模式,它是最简单的工厂模式
Product表示抽象产品角色,它是简单工厂模式所创建的所有对象的父类,负责定义所有实例所共有的公共接口
ConcreteProduct表示具体产品角色,它是简单工厂模式的创建目标,所有创建对象都是充当这个角色的某个具体类的实例
Factory表示工厂类,它是整个模式的核心,负责实现创建所有实例的内部逻辑
将它作为学习其他工厂模式的入门或不复杂的环境下也可以直接使用简单工厂模式
工厂方法模式
定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式使一个类的实例化延迟到其子类
Product表示抽象产品,它定义了产品的接口
ConcreteProduct表示具体产品,它实现抽象产品的接口
Factory表示抽象工厂,它声明了工厂方法,返回一个产品
ConcreteFactory表示具体工厂,它实现工厂方法,由客户端调用,返回一个产品的实例
客户只需要关心抽象产品和抽象工厂,不用理会返回的是哪一种具体产品,不用关心如何被具体工厂创建
加入新产品无需修改抽象工厂和抽象产品提供的接口,无需修改客户端,也无需修改其他具体产品,而只需要添加一个具体工厂和具体产品,系统的扩展性变得非常好也符合开闭原则
抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类
AbstractFactory表示抽象工厂,用于声明创建抽象产品方法
ConcreteFactory1与ConcreteFactory2表示具体工厂,它们实现抽象工厂声明的抽象抽象工厂方法用于创建具体产品
AbstractProductA与AbstractProductB标识抽象产品,它们为每一种产品声明接口
ProductA1、ProductA2、ProductB1、ProductB2表示具体产品,它们定义具体工厂创建的具体产品对象类型,实现产品接口
Client表示客户类,即客户应用程序,它针对抽象工厂和抽象产品编程
抽象工厂模式是所有工厂模式最一般的形式,当抽象工厂模式退化到只有一个产品等级结构时,即变成了工厂方法模式;当工厂方法模式的工厂类只有一个,且工厂方法为静态方法时,则变成了简单工厂模式
只需要改变具体工厂实例,就可以在某种程度上改变整个软件系统的行为,抽象工厂模式可以实现高内聚低耦合的设计目的
建造者模式
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
原型模式
用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象
单例模式
保证一个类仅有一个实例,并且提供一个访问它的全局访问点
Singleton表示单例类,它提供一个getInstance()方法,让顾客可以使用它的唯一实例
当一个系统要求一个类只有一个实例时可以使用单例模式
单例模式分为
懒汉单例模式
在第一次调用工厂方法getInstance()时创建单例对象
饿汉单例模式
在类加载时创建单例对象,即在声明静态单例对象时实例化单例类
结构型模式实训
描述如何将类或对象结合在一起形成更大的结构。结构型模式可以描述两种不同的东西:类与类的实例
适配器模式
将一个类的接口转换成用户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
类适配器模式
对象适配器模式
Target表示抽象目标类,它表示客户端需要使用的特定领域的接口,改接口不能随意改动
Adapter表示适配器类,是模式的核心,用于调用另一个接口,作为一个转换器
类适配器
Adapter实现了Target接口,并继承了Adaptee类,在实现Taget接口的request()方法时可以直接调用从Adaptee类继承过来的specificRequest()方法
对象适配器
Adapter继承了Target类且与Adaptee的关联关系,即在Adapter中定义了Adaptee对象,从而可调用在adaptee中已实现的方法
适配器模式可以将一个类的接口和另一个类的接口匹配起来,使用的前提是不能或不想修改原来的适配者接口(Adaptee)和目标接口(Target)
桥接模式
将抽象部分与实现部分分离,使它们都可以独立的变化
组合模式
将对象组合成树型结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性
Component表示抽象构件,它可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有的行为的声明和实现,在抽象构建中还定义了访问及管理子构件的方法
Leaf表示叶子构件,在组合中表示叶子节点对象,叶子节点没有子节点,它实现抽象构件接口声明的基本行为
Composite表示容器构件,它定义包含子节点的构件的行为,并存储子节点,它实现抽象构件接口中定义的操作叶子构件行为
Client表示客户类,它通过Component接口控制组合构件中的对象
组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,使得增加新构件也更容易,对于树型结构的控制有着很好的功效
组合模式分为
透明组合模式
抽象构件Component中声明了所有用于管理成员对象的方法
安全组合模式
在抽象构件Component中没有声明任何用于管理成员对象的方法,而是在Composite类中声明这些用于管理成员对象的方法
装饰模式
动态地给一个对象添加一些额外的职责,就扩展功能而言,它比生成子类的方式更加灵活
外观模式
子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一个子系统更加容易使用
外观模式实例之文件加密
外观模式的目的在于减少系统的复杂程度,外观模式的引入很大程度上降低类之间的通信和关系。当要为一个复杂子系统提供一个简单接口时可使用外观模式
外观模式的缺陷在于它不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多限制将降低系统的可变性
享元模式
运用共享技术有效地支持大量细粒度的对象
代理模式
为其他对象提供一个代理以控制对这个对象的访问
Subject表示抽象主题角色它声明了真是主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题
Proxy表示代理主题角色,代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象,代理主题角色提供一个与真实主题角色相同的接口以便在任何时候都可以替换真实主题
RealSubject表示真实主题角色,它定义了代理角色所代表的真是对象
行为型模式实训
是对在不同对象之间划分责任和算法的抽象化。行为型模式不仅关注类和对象本身,还重点关注它们之间的相互作用和职责划分
职责链模式
未解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求;将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它
命令模式
将一个请求封装成一个对象从而可用不同的请求对客户进行参数化;对请求排队或记录请求日记,以及支持可撤销操作
解释器模式
定义语言的文法,并且建立一个解释器来解释该语言中的句子
迭代器模式
提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示
Iterator表示抽象迭代器,它定义了访问和遍历元素的接口
ConcreteIterator表示具体迭代器,它实现迭代器接口,并在对该聚合遍历时跟踪当前位置;
Aggregate表示抽象聚合,它定义并创建相应迭代器对象的接口
ConcreteAggregate表示具体聚合,它实现创建相应迭代器的接口,并返回一个ConcreteIterator的实例
迭代器模式支持以不同的方式遍历一个聚合对象,复杂的聚合可用多种方法来进行遍历,有了迭代器的遍历接口,聚合本身就不需要类似的遍历接口;也允许在同一个聚合上定义多种便利方式
中介者模式
用一个中介对象来封装一系列的对象交互;中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间交互
备忘录模式
在不破坏封装性的前提下,捕获一个对象的内部状态,并且该对象之外保存这个状态,这样以后就可以将该对象恢复到先前保存的状态
观察者模式
定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新
Subject表示抽象目标或主题,即被观察的对象,目标需要了解其多个观察者一个目标可以接受任意数量的观察者观察,同时它提供一个接口来注册和删除观察者对象
ConcreteSubject表示具体目标,将有关状态存入各ConcreteObserver对象,当它的状态发生变化时,向它的观察者发出通知
Observer表示抽象观察者,在一个Subject对象改变时,为那些需要获得通知对象定义一个更新接口
ConcreteObserver表示具体观察者,它维护一个指向ConcreteSubject对象的引用,同时存储有关状态,这些状态需和ConcreteSubject保持一致,它实现Observer的更新接口以保持其自身状态与ConcreteSubject对象状态一致
优点在于实现了表示层和数据逻辑层的分离,并定义了稳定的更新消息传递机制,类别清晰,抽象了更新接口,使得相同的数据逻辑层可以有各种各样不同的表示层
状态模式
允许一个对象在其内部状态发生改变时改变它的行为,对象看起来似乎修改了它所属的类
策略模式
定义一系列的算法,把它们一个个封装起来,并且使他们可相互替换,策略模式使得算法的变化可独立于使用它的用户
Context表示环境类,它通过ConcreteStrategy对象配置其执行环境,并维护一个对Strategy的引用实例,可以定义一个接口供Strategy存取数据
Strategy表示抽象策略类,它定一个公共的接口给所有支持的算法,Context可以使用这个接口调用ConcreteStrategy定义的算法
ConcreteStrategyA和ConcreteStrategyB表示具体策略类,它们实现Strategy接口定义的算法
优点
提供了管理相关算法族的办法
提供了可替换继承关系办法
可以避免使用多重条件转移语句
缺点
策略模式只适用于客户端知道所有算法或行为的情况
策略模式造成系统有时有很多的策略类
模板方法模式
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤
访问者模式
表示一个作用于某对象结构中的各元素的操作,可以在不改变各个元素的类的前提下定义作用于这些元素的新操作
0 条评论
下一页