软件设计模式-外观模式

  • 外观模式
    • 意图:为子系统中的一组接口提供一个一致的界面。它定义了一个高层接口,使得这一子系统更加容易使用。
    • 例子 :编译器提供简单的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);
    }
}
相关推荐
太过平凡的小蚂蚁14 天前
外观模式:复杂系统的统一入口
外观模式
Yeniden14 天前
【设计模式】# 外观模式(Facade)大白话讲解!
java·设计模式·外观模式
杯莫停丶21 天前
设计模式之:外观模式
java·设计模式·外观模式
WaWaJie_Ngen22 天前
【设计模式】外观模式/门面模式(Facaed)
设计模式·外观模式
Meteors.25 天前
23种设计模式——外观模式(Facade Pattern)详解
设计模式·外观模式
胖虎125 天前
iOS中的设计模式(九)- 外观模式 用外观模式点一份外卖:Swift 实战讲解
设计模式·外观模式
czy878747525 天前
用C语言实现外观模式
c语言·外观模式
Deschen1 个月前
设计模式-外观模式
java·设计模式·外观模式
Mr_WangAndy1 个月前
C++设计模式_结构型模式_外观模式Facade
c++·设计模式·外观模式