Wednesday, December 05, 2007

More patterns

http://www.java-interview.com/design_patterns_interview_questions.html

Factory method

public abstract class EiskugelAutomat{
Eiskugel eiskugel; //programmieren gegen Abstraktion (hier abstrakte Klasse)

// factory-Methode muss von konkreten Eiskugelautomaten impl. werden
protected abstract Eiskugel createEiskugel(String typ);

public Eiskugel getEiskugel(String typ){
eiskugel = createEiskugel(typ); // uns interessiert nicht, welche Art von Eiskugel wir bekommen
return ek;
}
}
public class StandardEiskugelAutomat extends EiskugelAutomat{
protected Eiskugel createEiskugel(String typ){
if(typ.equals("erdbeer")){
eiskugel = new ErdbeerEiskugel();
}
else if(typ.equals("schoko")){
eiskugel = new SchokoEiskugel();
} ...
return eiskugel;
}
}
public class DiƤtEiskugelAutomat extends EiskugelAutomat{
protected Eiskugel createEiskugel(String typ){
if(typ.equals("erdbeer")){
eiskugel = new DiƤtErdbeerEiskugel();
}
else if(typ.equals("schoko")){
eiskugel = new DiƤtSchokoEiskugel();
} ...
return eiskugel;
}
}

Abstract Factory Pattern

public abstract class Eiskugel{
//allgemeine Eigenschaften und Methoden
...
}
public class ErdbeerEiskugel extends Eiskugel{
public String toString(){
return "Erdbeereiskugel";
}
}
public class SchokoEiskugel extends Eiskugel{
public String toString(){
return "Schokoeiskugel";
}
}

public class EiskugelFactory{
Eiskugel eiskugel;
public Eiskugel createEiskugel(String typ){
if(typ.equals("erdbeer")){
eiskugel = new ErdbeerEiskugel(); //konkrete Implementierung!
}
else if(typ.equals("schoko")){
eiskugel = new SchokoEiskugel(); //konkrete Implementierung!
} ...
return eiskugel;
}
}

Delegate Pattern

Example

class A {
void f() { System.out.println("A: doing f()"); }
void g() { System.out.println("A: doing g()"); }
}

class C {
// delegation
A a = new A();

void f() { a.f(); }
void g() { a.g(); }

// normal attributes
X x = new X();
void y() { /* do stuff */ }
}

public class Main {
public static void main(String[] args) {
C c = new C();
c.f();
c.g();
}
}

Visitor Pattern

Advantage of the visitor pattern
- Easy to add new opeartions to the datastructure by adding new visitors: (see http://de.wikipedia.org/wiki/Besucher_(Entwurfsmuster))

Disadvantages of the visitor pattern
- New classes of datastructure elements (e.g. Body) requires to change all visitors, see also classes marked with * in example



Example:

interface Visitor {
void visit(Wheel wheel);
void visit(Engine engine);
* void visit(Body body);
void visit(Car car);
}

class PrintVisitor implements Visitor {

public void visit(Wheel wheel) {
System.out.println("Visiting "+ wheel.getName()
+ " wheel");
}
public void visit(Engine engine) {
System.out.println("Visiting engine");
}
* public void visit(Body body) {
System.out.println("Visiting body");
}
public void visit(Car car) {
System.out.println("Visiting car");
}

}

class DoVisitor implements Visitor {
public void visit(Wheel wheel) {
System.out.println("Steering my wheel");
}
public void visit(Engine engine) {
System.out.println("Starting my engine");
}
* public void visit(Body body) {
System.out.println("Moving my body");
}
public void visit(Car car) {
System.out.println("Vroom!");
}
}
interface Visitable {
void accept(Visitor visitor);
}

class Body implements Visitable{
public void accept(Visitor visitor) {
visitor.visit(this);
}
}

class Car implements Visitable {

public void accept(Visitor visitor) {
visitor.visit(this);
engine.accept(visitor);
body.accept(visitor);
for(Wheel wheel : wheels) {
wheel.accept(visitor);
}
}

Hole example you find here:
http://en.wikipedia.org/wiki/Visitor_pattern