访问者模式(行为型)
设计模式的3个分类:创建型模式、结构型模式、行为型模式
访问者模式(Iterator Pattern)定义:
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的前提下定义作用于这些元素的新操作。
访问者模式图示:

代码实现:
//定义家庭成员的元素行为(此时家庭只包括男主人和女主人)
public abstract class Element {
public abstract void accept(IVisitor visitor);
public abstract void doSomething(String something);
}
//男主人
public class ElementHost extends Element{
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
@Override
public void doSomething(String something) {
System.out.println("男主人准备: " + something);
}
}
public class ElementHostess extends Element{
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
@Override
public void doSomething(String something) {
System.out.println("女主人准备: " + something);
}
}
/**
* 定义访问者接口
*/
public interface IVisitor {
void visit(ElementHost eHost);
void visit(ElementHostess eHostess);
}
//访问者: 朋友
public class FriendVisitor implements IVisitor{
@Override
public void visit(ElementHost eHost) {
eHost.doSomething("沏茶 唠嗑");
}
@Override
public void visit(ElementHostess eHostess) {
eHostess.doSomething("买菜 做饭");
}
}
//访问者:儿子
public class SonVisitor implements IVisitor {
@Override
public void visit(ElementHost eHost) {
eHost.doSomething("一桌好饭...");
}
@Override
public void visit(ElementHostess eHostess) {
eHostess.doSomething("一些唠叨...");
}
}
public class ObjectStructure {
private List<Element> elementList = new ArrayList<>();
public void attach(Element element) {
elementList.add(element);
}
public void remove(Element element) {
elementList.remove(element);
}
public void handle(IVisitor visitor) {
for(Element e : elementList) {
e.accept(visitor);
}
}
}
/**
* Test
*/
public class VisitorClient {
public static void main(String[] args) {
ObjectStructure objectStructure = new ObjectStructure();
ElementHost elementHost = new ElementHost();
ElementHostess elementHostess = new ElementHostess();
objectStructure.attach(elementHost);
objectStructure.attach(elementHostess);
//FriendVisitor comes
objectStructure.handle(new FriendVisitor());
//elementHost out
objectStructure.remove(elementHost);
System.out.println();
objectStructure.handle(new SonVisitor());
}
}
--End

浙公网安备 33010602011771号