软件设计模式-外观模式

  • 外观模式
    • 意图:为子系统中的一组接口提供一个一致的界面。它定义了一个高层接口,使得这一子系统更加容易使用。
    • 例子:编译器提供简单的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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值