简易版本:分离与元素类本身关系不大且是易变的操作,使之符合单一职责原则
定义访问接口
package com.mandy.design1; public interface ElementsFilter { boolean accept(String element); }
定义主体类
package com.mandy.design1; import java.util.ArrayList; public class Elements { private ArrayList<String> elementList; public Elements(ArrayList<String> elementList) { this.elementList = elementList; } public void listElement(ElementsFilter elementsFilter) { for (String element : elementList) { boolean b = elementsFilter.accept(element); if (b) { System.out.println("list files: " + element); } } } public static void main(String[] args) { ArrayList<String> al = new ArrayList<String>(); al.add("test"); al.add("mandy"); al.add("environment"); Elements ele = new Elements(al); ele.listElement( new ElementsFilter() { public boolean accept(String element) { if (element.equals("test")) { return false; } else { return true; } } }); } }
JDK中以及很多框架都有类似设计,我理解的好处是将处理逻辑由外部传入,减少耦合。
真正的访问者模式,抄自网络,重在理解。
abstract class Element { public abstract void accept(IVisitor visitor); public abstract void doSomething(); } interface IVisitor { public void visit(ConcreteElement1 el1); public void visit(ConcreteElement2 el2); } class ConcreteElement1 extends Element { public void doSomething(){ System.out.println("这是元素1"); } public void accept(IVisitor visitor) { visitor.visit(this); } } class ConcreteElement2 extends Element { public void doSomething(){ System.out.println("这是元素2"); } public void accept(IVisitor visitor) { visitor.visit(this); } } class Visitor implements IVisitor { public void visit(ConcreteElement1 el1) { el1.doSomething(); } public void visit(ConcreteElement2 el2) { el2.doSomething(); } } class ObjectStruture { public static List<Element> getList(){ List<Element> list = new ArrayList<Element>(); Random ran = new Random(); for(int i=0; i<10; i++){ int a = ran.nextInt(100); if(a>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(); for(Element e: list){ e.accept(new Visitor()); } } }