28 访问者模式

1 定义

表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的前提下定义作用于这些元素的新操作。

2 适用场景

适用于数据结构相对稳定,又有易于变化的算法的系统(就是element稳定,visitor经常变化)

3 优势

由于把数据结构和数据结构上的操作进行了解耦,也就是把处理从数据结构中分离出来,使得增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。

4 缺点

源于优点,使得增加数据结构变得困难了。

5 定性

因为数据结构不变化的情况比较难找,所以大多数时候并不需要访问者模式,但是一旦需要访问者模式,那就是真的用它了。

6 UML

在这里插入图片描述

7 例子

7.1 UML

在这里插入图片描述

7.2 代码

Main

public class Main {
    public static void main(String[] args) {
        ObjectStructure o=new ObjectStructure();
        o.attach(new Man());
        o.attach(new Woman());

        //成功时的反应
        Success success=new Success();
        o.display(success);

        //失败时的反应
        Fail fail=new Fail();
        o.display(fail);
    }
}

Action

//相当于visitor访问者
public abstract class Action {
    public abstract void getManConclusion(Man concreteElement);
    public abstract void getWomanConclusion(Woman concreteElement);
}

Success

public class Success extends Action {
    @Override
    public void getManConclusion(Man concreteElement) {
        String personType=concreteElement.getClass().getName();
        String visitorType=this.getClass().getName();
        System.out.println(String.format("%s %s 时,背后有个成功的女人",personType.substring(personType.lastIndexOf(".")+1),visitorType.substring(visitorType.lastIndexOf(".")+1)));
    }

    @Override
    public void getWomanConclusion(Woman concreteElement) {
        String personType=concreteElement.getClass().getName();
        String visitorType=this.getClass().getName();
        System.out.println(String.format("%s %s 时,背后有个不成功的男人",personType.substring(personType.lastIndexOf(".")+1),visitorType.substring(visitorType.lastIndexOf(".")+1)));
    }
}

Fail

public class Fail extends Action {
    @Override
    public void getManConclusion(Man concreteElement) {
        String personType=concreteElement.getClass().getName();
        String visitorType=this.getClass().getName();
        System.out.println(String.format("%s %s 时,门头喝闷酒,谁也劝不动",personType.substring(personType.lastIndexOf(".")+1),visitorType.substring(visitorType.lastIndexOf(".")+1)));
    }

    @Override
    public void getWomanConclusion(Woman concreteElement) {
        String personType=concreteElement.getClass().getName();
        String visitorType=this.getClass().getName();
        System.out.println(String.format("%s %s 时,眼泪汪汪,谁也劝不了",personType.substring(personType.lastIndexOf(".")+1),visitorType.substring(visitorType.lastIndexOf(".")+1)));
    }
}

Person

//相当于element
public abstract class Person {
    public abstract void accept(Action visitor);
}

Man

public class Man extends Person {
    @Override
    public void accept(Action visitor) {
        visitor.getManConclusion(this);
    }
}

Woman

public class Woman extends Person {
    @Override
    public void accept(Action visitor) {
        visitor.getWomanConclusion(this);
    }
}

ObjectStructure

//对象结构
public class ObjectStructure {
    private ArrayList<Person> elements = new ArrayList<>();

    public void attach(Person element) {
        elements.add(element);
    }

    public void detach(Person element) {
        elements.remove(element);
    }

    public void display(Action visitor) {
        for (Person person : elements) {
            person.accept(visitor);
        }
    }
}

参考
https://blog.csdn.net/caoxiaohong1005/article/details/79575728

猜你喜欢

转载自blog.csdn.net/csdnlijingran/article/details/86537933
今日推荐