Tuesday, July 26, 2011

Java Recursion - find a number is prime or not

public class TestPrime {

/**
* @param args
*/
public static void main(String[] args) {
int i = 101;
System.out.println("integer:" + i + " is prime:" + isPrime(i, i/2));

}

private static boolean isPrime(int n, int div) {
if (div == 1)
return true;
else if (n%div==0)
return false;
else
return isPrime(n, div - 1);
}

}

Monday, February 22, 2010

Visitor Design Pattern implemented in Groovy

Going through the uses of closures in Groovy, I found it very easy and handy to implement Visitor pattern in this language. Actually, coding is very much less if designed well. Take an example:

class SemMessages {
List messages
def accept(Closure moduleClosure) {messages.each {it.accept(moduleClosure)}}
}

class ModuleMessage {
def module
def message
def accept(Closure moduleClosure) {moduleClosure(this);println "$message message is of $module module.";}
}

class TRDMessage extends ModuleMessage {
def getModuleName() {module = 'TRD'}
}


class STLMessage extends ModuleMessage {
def getModuleName() {module = 'STL';}
}

def semMsgs = new SemMessages(messages:
[new TRDMessage(module:'TRD', message:'TRD01'), new TRDMessage(module:'TRD', message:'TRD02'),
new STLMessage(module:'STL', message:'STL01'), new STLMessage(module:'STL', message:'STL02')])
semMsgs.accept {it.getModuleName()}

Here, SemMessages contains a list of polymorphic objects, viz. TRDMessage and STLMessage (and may be more in future necessity). So, we can implement a visitor pattern over this collection that will enable us to segregate the algorithm getModuleName() from object structure (here List of messages). It gives us the scalability as well, coz we can add new algorithm as well in future for new polymorphic types, suppose ACMMessage(module:'ACM', message:'ACM01'). In that case, we need not to worry about the object structure, only specific operation for new type will be added.

N.B. - this example is just to depict the pattern involved. Note that this code is not compact one, as we may not take module names ('TRD', etc.) as arguments!