2019年5月13日 星期一

7天學會設計模式 CHAP19 解譯器模式 Interpreter

7天學會設計模式
http://www.books.com.tw/products/0010750585

chap19.
解譯器模式 Interpreter
目的:定義一個語言與其文法,使用一個解譯器來表示這個語言的敘述
package com.ssc24.chap19.demo01;
public class Context {
 private String text;
 public String getText() {
  return text;
 }
 public void setText(String text) {
  this.text = text;
 }
}

package com.ssc24.chap19.demo01;
public abstract class Expression {
 public void interprep(String str) {
  if (str.length() > 0) {
   String text = str.substring(1,str.length());
   Integer number = Integer.valueOf(text);
   excute(number);
  }
 }
 protected abstract void excute(Integer number);
}

package com.ssc24.chap19.demo01;
public class DownExpression extends Expression {
 @Override
 protected void excute(Integer number) {
  System.out.print(number / 2 + " ");
 }
}

package com.ssc24.chap19.demo01;
public class UpExpression extends Expression {
 @Override
 protected void excute(Integer number) {
  System.out.print(number * 2 + " ");
 }
}

package com.ssc24.chap19.demo01;
import static org.junit.Assert.*;
import org.junit.Test;
public class InterpretTest {
 @Test
 public void test() {
  Expression ex ;
  Context context = new Context();
  context.setText("A4461 B1341 A676 B1787");
  System.out.println("===解譯器模式測試===");
  System.out.println("待解譯內容為:" + context.getText());
  System.out.println("---解譯結果---");
  for (String str : context.getText().split("\\s")) {
   if (str.charAt(0) == 'A') {
    ex = new UpExpression();
   } else {
    ex = new DownExpression();
   }
   ex.interprep(str);
  }
 }
}

/**
===解譯器模式測試===
待解譯內容為:A4461 B1341 A676 B1787
---解譯結果---
8922 670 1352 893 
**/