软件设计模式-外观模式

  • 外观模式
    • 意图:为子系统中的一组接口提供一个一致的界面。它定义了一个高层接口,使得这一子系统更加容易使用。
    • 例子 :编译器提供简单的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);
    }
}
相关推荐
geovindu7 天前
go: Facade Pattern
设计模式·golang·外观模式
ximu_polaris8 天前
设计模式(C++)-结构型模式-外观模式
c++·设计模式·外观模式
我爱cope9 天前
【从0开始学设计模式-11| 外观模式】
microsoft·设计模式·外观模式
Rsun0455115 天前
9、Java 外观模式从入门到实战
java·开发语言·外观模式
大数据新鸟1 个月前
设计模式详解——外观模式
设计模式·外观模式
无籽西瓜a1 个月前
【西瓜带你学设计模式 | 第十期 - 外观模式】外观模式 —— 子系统封装实现、优缺点与适用场景
java·后端·设计模式·软件工程·外观模式
砍光二叉树1 个月前
【设计模式】结构型-外观模式
设计模式·外观模式
青春易逝丶1 个月前
外观模式
外观模式
sg_knight2 个月前
外观模式(Facade)
开发语言·python·外观模式·facade
JTCC2 个月前
Java 设计模式西游篇 - 第九回:外观模式简化繁 如来神掌一指定
java·设计模式·外观模式