자바 디자인 패턴에 대한 간략한 소개 : 인터프리터 모드

정의

인터프리터 모델은 클래스의 행동 모델입니다. 언어가 주어지면 인터프리터 모델은 문법 표현을 정의하고 동시에 통역사를 제공 할 수 있습니다. 클라이언트는이 인터프리터를 사용하여 언어로 문장을 해석 할 수 있습니다.

의향

언어가 주어지고 문법적 표현을 정의하고 인터프리터를 정의하면이 인터프리터는 식별자를 사용하여 언어로 문장을 해석합니다.

주로 문제 해결

고정 된 문법에 대한 문장을 설명하는 인터프리터 구성

장점과 단점

이점:

  • 우수한 확장 성과 유연성
  • 표현을 해석하는 새로운 방법 추가
  • 간단한 문법을 ​​쉽게 구현

단점 :

  • 적은 사용 시나리오
  • 복잡한 문법을 ​​유지하기가 더 어렵습니다.
  • 클래스 확장을 유발합니다.
  • 재귀 호출 방식을 사용하여 효율성이 낮음

구조

여기에 사진 설명 삽입
관련된 역할 :

  • 추상 표현 (Expression) 역할 : 모든 구체적인 표현 역할이 구현해야하는 추상 인터페이스를 선언합니다.이 인터페이스는 주로 해석 작업이라고하는 해석 방법입니다.
  • TerminalExpression (TerminalExpression) 역할 : 이것은 특정 역할입니다.
    • 주로 인터 프리트 메서드 인 추상 표현의 역할에 필요한 인터페이스 구현
    • 문법의 각 터미널 기호에는 해당하는 특정 터미널 표현식이 있습니다.
  • 비 터미널 표현식 (NonterminalExpression) 역할 : 특정 역할입니다.
    • 문법 R = R1R2 ... Rn의 각 규칙에는 특정 비 터미널 표현식 클래스가 필요합니다.
    • R = R1R2 ... Rn의 각 기호는 정적 유형 표현식의 인스턴스 변수를 보유합니다.
    • 해석 연산의 해석 방법을 구현하고 해석 연산은 R1R2 ... Rn의 심볼을 나타내는 위에서 언급 한 인스턴스 변수를 재귀 적으로 호출합니다.
  • 클라이언트 역할 : 추상 구문 트리 구축, 통화 해석 작업
  • 컨텍스트 역할 : 변수의 실제 값 등과 같은 인터프리터 외부의 일부 전역 정보를 제공합니다.

추상 표현 역할 :

/**
 * 这个抽象类代表终结类和非终结类的抽象化
 */
public abstract class Expression {
    
    

    /** 以环境类为准,本方法解释给定的任何一个表达式 */
    public abstract boolean interpret(Context ctx);

    /** 检验两个表达式在结构上是否相同 */
    public abstract boolean equals(Object o);

    /** 返回表达式的hashCode */
    public abstract int hashCode();

    /** 将表达式转换为字符串 */
    public abstract String toString();
}

최종 표현식 역할 :
여기에 사진 설명 삽입
상수 객체는 부울 상수를 나타냅니다.

public class Constant extends Expression {
    
    
    private boolean value;

    public Constant(boolean value) {
    
    
        this.value = value;
    }

    /** 解释操作 */
    @Override
    public boolean interpret(Context ctx) {
    
    
        return value;
    }

    /** 检验两个表达式在结构上是否相同 */
    @Override
    public boolean equals(Object o) {
    
    
        if (o != null && o instanceof Constant) {
    
    
            return this.value = ((Constant)o).value;
        }
        return false;
    }

    /** 返回表达式的hashCode */
    @Override
    public int hashCode() {
    
    
        return (this.toString()).hashCode();
    }

    /** 将表达式转换为字符串 */
    @Override
    public String toString(){
    
    
        return new Boolean(value).toString();
    }
}

Variable 객체는 명명 된 변수를 나타냅니다.

public class Variable extends Expression {
    
    

    private String name;

    public Variable(String name) {
    
    
        this.name = name;
    }

    /** 解释操作 */
    @Override
    public boolean interpret(Context ctx) {
    
    
        return ctx.lookup(this);
    }

    /** 检验两个表达式在结构上是否相同 */
    @Override
    public boolean equals(Object o) {
    
    
        if (o != null && o instanceof Variable) {
    
    
            return this.name.equals(((Variable)o).name);
        }
        return false;
    }

    /** 返回表达式的hashCode */
    @Override
    public int hashCode() {
    
    
        return (this.toString()).hashCode();
    }

    /** 将表达式转换为字符串 */
    @Override
    public String toString() {
    
    
        return name;
    }
}

비 터미널 식 역할 :
여기에 사진 설명 삽입
두 부울 식의 논리적 AND 연산으로 새 부울 식을 제공하는 작업을 나타냅니다.

public class And extends Expression {
    
    

    private Expression left, right;

    public And(Expression left, Expression right) {
    
    
        this.left = left;
        this.right = right;
    }

    /** 解释操作 */
    @Override
    public boolean interpret(Context ctx) {
    
    
        return left.interpret(ctx) && right.interpret(ctx);
    }

    /** 检验两个表达式在结构上是否相同 */
    @Override
    public boolean equals(Object o) {
    
    
        if (o != null && o instanceof And) {
    
    
            return this.left.equals(((And)o).left) && this.right.equals(((And)o).right);
        }
        return false;
    }

    /** 返回表达式的hashCode */
    @Override
    public int hashCode() {
    
    
        return (this.toString()).hashCode();
    }

    /** 将表达式转换为字符串 */
    @Override
    public String toString() {
    
    
        return "(" + left.toString() + " AND " + right.toString() + ")";
    }
}

두 개의 부울 식에 의한 논리 OR 연산으로 새 부울 식을 제공하는 작업을 나타냅니다.

public class Or extends Expression {
    
    

    private Expression left, right;

    public Or(Expression left, Expression right) {
    
    
        this.left = left;
        this.right = right;
    }

    /** 解释操作 */
    @Override
    public boolean interpret(Context ctx) {
    
    
        return left.interpret(ctx) || right.interpret(ctx);
    }

    /** 检验两个表达式在结构上是否相同 */
    @Override
    public boolean equals(Object o) {
    
    
        if (o != null && o instanceof Or) {
    
    
            return this.left.equals(((Or)o).left) && this.right.equals(((Or)o).right);
        }
        return false;
    }

    /** 返回表达式的hashCode */
    @Override
    public int hashCode() {
    
    
        return (this.toString()).hashCode();
    }

    /** 将表达式转换为字符串 */
    @Override
    public String toString() {
    
    
        return "(" + left.toString() + " OR " + right.toString() + ")";
    }
}

논리 부정을 통해 부울식이 제공하는 새 부울 식의 연산을 나타냅니다.

public class Not extends Expression {
    
    

    private Expression exp;

    public Not(Expression exp) {
    
    
        this.exp = exp;
    }

    /** 解释操作 */
    @Override
    public boolean interpret(Context ctx) {
    
    
        return !exp.interpret(ctx);
    }

    /** 检验两个表达式在结构上是否相同 */
    @Override
    public boolean equals(Object o) {
    
    
        if (o != null && o instanceof Not) {
    
    
            return this.exp.equals(((Not)o).exp);
        }
        return false;
    }

    /** 返回表达式的hashCode */
    @Override
    public int hashCode() {
    
    
        return (this.toString()).hashCode();
    }

    /** 将表达式转换为字符串 */
    @Override
    public String toString() {
    
    
        return "(Not " + exp.toString() + ")";
    }
}

환경 클래스는 변수에서 부울 값으로의 매핑을 정의합니다.

public class Context {
    
    

    private HashMap map = new HashMap();

    public void assign(Variable var, boolean value) {
    
    
        map.put(var, new Boolean(value));
    }

    public boolean lookup(Variable var) {
    
    
        Boolean value = (Boolean) map.get(var);
        if (value == null) {
    
    
            throw  new IllegalArgumentException();
        }
        return value.booleanValue();
    }
}

클라이언트 역할 :

public class Client {
    
    
    private static Context ctx;
    private static Expression exp;

    public static void main(String[] args) {
    
    
        ctx = new Context();
        Variable x = new Variable("x");
        Variable y = new Variable("y");
        Constant c = new Constant(true);
        ctx.assign(x, false);
        ctx.assign(y, true);
        exp = new Or(new And(c, x), new And(y, new Not(x)));
        System.out.println("x= " + x.interpret(ctx));
        System.out.println("y= " + y.interpret(ctx));
        System.out.println(exp.toString() + " = " + exp.interpret(ctx));
    }
}

여기에 사진 설명 삽입

적용 가능한 상황

  • 시스템에는 설명 할 간단한 언어가 있습니다.
  • 일부 반복되는 문제는이 간단한 언어로 표현할 수 있습니다.
  • 효율성은 주요 고려 사항이 아닙니다.

추천

출처blog.csdn.net/qq_34365173/article/details/108559975