[Design Patterns] Interpreter Pattern

Interpreter thông dịch viên – là pattern giúp tạo ra một phương thức để định tính một ngôn ngữ hoặc một biểu thức. Interpreter được xếp vào nhóm các pattern Hành Vi. Interpreter triển khai một giao diện biểu thức để thực hiện định tính các yêu cầu nhận được trong bối cảnh cụ thể.

Interpreter thông dịch viên – là pattern giúp tạo ra một phương thức để định tính một ngôn ngữ hoặc một biểu thức.
Interpreter được xếp vào nhóm các pattern Hành Vi.

Interpreter triển khai một giao diện biểu thức để thực hiện định tính các yêu cầu nhận được trong bối cảnh cụ thể.
Pattern này thường được sử dụng để phân tích các cú pháp SQL, hoặc dùng trong các thuật toán xử lý các ký hiệu v.v…

Áp dụng triển khai

sơ đồ các class

Ở đây chúng ta có một phần mềm giúp truy vấn và xác thực thông tin liên quan tới người dùng.
Phần mềm này sẽ đưa ra kết luận đúng hoặc sai khi nhận được tên người dùng và câu hỏi được chọn để hỏi.

Một abstract có tên là Expression được tạo ra để đại diện cho các interpreter
hay các object đại diện cho câu hỏi và sẽ nhận vào tham số để kiểm định và trả lại kết quả
true hoặc false.

Class triển khai Terminal đại diện cho một Expression đơn nguyên giữ các nút dữ liệu để đưa ra nhận định
true hoặc false cho tham số được truyền vào. Bên cạnh đó là 2 class AndOr được sử dụng để
tạo ra các biểu thức Expression kết hợp – tức là kết hợp nhiều nút dữ liệu trở thành một interpreter tổng
thay vì mang mỗi tham số đi hỏi từng interpreter một rồi mới gom kết quả trả lời cho client.

Cách thức hoạt động của chương trình như chúng ta thấy rất đơn giản. Đầu tiên dữ liệu được tải từ database
lên rồi được chuyển thành các Expression đơn nguyên là các Terminal, rồi được ghép thành các Expression
phức hợp hay các interpreter nhận tham số trực tiếp để trả lời câu hỏi. Sau đó thì với mỗi tham số được
truyền vào, các interpreter phức sẽ cho câu trả lời cuối cùng là true hoặc false.

Bước 1

Tạo abstract Expression.

interpreterpattern/Expression.java

packageinterpreterpattern;publicabstractclassExpression{publicabstractbooleaninterpret(String context);}

Bước 2

Tạo class triển khai Terminal và 2 class tổng hợp AndOr.

interpreterpattern/Terminal.java

packageinterpreterpattern;publicclassTerminalextendsExpression{privateString data;publicTerminal(String data){this.data = data;}@Overridepublicbooleaninterpret(String context){return context.contains(data);}}

interpreterpatter/And.java

packageinterpreterpattern;publicclassAndextendsExpression{privateExpression expr1 =null;privateExpression expr2 =null;publicAnd(Expression expr1,Expression expr2
   ){this.expr1 = expr1;this.expr2 = expr2;}@Overridepublicbooleaninterpret(String context){return expr1.interpret(context)&& expr2.interpret(context);}}

interpreterpattern/Or.java

packageinterpreterpattern;publicclassOrextendsExpression{privateExpression expr1 =null;privateExpression expr2 =null;publicOr(Expression expr1,Expression expr2
   ){this.expr1 = expr1;this.expr2 = expr2;}@Overridepublicbooleaninterpret(String context){return expr1.interpret(context)|| expr2.interpret(context);}}

Bước 3

Sử dụng các class Expression để tạo ra các biểu thức dữ liệu và truyền vào một vài tham số hỏi để
kiểm tra hoạt động.

PatternDemo.java

importinterpreterpattern.And;importinterpreterpattern.Expression;importinterpreterpattern.Or;importinterpreterpattern.Terminal;publicclassPatternDemo{publicstaticvoidmain(String[] args){Expression isMale =getMale();Expression isMarriedWoman =getMarriedWoman();System.out.println("John is male? "+ isMale.interpret("John"));System.out.println("Julie is married? "+ isMarriedWoman.interpret("Julie"));}publicstaticExpressiongetMale(){Expression robert =newTerminal("Robert");Expression john =newTerminal("John");returnnewOr(robert, john);}publicstaticExpressiongetMarriedWoman(){Expression julie =newTerminal("Julie");Expression marry =newTerminal("Marry");returnnewAnd(julie, marry);}}

Bước 4

Kiểm chứng lại kết quả được in ra ở console.

console

John is male? true
Julie is married? false

Nguồn: viblo.asia

Bài viết liên quan

9 Mẹo lập trình Web “ẩn mình” giúp tiết kiệm hàng giờ đồng hồ

Hầu hết các lập trình viên (kể cả những người giỏi) đều tốn thời gian x

Can GPT-4o Generate Images? All You Need to Know about GPT-4o-image

OpenAI‘s GPT-4o, introduced on March 25, 2025, has revolutionized the way we create visual con

Khi nào nên dùng main, section, article, header, footer, và aside trong HTML5

HTML5 đã giới thiệu các thẻ ngữ nghĩa giúp cấu trúc nội dung web một cách có

So sánh Webhook và API: Khi nào nên sử dụng?

Trong lĩnh vực công nghệ thông tin và phát triển phần mềm, Webhook và API là hai th