Sunny 软件公司欲为数据库备份和同步开发一套简单的数据库同步指令,通过指令可以对数据库中的数据和结构进行备份。例如,输入指令“COPY VIEW FROM srcDB TO desDB”表示将数据库 srcDB 中的所有视图(View)对象复制至数据库 desDB;输入指令“MOVE TABLE Student FROM srcDB TO desDB”表示将数据库 srcDB 中的 Student 表移动至数据库 desDB。试使用解释器模式来设计并实现该数据库同步指令。
一、类结构图
抽象表达式类:设计为名称为 AbstractNode 的抽象类,包含抽象文法 interpret();
终结表达式类:设计为抽象表达式类的子类,包括终结表达式类 ActionNode、终结表达式类 FromNode、终结表达式类 ToNode,分别实现抽象表达式类的抽象方法 interpret();
非终结表达式类:设计为抽象表达式类的子类,设计为名称为 ExpressionNode 的具体类,面向抽象表达式类编程,持有终结表达式类 ActionNode、终结表达式类 FromNode、终结表达式类 ToNode 的引用,并实现抽象表达式类的抽象方法 interpret();
指令处理具体类:设计为名称为 InstructionHandler 的具体类,面向抽象表达式类编程,持有一个抽象表达式类的引用,包含具体方法 handle(String instruction)、具体方法 output()。
二、典型实现代码
操作指令抽象表达式类:抽象表达式类
// 操作指令抽象表达式类:抽象表达式类
public abstract class AbstractNode {
public abstract String interpret();
}
复制代码
执行表达式类:终结表达式类
// 执行表达式类:终结表达式类
public class ActionNode extends AbstractNode{
private String action;
public ActionNode(String action) {
this.action = action;
}
@Override
public String interpret() {
String[] wordList = action.trim().split("\\s");
int wordCount = wordList.length;
if (wordCount == 2) {
return action + " *";
}
return action;
}
}
复制代码
源数据库表达式类:终结表达式类
// 源数据库表达式类:终结表达式类
public class FromNode extends AbstractNode{
private String from;
public FromNode(String from) {
this.from = from;
}
@Override
public String interpret() {
return "FROM " + from;
}
}
复制代码
目标数据库表达式类:终结表达式类
// 目标数据库表达式类:终结表达式类
public class ToNode extends AbstractNode{
private String to;
public ToNode(String to) {
this.to = to;
}
@Override
public String interpret() {
return "TO " + to;
}
}
复制代码
操作语句表达式类:非终结表达式类
// 操作语句表达式类:非终结表达式类
public class ExpressionNode extends AbstractNode {
private AbstractNode action;
private AbstractNode from;
private AbstractNode to;
public ExpressionNode(AbstractNode action, AbstractNode from, AbstractNode to) {
this.action = action;
this.from = from;
this.to = to;
}
@Override
public String interpret() {
return this.action.interpret() + " "
+ this.from.interpret() + " "
+ this.to.interpret();
}
}
复制代码
指令处理具体类
// 指令处理具体类
public class InstructionHandler {
private AbstractNode node;
public void handle(String instruction) {
AbstractNode actionNode, fromNode, toNode, expressionNode;
int fromIndex = instruction.indexOf(" FROM ");
int toIndex = instruction.indexOf(" TO ");
String action = instruction.substring(0, fromIndex);
String from = instruction.substring(fromIndex + 6, toIndex);
String to = instruction.substring(toIndex + 4);
actionNode = new ActionNode(action);
fromNode = new FromNode(from);
toNode = new ToNode(to);
expressionNode = new ExpressionNode(actionNode, fromNode, toNode);
this.node = expressionNode;
}
public void output() {
String result = node.interpret();
System.out.println(result);
}
}
复制代码
客户端代码:
public class Client {
public static void main(String[] args) {
String instruction = "COPY VIEW FROM dbA TO dbB";
InstructionHandler instructionHandler = new InstructionHandler();
instructionHandler.handle(instruction);
instructionHandler.output();
instruction = "MOVE TABLE Student FROM dbA TO dbB";
instructionHandler.handle(instruction);
instructionHandler.output();
}
}
复制代码
编译并运行程序,输出如下结果:
COPY VIEW * FROM dbA TO dbB
MOVE TABLE Student FROM dbA TO dbB
复制代码
评论