整体架构
UML类图

Main类
接收控制台读入,并对读入的字符串进行解析,获取对应的指令并执行指令。
1 | CommandFactory factory = new CommandFactory(); |
迭代调整
分离思想
每个class功能应遵守单一职责原则,故当迭代中发现某个类功能过于繁杂、修改一动而牵全身时,应进行分离处理。
- 在发现Adventurer类变得过于繁杂之后,分离了其中处理Portable(可携带品)的功能:在Inventory内部实现涉及到Portable的操作。
1
2//Adventurer class
private final Inventory inventory;
命令模式
迭代过程中不断需要添加指令。初始设计为在Main类中用case结构执行对应指令,但很快发现:
- Main类中方法过长
- 添加指令不方便
因此引入Command Pattern设计模式,优化指令可拓展性并简化Main类
单例模式
对Adventurer实例的管理:采取单例模式,创建World类,保证所有操作都是在同一个World实例里执行的。
1 | public class World { |
工厂模式
将创建各种Usable的方法集成于CreateFactory类中。
容器选择
几乎所有操作的都涉及到id和object的对应关系(key-value),故基本都采用HashMap来管理对象。
但,一旦涉及到顺序性,就必须更换容器,例如:
- fight指令涉及到战斗对象的先后顺序,故使用ArrayList来储存
- 携带物品的操作涉及
FIFO,故在Inventory中采用:来记录携带信息1
private final Map<String, LinkedList<Portable>> bag;
使用JUnit的心得体会
- 如果一个类很难被测试,通常意味着它的设计存在问题(例如职责不清、耦合度过高),进而推动我们修改代码。
学习OOPre的心得体会
- 什么才是一份好的代码?
- 易于维护、扩展和复用
- 尝试使用设计模式
- 遵守设计原则:单一职责、开闭……
- 易于维护、扩展和复用
- 面向过程到面向对象的思维转变
- 思考应设计什么对象、对象应具备什么属性和行为、对象之间如何协作
对OOPre课程的简单建议
- 迭代作业每次要切换仓库,导致版本管理流程(如commit、push等)较为繁琐,建议统一使用同一个仓库来进行迭代开发。