概要:
该文章参考了《设计模式之禅》一书及一些前辈的博客文章
1.该文章阐述了访问者模式的基础原理及示例代码;
2.该文章适合初学设计模式的技术人员研习;
3.该文章有许多不足之处,请各位大咖指正,喷子绕道;
正文:
访问者模式:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
1.通用访问者模式模板代码实现:
package com.csdn;
/**
* 抽象元素
* @author Administrator
*
*/
public abstract class Element {
//定义业务逻辑
public abstract void doSomething();
//允许谁访问
public abstract void accept(IVisitor visitor);
}
package com.csdn;
/**
* 具体元素A
* @author Administrator
*
*/
public class ConcreteElementA extends Element{
//完善业务逻辑
@Override
public void doSomething() {
System.out.println("元素A");
}
//允许哪个访问者访问
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
package com.csdn;
/**
* 具体元素B
* @author Administrator
*
*/
public class ConcreteElementB extends Element{
//完善业务逻辑
@Override
public void doSomething() {
System.out.println("元素B");
}
//允许哪个访问者访问
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
package com.csdn;
/**
* 抽象访问者
* @author Administrator
*
*/
public interface IVisitor {
//可以访问哪些对象
public void visit(ConcreteElementA cea);
public void visit(ConcreteElementB ceb);
}
package com.csdn;
/**
* 具体访问者
* @author Administrator
*
*/
public class Visitor implements IVisitor {
//访问A元素
@Override
public void visit(ConcreteElementA cea) {
cea.doSomething();
}
//访问B元素
@Override
public void visit(ConcreteElementB ceb) {
ceb.doSomething();
}
}
package com.csdn;
import java.util.Random;
/**
* 结构对象
* @author Administrator
*
*/
public class ObjectStruture {
//对象生成器
public static Element createElement(){
Random random = new Random();
if(random.nextInt(100) > 50){
return new ConcreteElementA();
}else{
return new ConcreteElementB();
}
}
}
package com.csdn;
/**
* 场景类
* @author Administrator
*
*/
public class Client {
public static void main(String[] args) {
for(int i = 0 ; i < 10 ; i++){
//获得元素
Element element = ObjectStruture.createElement();
//接受访问者访问
element.accept(new Visitor());
}
}
}
输出:(输出结果不确定)
元素B
元素A
元素B
元素A
元素A
元素A
元素B
元素A
元素A
元素A
注:
a:访问者模式有抽象访问者、具体访问者、抽象元素、具体元素、结构对象五个角色。
未完待续…