- 外观模式
- 意图:为子系统中的一组接口提供一个一致的界面。它定义了一个高层接口,使得这一子系统更加容易使用。
- 例子:编译器提供简单的
compile()接口,背后隐藏了词法分析、语法分析、语义分析、代码生成等复杂步骤。
import java.util.Arrays;
import java.util.List;// 子系统1:词法分析器
class Lexer {public List<String> tokenize(String sourceCode) {System.out.println("词法分析:将源代码分割成token序列");// 简化的token化过程String[] tokens = sourceCode.split("\\s+");return Arrays.asList(tokens);}
}// 子系统2:语法分析器
class Parser {public void parse(List<String> tokens) {System.out.println("语法分析:检查token序列是否符合语法规则");// 简化的语法分析System.out.println("生成抽象语法树(AST)");}
}// 子系统3:语义分析器
class SemanticAnalyzer {public void analyze() {System.out.println("语义分析:检查类型、作用域等语义规则");// 简化的语义分析System.out.println("语义分析完成,未发现错误");}
}// 子系统4:中间代码生成器
class IntermediateCodeGenerator {public void generate() {System.out.println("生成中间代码:将AST转换为中间表示");// 简化的中间代码生成System.out.println("生成三地址码或字节码");}
}// 子系统5:代码优化器
class CodeOptimizer {public void optimize() {System.out.println("代码优化:对中间代码进行优化");// 简化的优化过程System.out.println("完成常量传播、死代码消除等优化");}
}// 子系统6:目标代码生成器
class CodeGenerator {public void generate() {System.out.println("生成目标代码:将优化后的中间代码转换为目标机器代码");// 简化的代码生成System.out.println("生成x86汇编代码或JVM字节码");}
}// 外观类:编译器 - 提供简化的compile接口
class Compiler {private Lexer lexer;private Parser parser;private SemanticAnalyzer semanticAnalyzer;private IntermediateCodeGenerator intermediateCodeGenerator;private CodeOptimizer codeOptimizer;private CodeGenerator codeGenerator;public Compiler() {this.lexer = new Lexer();this.parser = new Parser();this.semanticAnalyzer = new SemanticAnalyzer();this.intermediateCodeGenerator = new IntermediateCodeGenerator();this.codeOptimizer = new CodeOptimizer();this.codeGenerator = new CodeGenerator();}// 高层接口:隐藏了复杂的编译过程public void compile(String sourceCode) {System.out.println("开始编译源代码...\n");// 步骤1:词法分析List<String> tokens = lexer.tokenize(sourceCode);System.out.println("Token序列: " + tokens + "\n");// 步骤2:语法分析parser.parse(tokens);System.out.println();// 步骤3:语义分析semanticAnalyzer.analyze();System.out.println();// 步骤4:中间代码生成intermediateCodeGenerator.generate();System.out.println();// 步骤5:代码优化codeOptimizer.optimize();System.out.println();// 步骤6:目标代码生成codeGenerator.generate();System.out.println("\n编译完成!");}// 可选:提供更细粒度的控制方法public void compileToIntermediateCode(String sourceCode) {System.out.println("编译到中间代码...");List<String> tokens = lexer.tokenize(sourceCode);parser.parse(tokens);semanticAnalyzer.analyze();intermediateCodeGenerator.generate();System.out.println("中间代码生成完成!");}
}// 客户端代码
public class FacadePatternDemo {public static void main(String[] args) {// 创建编译器外观Compiler compiler = new Compiler();// 简单的源代码示例String sourceCode = "public class Hello { public static void main(String[] args) { System.out.println(\"Hello World\"); } }";System.out.println("源代码:");System.out.println(sourceCode + "\n");// 客户端只需要调用简单的compile方法,不需要了解内部复杂过程compiler.compile(sourceCode);System.out.println("\n" + "=".repeat(50) + "\n");// 也可以选择只编译到中间代码compiler.compileToIntermediateCode(sourceCode);}
}