访问者(visitor)模式
程序员文章站
2022-05-04 13:24:49
...
访问者模式中的角色:客户方、访问者、被访问者
应用场景:被访问者元素变化较小或不改变。访问者中的方法经常改变。
访问的方法都在访问者中定义。被访问者实现统一接口中的方法,具体方法委托给访问者中的方法实现。
被访问者接口:
/** * 被访问者接口 */ public interface Visitable { /** * 定义 */ public String getDefinition(Visitor visitor); }
被访问者(高富帅):
public class Gaofushuai implements Visitable { private String personDefinition = "高富帅:高富帅"; @Override public String getDefinition(Visitor visitor) { return visitor.getGaofushuaiDefinition(this); } public String getPersonDefinition() { return personDefinition; } public void setPersonDefinition(String personDefinition) { this.personDefinition = personDefinition; } }
被访问者(屌丝):
public class Diaosi implements Visitable{ private String personDefinition = "屌丝:穷矮矬"; @Override public String getDefinition(Visitor visitor) { return visitor.getDiaosiDefinition(this); } public String getPersonDefinition() { return personDefinition; } public void setPersonDefinition(String personDefinition) { this.personDefinition = personDefinition; } }
访问者接口:
/** * 访问者 */ public interface Visitor { /* * 屌丝定义 */ public String getDiaosiDefinition(Diaosi diaosi); /* * 高富帅定义 */ public String getGaofushuaiDefinition(Gaofushuai gaofushuai); }
访问者接口实现(人员访问者):
public class PersonVisitor implements Visitor { public void visitPerson(List<Visitable> list){ Iterator it = list.iterator(); while (it.hasNext()) { Visitable visitable = (Visitable)it.next(); System.out.println(visitable.getDefinition(this)); } } @Override public String getDiaosiDefinition(Diaosi diaosi) { return diaosi.getPersonDefinition(); } @Override public String getGaofushuaiDefinition(Gaofushuai gaofushuai) { return gaofushuai.getPersonDefinition(); } }
客户端访问:
public class VisitorClient { public static void main(String[] args) { List<Visitable> list = new ArrayList<Visitable>(); list.add(new Diaosi()); list.add(new Gaofushuai()); new PersonVisitor().visitPerson(list); } }
访问结果:
屌丝:穷矮矬
高富帅:高富帅
下一篇: 关于2013年云计算应用的10种预测