访问者模式(行为型)

 

设计模式的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 

 

posted @ 2021-01-15 15:41  黑冰台  阅读(114)  评论(0)    收藏  举报