Mẫu thiết kế - Mẫu phiên dịch
Mẫu phiên dịch cung cấp một cách để đánh giá ngữ pháp hoặc cách diễn đạt ngôn ngữ. Loại khuôn mẫu này thuộc khuôn mẫu hành vi. Mẫu này liên quan đến việc triển khai một giao diện biểu thức để diễn giải một ngữ cảnh cụ thể. Mẫu này được sử dụng trong phân tích cú pháp SQL, công cụ xử lý ký hiệu, v.v.
Thực hiện
Chúng ta sẽ tạo một giao diện Biểu thức và các lớp cụ thể triển khai giao diện Biểu thức . Một lớp TerminalExpression được định nghĩa hoạt động như một trình thông dịch chính của ngữ cảnh được đề cập. Các lớp khác OrExpression , AndExpression được sử dụng để tạo các biểu thức tổ hợp.
InterpreterPatternDemo , lớp demo của chúng tôi, sẽ sử dụng lớp Expression để tạo quy tắc và trình diễn phân tích cú pháp các biểu thức.
Bước 1
Tạo giao diện biểu thức.
Expression.java
public interface Expression {
public boolean interpret(String context);
}
Bước 2
Tạo các lớp cụ thể thực hiện giao diện trên.
TerminalExpression.java
public class TerminalExpression implements Expression {
private String data;
public TerminalExpression(String data){
this.data = data;
}
@Override
public boolean interpret(String context) {
if(context.contains(data)){
return true;
}
return false;
}
}
OrExpression.java
public class OrExpression implements Expression {
private Expression expr1 = null;
private Expression expr2 = null;
public OrExpression(Expression expr1, Expression expr2) {
this.expr1 = expr1;
this.expr2 = expr2;
}
@Override
public boolean interpret(String context) {
return expr1.interpret(context) || expr2.interpret(context);
}
}
AndExpression.java
public class AndExpression implements Expression {
private Expression expr1 = null;
private Expression expr2 = null;
public AndExpression(Expression expr1, Expression expr2) {
this.expr1 = expr1;
this.expr2 = expr2;
}
@Override
public boolean interpret(String context) {
return expr1.interpret(context) && expr2.interpret(context);
}
}
Bước 3
InterpreterPatternDemo sử dụng lớp Expression để tạo các quy tắc và sau đó phân tích cú pháp chúng.
InterpreterPatternDemo.java
public class InterpreterPatternDemo {
//Rule: Robert and John are male
public static Expression getMaleExpression(){
Expression robert = new TerminalExpression("Robert");
Expression john = new TerminalExpression("John");
return new OrExpression(robert, john);
}
//Rule: Julie is a married women
public static Expression getMarriedWomanExpression(){
Expression julie = new TerminalExpression("Julie");
Expression married = new TerminalExpression("Married");
return new AndExpression(julie, married);
}
public static void main(String[] args) {
Expression isMale = getMaleExpression();
Expression isMarriedWoman = getMarriedWomanExpression();
System.out.println("John is male? " + isMale.interpret("John"));
System.out.println("Julie is a married women? " + isMarriedWoman.interpret("Married Julie"));
}
}
Bước 4
Xác minh kết quả đầu ra.
John is male? true
Julie is a married women? true