OOP设计模式

常用的设计模式以及UML类图
UML类图
Java考试的内容实在太多了,今天先把各种了之间的关系复习一下。
在所有的连线中,没有特殊图形的一端均表示线的开始,起始端是没有任何图形的。
依赖关系
- UML中表示方法:用一条带箭头的虚线连接两个类的UML图,其中结束端即箭头指向被依赖的类
- 定义: 如果一个类作为另一个类某个方法的返回值类型或者参数类型,那么这两个类就构成了依赖关系。
例如: 台式电脑需要连接电源🔌供电(指电能而非机箱内的电源)才能启动,电源供电并不是台式电脑的属性(成员),而是作为电脑💻启动这个方法不可或缺的条件。电脑和电能就构成了依赖关系。
Code of Computer:
| 1 | class Computer{ | 
Code of EPower:
| 1 | class EPower{ | 
关联关系
记忆:依赖关系和关联关系都是结束端的箭头都是相同的,而关联是实线,联 的同音连为实线,并且实线较虚线有关系更强的意思。
- 在UML类图中: 用带箭头的实线连接两个相互关联的类,其中箭头表示的结束段指向被关联的类
- 定义: 如果一个类声明的对象作为另一个类的数据成员(属性、成员变量),那么这两个类之间就形成了关联关系。
例如: CPU(中央处理器)作为计算机不可缺少的一部分,CPU就是计算机的属性。
Code of Cpu:
| 1 | class Cpu{ | 
Code of Computer:
| 1 | class Computer{ | 
泛化(继承)关系
- UML类图中,用一条实线加空心的三角形来表示继承关系,一个类继承另一个类,被继承的类叫父类或者基类,另一个叫子类或者派生类。用空心三角形指向父类
例如: Stuent是人,有人的一切属性和行为,Student继承自父类Human
Code of Student:
| 1 | class Student extends Human{ | 
Code of Human{
| 1 | class Human{ | 
实现关系
- 在UML图中用虚线和空心三角形连接接口和实现接口的类。虚线的终点端是它实现的接口。
 例如: 笔记本是计算机的一种实现,只有有中央处理器,有输入输出设备就是一台计算机。
Code of Computer:
| 1 | interface Computer{ | 
Code of Laptop:
| 1 | class Laptop implements Computer{ | 
常见的设计模式
简单工厂模式
例子
生产汽车🚘的工厂生产两种品牌的汽车,一种是宝马汽车,另一种汽车是🚗奥迪汽车。用户并不了解汽车是如何生产的,仅仅只是从工厂得到汽车。宝马汽车和奥迪汽车有相同的共性,都是汽车,均实现了汽车这个接口。
Car:
| 1 | interface Car { | 
AodCar:
| 1 | public class AodCar implements Car { | 
BmwCar:
| 1 | public class BmwCar implements Car { | 
FactorySimple:
| 1 | public class FactorySimple { | 
Customer:
| 1 | public class Customer { | 
工厂方法模式
开闭原则: 对拓展开放,对修改封闭. 一个软件的变化应该通过拓展来实现,而不是通过修改现有代码。
例子
只需要将简单工厂方法中的工厂抽象为接口,分别实现宝马工厂和奥迪工厂,客户端实例化这两个工厂。
Factory:
| 1 | public interface Factory { | 
BmwFactory:
| 1 | public class BmwCar implements Car { | 
AodFactory:
| 1 | public class AodFactory implements Factory { | 
| 优点 | 缺点 | 
|---|---|
| 符合开闭原则和单一职责原则,拓展性比较强 | 增加一个产品时,需要增加一个产品类和具体子工厂,给系统增加负担的同时,每种工厂生产一种产品,太过单一 | 
单例模式
- 单例类只有一个实例,不能再外部被实例化
- 单例类必须自己创建自己的唯一实例
- 单例类必须给所有其他对象提供这一实例
实现方式
不能通过无参构造函数在外部实例化(私有构造),如何限制只有一个?(类的静态成员只有一个副本)
- 饿汉式(立即加载)
 在类初始化时就构造好了一个静态对象供外部使用,除非系统重启,这个对象不会改变,所以本身就是线程安全的。
| 1 | public class SingleHunger { | 
懒汉式(延迟加载)
| 1 | public class SingleLazy { | 
在多线程的情况下,这显然不是单例,这时候我们就需要将同步锁🔐加在合适的位置。
synchronized 与 static 一起使用,同步当前类。
使用 synchronized 同步锁此种方式解决了多个实例对象的问题,但是该种方式的执行效率较低,提高 sychronized 的效率需要尽可能的缩小同步的范围。
静态内部类:
| 1 | public class SingleInside { | 
优点:
- 在内存中
外观模式
例子
职责链模式
行为型模式:关注系统中对象之间的相互交互,通信与合作
- 责任链(职责)模式: Chain of respon
例子
策略模式
例子
场景: 某个市场的销售人员,接到单后的报价策略:
- 普通用户小批量报价
- 普通用户大批量报价
- 老用户小批量报价
- 老用户大批量报价
核心: 分离算法 选择实现
这些策略构成一个算法族。
Strategy:
| 1 | /** | 
NewCustomerFew:
| 1 | /** | 
NewCustomerMany:
| 1 | /** | 
OldCustomerFew:
| 1 | /** | 
OldCustomerMany:
| 1 | /** | 
Client:
| 1 | /** | 
- 本文链接: https://blog.saltpi.cn/article/UMLandDesignPattern/
- 版权声明: 本博客所有文章除特别声明外,均采用 ©BY-NC-SA 许可协议。转载请注明出处!