visitor模式
如果有一个集合对象,我们可以用Iterator模式,进行每个集合的迭代访问。
但是对于不同的集合对象可能有不同的处理,我们就需要写 if else 语句来实现逻辑。
这种模式下,完全就违背了 OCP的开发关闭原则。 因为如果有新的对象加入,或者有新的处理逻辑,
就需要修改 if else 语句的逻辑。
vistor模式就是用来处理这个问题
设想的场景, 从数据库中 查出了 customer,order 对象,需要遍历这些对象做一个报表。
对于customer有相应的打印格式,order亦然。
我们可以把查出来的目标对象,放入一个集合。
对于集合中的每个对象,让他们变得 visitable, 每一个vistiable的对象需要实现一个 accept 方法,意思是可以接收一个 visitor对象。
public class Customer implements IVisitable{
public void accept(IVisitor visitor)
{
visitor.visit(this);
}
}
对于vistor,我们定义相应的方法,甚至是利用反射定义一个通用的方法,
未来增加不同的Visitable对象时, 不用修改接口。
public abstract class Visitor {
public abstract void visit(Customer customer);
public abstract void visit(Order order);
public abstract void visit(Item item);
public abstract void defaultVisit(Object object);
public void visit(Object object) {
try
{
Method downPolymorphic = object.getClass().getMethod("visit",
new Class[] { object.getClass() });
if (downPolymorphic == null) {
defaultVisit(object);
} else {
downPolymorphic.invoke(this, new Object[] {object});
}
}
catch (NoSuchMethodException e)
{
this.defaultVisit(object);
}
catch (InvocationTargetException e)
{
this.defaultVisit(object);
}
catch (IllegalAccessException e)
{
this.defaultVisit(object);
}
}
}
对于我们的客户端来说:
我们可能就是
Visitor reportVisitor = new ReportVisitor();
Collection<Visitable> items = new ArrayList<>();
for(Vistiable v:items)
{
v.accept(reportVisitor)
}
网友评论