Wzorce projektowe: Visitor

Podstawowym zadaniem wzorca projektowego Wizytator (Visitor) oddzielenie kodu implementującego pewien określony algorytm od obiektów różnych typów.
Przy implementacji wzorca, z reguły chodzi nie o obiekty same w sobie a o możliwość dynamicznej podmiany algorytmu.

package pl.roboczenotatki.designpatterns.visitor;

public class App 
{
    public static void main( String[] args )
    {
    	System.out.println( "Design pattern: Visitor" );
    	
    	Visitor grandmother = new Grandmother();
    	
    	Visitable father = new Father();
    	Visitable mother = new Mother();
    	
    	House house = new House();
    	house.addResident(mother);
    	house.addResident(father);
    	
    	house.visit(grandmother);
    }
}

Interfejs Visitable – interfejs implementowany przez obiekty, które otrzymują dodatkową logikę. W naszym przykładzie Ojciec, Matka

package pl.roboczenotatki.designpatterns.visitor;

public interface Visitable {
	public void accept(Visitor visitor);
}

Interfejs Visitor – ten interfejs implementować będą obiekty, (w naszym przypadku jeden obiekt Babcia) które wprowadzają algorytm (dodatkową logikę).

package pl.roboczenotatki.designpatterns.visitor;

public interface Visitor {
	public void visit(Mother visitable);
	public void visit(Father visitable);
}

House – chociaż implementuje interfejs Odwiedzany, nie dodaje dodatkowej logiki, a jedynie przekazuje ją innym zgrupowanym przez siebie obiektom. Babcia (nasz wizytator) nie odwiedza domu dla niego samego a dla domowników w nim zawartych. Dom jest jedynie opakowaniem na właściwe obiekty.
Dom może przyjąć nowego mieszkańca lub zaakceptować gościa. Jeżeli dom zaakceptuje gościa, to tym samym zaakceptują go wszyscy jego mieszkańcy.

package pl.roboczenotatki.designpatterns.visitor;

import java.util.ArrayList;
import java.util.List;

public class House {
	private List<Visitable> residents;
	
	public void addResident(Visitable resident){
		getResidents().add(resident);
	}
	
	public void visit(Visitor visitor){
		for (Visitable resident : getResidents()) {
			resident.accept(visitor);
		}
	}
	
	private List<Visitable> getResidents(){
		if(residents == null){
			residents = new ArrayList<Visitable>();
		}
		return residents;
	}
}
package pl.roboczenotatki.designpatterns.visitor;

public class Mother implements Visitable{

	public void accept(Visitor visitor) {
		visitor.visit(this);
	}
}

package pl.roboczenotatki.designpatterns.visitor;

public class Father implements Visitable{

	public void accept(Visitor visitor) {
		visitor.visit(this);
	}

}

package pl.roboczenotatki.designpatterns.visitor;

public class Grandmother implements Visitor{

	public void visit(Mother visitable) {
		System.out.println("Hello from Grandmother to Mother");
	}

	public void visit(Father visitable) {
		System.out.println("Hello from Grandmother to Father");
	}

}

źródło: http://blog.smentek.pl/2010/02/09/wzorzec-projektowy-wizytator/

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s