设计模式复习,代码是最好的说明。
定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作,属于行为类模式。
UML:
代码:
abstract class Element{
public abstract void accept(IVisitor visitor);
public abstract void doSomething();
}
interface IVisitor{
public void visit(ConcreteElement1 concreteElement1);
public void visit(ConcreteElement2 concreteElement2);
}
class ConcreteElement1 extends Element{
public void accept(IVisitor visitor) {
visitor.visit(this);
}
public void doSomething() {
System.out.println("Element1");
}
}
class ConcreteElement2 extends Element{
public void accept(IVisitor visitor) {
visitor.visit(this);
}
public void doSomething() {
System.out.println("Element2");
}
}
class Visitor implements IVisitor{
public void visit(ConcreteElement1 concreteElement1) {
concreteElement1.doSomething();
}
public void visit(ConcreteElement2 concreteElement2) {
concreteElement2.doSomething();
}
}
class ObjectStruture{
public static List<Element> getList(){
List<Element> list = new ArrayList<Element>();
for (int i = 0; i <10 ; i++) {
if (new Random().nextInt(100)>50)
list.add(new ConcreteElement1());
else
list.add(new ConcreteElement2());
}
return list;
}
}
public class Client {
public static void main(String[] args) {
List <Element>list = ObjectStruture.getList();
IVisitor visitor = new Visitor();
for (Element element :list) {
element.accept(visitor);
}
}
}
从定义和代码其实不难理解,访问者模式是就是为了解决“如何操作集合类型中不同类型的对象”这一问题。它比使用ifelse更为灵活、扩展性更好,但是也引入了循环依赖、代码增多、难以理解等问题。不过瑕不掩瑜,利用反射可以使访问者模式更加灵活高效,详见https://www.javaworld.com/article/2077602/learn-java/java-tip-98--reflect-on-the-visitor-design-pattern.html
参考链接:
http://www.importnew.com/12536.html
http://blog.csdn.net/zhengzhb/article/details/7489639
如有错误,欢迎指出!