package interpreter;

import java.util.ArrayList;
import java.util.List;

/*
 * 解释器模式:
 * 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释解释语言中的句子
 * 
 * 如果一种特定类型的问题发生的频率足够高,那么可能就值得讲该问题的各个势力表述为一个简单语言中的句子,
 * 这样就可以构建一个解释器,该解释器通过解释这些句子来解决问题~
 * 
 * 说白了这就像是一个翻译,对就是把一些经常使用的xxx 转换成 yyy  
 * 不是很懂 没关系 用 一个例子来说明。
 * 小明想Kaitlyn表白  小明很笨 不会说英语 只能用汉语表白 这时候他写了一些程序 来把汉语转换成英语(当然这里不是真正的转换,只是强调这个英语转汉语的结果  而不是技术本身)
 * 
 * 小笨也想跟Kaitlyn表白 但是小笨是韩国人 只会说韩语  他不会写程序 所以他找到小明,让小明在自己写的代码中加一个他的韩语转换英语,
 * 小明这个人比较大度,写就写呗,公平竞争,无非也就是给抽象的解释器加一个子类而已
 * 
 * 自己理解就到这里了 如果有问题可以相互讨论
 */
public class Interpreter {
	public static void main(String[] args) {
		List<Context> biaobai = new ArrayList<Context>();
		//小笨开始表白内容
		Context context = new Context();
		context.setType("韩语");
		context.setSentence("사 랑 해");
		biaobai.add(context);
		//小明表白内容
		Context context2 = new Context();
		context2.setType("中文");
		context2.setSentence("我 爱 你");
		biaobai.add(context2);
		//解释器
		for (Context cont : biaobai) {
			Expresion expresion = null;
			switch (cont.getType()) {
			case "韩语":
				expresion =new HExpresion();
				break;
			case "中文":
				expresion =new CExpresion();
				break;
			default:
				break;
			}
			//先判断是不是null 这里可能来一个小日本表白 那我是识别不了他的类型的
			if(expresion != null){
				expresion.Interpret(cont);
			}
		}
	}
}

/*
 * 生命一个抽象的解释操作
 */
abstract class Expresion{
	protected abstract  void Interpret(Context context);
}

/*
 * 中文翻译
 */
class CExpresion extends Expresion{
	protected void Interpret(Context context) {
	//先判断内容是不是空
	if(context == null || context.getSentence() == null){
		System.out.println("说话啊!");
		return;
	}
	
	//如果不是空 进行下边的处理
	//以空格分割 获取: 我 爱  你 
	String [] msgs = context.getSentence().split(" ");
	System.out.println("中文转英文:");
	for (String msg : msgs) {
		 switch (msg) {
			case "我":
				System.out.print("I ");
				break;
			case "爱":
				System.out.print("LOVE ");
				break;
			case "你":
				System.out.print("YOU ");
				break;
			default:
				break;
			}
	}
	  System.out.println("!");
	}
}
/*
 * 韩语翻译
 */
class HExpresion extends Expresion{
	protected void Interpret(Context context) {
		//先判断内容是不是空
		if(context == null || context.getSentence() == null){
			System.out.println("말해봐.");
			return;
		}
		
		//如果不是空 进行下边的处理
		//以空格分割 获取: 我 爱  你 
		System.out.println("韩语转英语:");
		String [] msgs = context.getSentence().split(" ");
		for (String msg : msgs) {
			 switch (msg) {
				case "사":
					System.out.print("I ");
					break;
				case "랑":
					System.out.print("LOVE ");
					break;
				case "해":
					System.out.print("YOU ");
					break;
				default:
					break;
				}
		}
		  System.out.println("!");
		}
}

/*
 * 解释器之外的其他信息 比如存放需要翻译的句子 存放需要翻译语言的类型等
 */
class Context{
	//语言类型
   public  String type ;
   //语言内容
   public String sentence;
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public String getSentence() {
		return sentence;
	}
	public void setSentence(String sentence) {
		this.sentence = sentence;
	}
   
}