訪問者模式
結構圖
demo
public class A {
public void method1(){
System.out.println("I am A");
}
public void method2(B b){
b.show(this);
}
}
public class B {
public void show(A a){
a.method1();
}
}
public class Test {
public static void main(String[] args) {
A a = new A();
a.method1();
a.method2(new B());
}
}
這裏是兩種打印方式,method1只A之間打印,method2是通過B來調用A的打印方法。這裏B就是一個簡單的訪問者。代碼實現
抽象被訪問者Element:/**
* 抽象元素類,被訪問者
*
* @author xukai 2016年4月30日 下午10:42:18
*
*/
public abstract class Element {
/**
* 接受訪問
* @param visitor
*/
public abstract void accept(IVisitor visitor);
public abstract void doSomething();
}
具體被訪問者ConcreteElement:/**
* 具體元素類,被訪問者
*
* @author xukai 2016年4月30日 下午10:46:09
*
*/
public class ConcreteElement1 extends Element {
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
@Override
public void doSomething() {
System.out.println("元素1");
}
}
/**
* 具體元素類,被訪問者
*
* @author xukai 2016年4月30日 下午10:46:30
*
*/
public class ConcreteElement2 extends Element {
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
@Override
public void doSomething() {
System.out.println("元素2");
}
}
/**
* 抽象訪問者
*
* @author xukai 2016年4月30日 下午10:46:00
*
*/
public interface IVisitor {
/**
* 訪問元素1
* @param ele
*/
public void visit(ConcreteElement1 ele);
/**
* 訪問元素2
* @param ele
*/
public void visit(ConcreteElement2 ele);
}
具體訪問者Visitor:/**
* 具體訪問者,可以訪問某個元素
*
* @author xukai 2016年4月30日 下午10:46:34
*
*/
public class Visitor implements IVisitor {
@Override
public void visit(ConcreteElement1 ele) {
ele.doSomething();
}
@Override
public void visit(ConcreteElement2 ele) {
ele.doSomething();
}
}
結構對象ObjectStruture:
package com.xk.day0430.visitor.demo;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* 容器,裝元素,即被訪問者
*
* @author xukai 2016年4月30日 下午10:47:08
*
*/
public class ObjectStruture {
public static List getList() {
List list = new ArrayList();
Random random = new Random();
for (int i = 0; i < 10; i++) {
int a = random.nextInt(100);
if (a > 50) {
list.add(new ConcreteElement1());
} else {
list.add(new ConcreteElement2());
}
}
return list;
}
}
客戶端:
import java.util.List;
public class Client {
public static void main(String[] args) {
List<Element> list = ObjectStruture.getList();
for (Element e : list) {
e.accept(new Visitor());
}
}
}