lab3代码量是真的大,给了一个月的时间,可是依然用了两天的laterdays
基于语法的图数据输入
利用正则表达式来匹配
TrackGame
Pattern pattern2=Pattern.compile("Athlete ::= <");
Pattern pattern3=Pattern.compile("NumOfTracks ::= ");
for(String each:content) {
Matcher matcher1= pattern1.matcher(each);
Matcher matcher2= pattern2.matcher(each);
Matcher matcher3= pattern3.matcher(each);
if(matcher1.find()) {
String m=each.substring(9, 12);
metres=Integer.valueOf(m).intValue();
}
else if(matcher2.find()) {
Pattern pattern=Pattern.compile("([A-Za-z]+),([1-9][0-9]*),([A-Z]{3}),([1-9]\\d*),([1-9][0-9]?\\.\\d{2})");
Matcher matcher= pattern.matcher(each);
if(matcher.find()) {
String name=matcher.group(1);
int num=Integer.valueOf(matcher.group(2)).intValue();
String nation=matcher.group(3);
int age=Integer.valueOf(matcher.group(4)).intValue();
double result=Double.parseDouble(matcher.group(5));
PhysicalObject athlete=createPhysicalObject(name,num,nation,age,result);
allObjects.add(athlete);
}
}
else if(matcher3.find()) {
String m=each.substring(16,17);
tracknums=Integer.valueOf(m).intValue();
}
}
AtomStructure
Pattern pattern1=Pattern.compile("(ElementName ::= )([A-Z][a-z]?)");
Pattern pattern2=Pattern.compile("(NumberOfTracks ::= )([1-9]\\d*)");
Pattern pattern3=Pattern.compile("NumberOfElectron ::= ");
for(String each:content) {
Matcher matcher1= pattern1.matcher(each);
Matcher matcher2= pattern2.matcher(each);
Matcher matcher3= pattern3.matcher(each);
if(matcher1.find()) {
element=matcher1.group(2);
}
else if(matcher2.find()) {
trackNum=Integer.valueOf(matcher2.group(2)).intValue();
}
else if(matcher3.find()) {
String rest=each.substring(21);
Pattern pattern=Pattern.compile("(\\d*)\\/(\\d*)");
Matcher matcher= pattern.matcher(rest);
while(matcher.find()) {
for(int i=0;i<Integer.valueOf(matcher.group(2)).intValue();i++) {
trackElectron.put(Integer.valueOf(matcher.group(1)).intValue(), Integer.valueOf(matcher.group(2)).intValue();
}
}
}
}
PersonalAppEcosystem
Pattern pattern1=Pattern.compile("(User ::= )([A-Za-z0-9]+)");
Pattern pattern2=Pattern.compile("(App ::= <)([A-Za-z0-9]+),([A-Za-z0-9]+),([A-Za-z0-9.-_]+),\"([A-Za-z0-9 ]+)\",\"([A-Za-z0-9 ]+)\"");
Pattern pattern3=Pattern.compile("(InstallLog ::= <)([0-9]{4}-[0-9]{2}-[0-9]{2}),([0-9]{2}:[0-9]{2}:[0-9]{2}),([A-Za-z0-9]+)");
Pattern pattern4=Pattern.compile("(UsageLog ::= <)([0-9]{4}-[0-9]{2}-[0-9]{2}),([0-9]{2}:[0-9]{2}:[0-9]{2}),([A-Za-z0-9]+),([1-9][0-9]*)");
Pattern pattern5=Pattern.compile("(UninstallLog ::= <)([0-9]{4}-[0-9]{2}-[0-9]{2}),([0-9]{2}:[0-9]{2}:[0-9]{2}),([A-Za-z0-9]+)");
Pattern pattern6=Pattern.compile("(Relation ::= <)([A-Za-z0-9]+),([A-Za-z0-9]+)");
Pattern pattern7=Pattern.compile("Period ::= ");
图的可视化:第三方 API 的复用
运用 java.awt 和 java.swing 库来从 0 开始画图 public static void visualize(CircularOrbit<CentralObject,PhysicalObject> c) 重写 JPanel 的 paint 方法 graphics.drawOval 画同心圆轨道 graphics.fillOval 画轨道物体 如果轨道物体之间存在联系,graphics.drawLine 画直线将有关系的物体连起来
设计模式应用
- Track、PhysicalObject 都是用 factory method 设计模式,新建产品时只需要知道产品的工厂即 可,易于扩展。
- ConcreteCircularOrbit 用 abstractfactory 设计模式,工厂为 TrackGame、AtomicStructure 和 PersonalAppEcosystem,PhysicalObject 和 CentralObject 为工厂里的产品, 每个工厂创造自己对应的产品类型
- Iterator 设计模式 在 ConcreteCircularOrbit 里,有一个重写迭代器的方法,从内到外遍历 轨道
- CircularOrbitAPIs 采用 façade 设计模式,将所有的 API 都放在 CircularOrbitAPIs 中,调 用 CircularOrbitAPIs 来访问其中的 api
- TrackGame 使用 strategy 设计模式来实现比赛的编排方案,包含随机编排和按成绩 编排,由相应的策略 new random 或者 score
- AtomStructure 使用 memento 设计模式来保存电子跃迁前后的多轨道系统模式,主要是 CareTaker 中用 list 来存储 memento,memento 中包含一个多轨道系统模型。