UML建模
常看UML建模,但是里面的关系经常很难记忆,此处记录一下。UML的六种关系:泛化、实现、关联、聚合、组合、依赖。
泛化
指的是继承关系,表达一般和特殊。符号:空心三角箭头的实线,箭头指向父类。实现
指的是类与接口的关系,表达类实现了接口的特征行为。符号:带三角箭头的虚线,箭头指向接口。关联
指的是类和类的关系,表达一个类知道另一个类的属性和方法。符号:带普通箭头(或实心三角形箭头)的实心线。聚合
指的是整体和部分关系,且部分可以离开整体而单独存在。符号:空心菱形的实心线,菱形指向整体。组合
指的是整体与部分的关系, 但部分不能离开整体而单独存在。符号:带实心菱形的实线,菱形指向整体。依赖
指的是使用的关系, 即一个类的实现需要另一个类的协助, 所以要尽量不使用双向的互相依赖。符号:带箭头的虚线,指向被依赖的类。设计模式原则
单一职责:一个类就干一件事。
开闭原则:对扩展开放,对修改关闭。
里氏代换原则:子类不能修改父类的功能。
合成/聚合复用原则:用接口实现,避免使用继承。
依赖倒转原则:针对接口编程,不针对实现编程。
迪米特法则:类和类之间低耦合,高内聚。
接口隔离原则:接口尽量细化。
创建型设计模式
单例模式
实现:保证类只能有一个对应的实例。
如果不管需要不需要上来就创建实例,那么就是饱汉式。
如果等到需要的时候创建实例,那么就是懒汉式。
简单工厂模式
实现:将创建对象的逻辑封装到一个工厂,使用if-else语句来根据不同条件创建多个不同对象。
工厂方法模式
针对简单工厂模式,由于创建对象需要if-else,如果创建一个新对象,还得修改工厂类,不符合开闭原则。
实现:定义工厂接口。当需要创建新对象时候,先创建新工厂(一个工厂对应创建一种对象)。
抽象工厂模式
针对工厂方法模式,一工厂创建一对象,但是会产生大量的工厂并且每个工厂还想要创建一类对象。
实现:定义抽象工厂接口(满足一个工厂创建一类对象),创建不同工厂实现抽象工厂接口,创建一类对象。
简单工厂 vs 工厂方法 vs 抽象工厂
简单工厂,就是一个工厂实现全部逻辑。
工厂方法,一个工厂创建一种对象。
抽象工厂,一个工厂创建一类对象。
建造者模式
针对上面三个工厂模式,可以看到关注点都在创建对象,并没有提及对象的功能和行为。而建造者模式主要关注对象的行为和功能。创建一个类似的对象。
实现:定义抽象建造者接口,通过具体建造者实现该接口具体产品。定义指挥者构建建造者,建造者再创建产品。
原型模式
实现:拷贝复制对象,从而创建对象。
浅拷贝:直接使用clone方法拷贝,与原对象有关系。
深拷贝:创建新对象,把原对象属性设置到新对象,原对象无关系。
结构型设计模式
代理模式
目的:生成代理对象,代理对象实现原有对象的功能。
实现:创建代理类实现真实类需要的接口,调用真实类方法,代替它实现方法。
装饰器模式
实现:为方法添加新的功能,编写新方法,调用老方法,在老方法前后加入自己新实现。主要是包装老方法。
组合模式
目的:用于有部分与整体这种层次结构,忽略了组合对象和部分单个对象的不同,可以统一的使用组合结构中的对象。
实现:整体与局部(树形结构)进行递归组合。
外观模式
目的:对外提供一个统一的接口用来访问子系统,而使这些子系统更加容易被访问的模式。主要是无需关心子系统代码实现细节。
实现:子系统方法,组合到新方法中。
适配器模式
接口不兼容的类一起工作。为了适配新接口,那么就实现新接口的方法即可。
类适配实现:类A的方法,无法完成新接口B的功能。设计一个适配器类C,继承类A,实现B接口,完成B的方法,如果需要老功能,那么直接调用父类A的方法,这样通过适配类C就可以完成B接口。
对象适配实现:在类适配的基础上,将原本通过继承父类方式调用父类的老功能,改成组合的方式调用。
桥接模式
目的:将实现和抽象放在两个不同的类层次中,使两个能够独立变化的部分分离开来。
实现:将具体类抽象为抽象类,将方法的实现抽象为接口,将接口与抽象类组合。
享元模式
目的:使用HashMap减少重复对象的产生。重用现有的同类对象,如果未找到匹配的对象,则创建新对象。
实现:将对象存放到容器中,譬如数组、HashMap,减少对象数量。场景:java.lang.Integer类的cache实现。
行为型设计模式
策略模式
目的:定义一系列算法的方法,并且这些算法都完成相同的工作,只是实现不同,使用相同的方式调用所有的算法,减少了算法之间的耦合,并且每个算法都是独立的,可以对每个算法的接口进行单独的测试。
实现:一个接口多个实现类。
模板方法模式
目的:通过模板来固定操作的流程。通过子类实现模板方法。
实现:定义一个抽象类模板,然后将抽象方法延伸到其子类去实现。
迭代器模式
目的:顺序的访问集合中的对象。
实现:定义一个迭代器类实现访问集合方法接口,里面实现了集合是否有元素、获取前一个元素、获取后一个元素、取第一个、最后一个元素的方法。这样通过迭代器就可以访问集合了。
场景:java.uti.Iterator接口集合访问定义。
状态模式
目的:将对象的状态与实现分离,根据不同状态做出不同的行为。
实现:定义抽象状态类,实现不同状态类。定义上下文实现不同状态类,实际将上下文的执行权力又移交到状态类。
观察者模式
目的:当多个观察者类订阅一个主题时,当主题变化会通知这些观察者。
实现:定义抽象主题,将实现延伸到具体主题。定义抽象观察者,将实现延伸到不同具体观察者。将观察者注册到主题中,那么主题变化,直接调用观察者来执行方法,就实现了通知。
命令模式
目的:将请求封装成命令,定义命令类,记录命令,可以将命令发布、撤销、重做。便于命令发出者与实现者分离,都面对命令,实现其解耦。
实现:定义抽象命令类,实现具体业务的命令实现类。然后实现命令发布者操作命令行为,实现命令与命令实现者行为。
中介者模式
目的:将对象之间的交互行为进行抽象。尤其是与很多对象交互操作,很复杂,那么就可以通过中介者来完成与多个对象交互。
实现:定义一个抽象中介者,实现具体业务的中介者。定义抽象交互对象,实现具体交互对象,通过中介者来访问交互对象。
备忘录模式
目的:定义类保存对象的状态,在需要的时候恢复。
实现:定一个备忘录类,在源类里面,实现一个创建备忘录对象方法。实现一个将备忘录对象更新数据到源对象的方法。
访问者模式
目的:将对象的数据结构与对象操作数据结构的方法分离解耦。应对数据结构不变,操作方法变化的情况。应对方式为增加访问者即可。
实现:定一个固定的数据结构类,定义抽象数据类,定义多个数据实现类。数据结构类就是按照规则排布抽象数据类。想要实现不同数据的操作,那么就新增对应的中介者。
职责链模式
目的:将事件沿着链去处理。请求者与接收者却毫无关系并且请求者对于到底是谁处理了请求也全然不知。
实现:定义多个类,类与类之间只能两两访问。调用传入的其他一个类的方法,一直往下传递调用。
解释器模式
目的:使用类来定义语法,并对其进行解释。通过继承等机制来改变或扩展语法。
实现:定义多个语法规则类,定义计算类来解析语法,解析过程,调用语法规则类。
设计模式实际应用
工厂模式+策略模式
针对业务中那种分发情况,使用工厂模式,譬如在医疗系统中,在工厂里面判断,如果这个人是孕产妇,那么使用孕产妇的那一套检查流程,那么就调用孕产妇服务接口。如果这个人是65岁以上老人,那么就是用老年人的那一套检查流程,那么就调用65岁以上老人接口。
装饰器模式+代理模式
针对AOP设计中,在使用动态代理,生成代理对象,会在代理对象前后分别实现个性化逻辑,增强原来方法,实现装饰器模式。
模板方法模式+策略模式
针对医疗系统中,居民身份审核流程,一般都是层层上报,譬如乡镇卫生院新增一位孕产妇,那么需要将数据报到县级医院批准,县级医院需要报到地市级医院批准,地市级医院报到省级医院批准。而65岁以上老人、新生儿都是同样的上报流程,那么我们可以将这个流程固定,创建模板方法抽象类,审核方法不变,但是上报内容方式抽象方法我们延伸到子类去实现逻辑。至于上报方式我们也可以选用不同策略,线下手填上报方式,线上扫码填报方式等。
网友评论