@startuml
interface Iterable
interface Collection
interface List
abstract class AbstractCollection
abstract class AbstractList
class ArrayList
abstract class AbstractSequentialList
class LinkedList
interface Deque
interface Queue
class Vector
Collection -up-|> Iterable
List -up-|> Collection
AbstractCollection .up.|> Collection
AbstractList .up.|> List
AbstractList -up-|> AbstractCollection
ArrayList .up.|> List
ArrayList -up-|> AbstractList
AbstractSequentialList -up-|> AbstractList
LinkedList .up.|> List
LinkedList .up.|> Deque
LinkedList -up-|> AbstractSequentialList
Deque -up-|> Queue
Vector .up.|> List
Vector -up-|> AbstractList
Stack -up-|> Vector
@enduml
分析其中的设计原则
单一职责-SRP
首先考虑以下几个问题
需要符合单一职责的事物有哪些?
- 类
- 接口
- 方法
- 包
- 模块或者服务
职责划分的依据
参考 概念的划分
AbstractList 按照是否线程安全和是否内存连续划分为 Vector、ArrayList 和 AbstractSequentialList
- 线程安全,内存连续 -Vector
- 线程不安全,内存连续- ArrayList
- 内存不连续,线程或者安全或者不安全 -AbstractSequentialList
AbstractSequentialList 根据线程是否安全划分
- 线程不安全 -linkedlist
目前没看到线程安全的 linkedlist 结构。
这种划分给我的感觉,像没有符合连续划分的规范,比如正常是把“教材”分成“自然科学教材、社会科学教材”;再把“自然科学教材”进一步分为“数学教材、物理学教材、化学教材、生物学教材等”
这里是是把“教材”分成“数学教材、物理学教材、“有机化学教材、无机化学教材、生物学教材、社会科学教材”等。
如果忽略抽象父类,划分中各子项的外延之和必须等于母项的外延这一规则也没有符合,可能从实际来讲线程安全的链表没啥用处?
如果让我设计,我可能会按照习惯这样
@startuml
abstract class AbstractList
class ArrayList
abstract class AbstractSequentialList
abstract class AbstractArray
class LinkedList
class Vector
ArrayList -up-|> AbstractArray
AbstractArray -up-|> AbstractList
AbstractSequentialList -up-|> AbstractList
LinkedList -up-|> AbstractSequentialList
Vector -up-|> AbstractArray
@enduml
当然,具体划分依据按照项目需求来,不需求划分的太细,但要考虑到项目需求可能产生的变更 。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于