设计模式-访问者模式 运用抽象的方法学习掌握设计模式
运用抽象的方法学习掌握设计模式
概念
- 抽象:抽象就是抛开我们不关心的细节,只保留我们关注的属性特征来分析和处理。
- 职责:类或对象需要实现的功能,接口、公共方法、new方法统称为类的职责
- 构件:类、接口、子系统、组件、工具等统称为构件,包含供接口、需接口和内部实现,A代表供接口,其他构件可以通过A调用构件,B代表需接口,需要通过调用其他实现B接口的构件实现功能。
说明
我们采用抽象的方法学习掌握设计模式,本文主要介绍访问者模式,通过案例、需求、分析、设计剖析设计模式,通过模式的职责视图表示可以很清晰的掌握设计模式的精髓-职责的变更。
需要掌握的知识:设计原则、类之间的关系、统一职责分配原则
案例
需求
开学季,研究生本科生同时开学,老师负责给学生分派宿舍和学院。
分析
根据需求我们可以抽象出三种构件,老师、学生、设施(宿舍、学院),这里还有个构件学生队列,我们暂且将它作为单独的构件处理,这里我们采用职责视图,只关注类的职责,抛开其他的细节(类之间的关系、类的属性、类的方法等)。可得到如下的职责视图:
实现
在不采用设计模式的情况下实现也是非常简单的,我们这里忽略设计阶段,直接上代码。
学生类:
老师类:
client:
输出:
给本科生A分配宿舍
给研究生B分配宿舍
给本科生C分配宿舍
给本科生A分配学院
给研究生B分配学院
给本科生C分配学院
剖析:
- 能够实现功能
- 不满足单一职责原则
- 没有采用面向接口编程
职责分析:
1 遍历学生,还要维护学生队列
2判断学生类型
3学院和宿舍安排
换位思考
学院和宿舍就在那里,学生们知道自己是研究生还是本科生,让学生们自己去报到,学院和宿舍负责安排。
职责重新分配
1 学生自己排队
2宿舍和学院负责根据学生类型分配
3学生自己去报到处报到
类图
代码
访问者模式
定义
访问者模式是一种较为复杂的行为型模式,
它包含访问者和被访问元素两个主要组成部分
这些被访问的元素通常具有不同的类型,
且不同的访问者可以对它们进行不同的访问操作
分析
1 在本案例中,学生是被访问元素,宿舍、学院是访问者
2 在访问者中没有采用if else判断而是采用了重载的多态机制实现了不同类型的访问
类图
总结
1 将职责重新分配,运用职责视图可以很容易的理解设计模式
2 重载是多态的一种,使用重载替换判断
3 使用通用职责分配原则的多态原则将职责重新分配