写点什么

设计模式的艺术 第十八章解释器设计模式练习(为数据库备份和同步开发一套简单的数据库同步指令,指令可对数据库中的数据和结构进行备份。例如,输入指令“COPY VIEW FROM srcDB TO desDB”表示将 srcDB 中所有视图对象复制至 desDB)

作者:代廉洁
  • 2022 年 9 月 02 日
    浙江
  • 本文字数:2056 字

    阅读完需:约 7 分钟

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 dbBMOVE TABLE Student FROM dbA TO dbB
复制代码


发布于: 20 分钟前阅读数: 7
用户头像

代廉洁

关注

还未添加个人签名 2019.10.15 加入

还未添加个人简介

评论

发布
暂无评论
设计模式的艺术 第十八章解释器设计模式练习(为数据库备份和同步开发一套简单的数据库同步指令,指令可对数据库中的数据和结构进行备份。例如,输入指令“COPY VIEW FROM srcDB TO desDB”表示将srcDB中所有视图对象复制至desDB)_设计模式的艺术_代廉洁_InfoQ写作社区