- 外观模式
- 意图:为子系统中的一组接口提供一个一致的界面。它定义了一个高层接口,使得这一子系统更加容易使用。
- 例子 :编译器提供简单的
compile()接口,背后隐藏了词法分析、语法分析、语义分析、代码生成等复杂步骤。
java
复制代码
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);
}
}