// BEHAVIOR //======================================================================== // A simple DJ program for checking capacity // constraints for recursive containers. // Three behavioral concerns: Checking, Summing, Difference // abbreviated C S I // Two generic concerns: traversal, behavior modification (visitor) // count transition points, except in formal or actual parameters Container { {{ // ordering of visitors is important // difference must be initalized before it is used // after methods are called in reverse order of appearance // it is important that DifferenceVisitor is after CheckingVisitor // could also use: CheckingVisitorDJ DifferenceVisitorDJ SummingVisitorDJ ordering // traverse while counting and summing int checkCapacityDJ(TraversalGraph whereToGo) { CheckingVisitorDJ cV = new CheckingVisitorDJ(); //1 SummingVisitorDJ sV = new SummingVisitorDJ(); //1 DifferenceVisitorDJ iV = new DifferenceVisitorDJ(); //1 cV.set_iV(iV); //2 iV.set_sV(sV); //2 // old version // Visitor[] visitors = new Visitor[3]; // visitors[0]=(Visitor) iV; // visitors[1]=(Visitor) sV; // visitors[2]=(Visitor) cV; // System.out.println("visitors prepared"); // Integer res = (Integer) whereToGo.traverse(this, visitors); Integer res = (Integer) whereToGo.traverse(this, new Visitor[] { iV, sV, cV }); return res.intValue(); } }} } //1 CheckingVisitorDJ { {{ public void start() { violations=0; System.out.println("begin"); } public void before(Container o) { System.out.println(" start new container ");} public void after(Container host) { int cap = host.get_capacity().get_i().intValue(); int diff = ((Integer) iV.getReturnValue()).intValue(); if (diff > cap) { this.set_violations(get_violations() + 1); System.out.println(" total weight " + diff + " but limit is = " + cap + " OVER CAPACITY "); }; System.out.println(" end container "); } public Object getReturnValue() {return new Integer(violations);} }} } //1 // it is better to return difference DifferenceVisitorDJ { {{ // stack handling public void start() { stack = new Stack(); } public void before(Container o) { stack.push(sV.getReturnValue()); } public void after(Container o) { difference = ((Integer) sV.getReturnValue()).intValue() - ((Integer) stack.pop()).intValue(); } public Object getReturnValue() {return new Integer(difference);} }} }