public abstract class ExpresieBinara extends Expresie {
private Expresie operandSt, operandDr;
public ExpresieBinara(Expresie operandSr, Expresie operandDr) { this.operandSt = operandSr; this.operandDr = operandDr; } public Expresie operandSt() { return operandSt; } public Expresie operandDr() { return operandDr; } } public class Inmultire extends ExpresieBinara { public Inmultire(Expresie st, Expresie dr) { super(st,dr); } public void accept(Visitor v) { v.visitInmultire(this); } }
class Suma extends ExpresieBinara {
public Suma(Expresie st, Expresie dr) { super(st,dr); } public void accept(Visitor v) { v.visitSuma(this); } }
public class Numar extends Expresie {
private int literal; public Numar(int literal) { this.literal = literal; } public int getNumar() { return literal; } public void accept(Visitor v) { v.visitNumar(this); } }
public class Parcurgere implements Visitor {
public void visitNumar(Numar n) { System.out.print(n.getNumar()); } public void visitSuma(Suma s) { s.operandSt().accept(this); s.operandDr().accept(this); System.out.print('+'); } public void visitInmultire(Inmultire i) { i.operandSt().accept(this); i.operandDr().accept(this); System.out.print('*'); } }
public class Main {
public static void main(String argv[]) { Numar nr1 = new Numar(5); Numar nr2 = new Numar(6); Numar nr3 = new Numar(0); Suma sum = new Suma(nr1,nr2); Inmultire prod = new Inmultire(sum,nr3); prod.accept(new Parcurgere()); } }