访问者模式:表示一个作用与某对象结构中的各元素操作,可以使在不改变各元素类的前提下定义这些元素的新操作

    优点:可以将数据操作和数据结构分离

    实现:人类在生理上分两种性别,男和女,这两种性别面对不同的行为,大多数会形成两种截然不同的反应。

    1、个体类(数据结构)

    1. /**
    2. * 抽象个体
    3. */
    4. public abstract class Person {
    5. /**
    6. * 针对行为作出的反应
    7. */
    8. public abstract void doAction(Action action);
    9. }
    10. /**
    11. * 男人
    12. */
    13. public class ManPerson extends Person{
    14. public void doAction(Action action){
    15. action.manAction(this);
    16. }
    17. }
    18. /**
    19. * 女人
    20. */
    21. public class WoManPerson extends Person{
    22. public void doAction(Action action){
    23. action.woManAction(this);
    24. }
    25. }

    2、行为类(数据操作)

    1. /**
    2. * 抽象行为
    3. */
    4. public abstract class Action {
    5. /**
    6. * 男人行为
    7. */
    8. public abstract void manAction(ManPerson person);
    9. /**
    10. * 女人行为
    11. */
    12. public abstract void woManAction(WoManPerson person);
    13. }
    14. /**
    15. * 成功
    16. */
    17. public class Success extends Action{
    18. /**
    19. * 男人行为
    20. */
    21. public void manAction(ManPerson person){
    22. System.out.println("男人成功背后,大多拥有一个伟大的女人");
    23. }
    24. /**
    25. * 女人行为
    26. */
    27. public void woManAction(WoManPerson person){
    28. System.out.println("女人成功背后,大多拥有一个不成功的男人");
    29. }
    30. }
    31. /**
    32. * 失恋
    33. */
    34. public class Lovelorn extends Action{
    35. /**
    36. * 男人行为
    37. */
    38. public void manAction(ManPerson person){
    39. System.out.println("男人失恋,大多闷头喝酒,谁也不用劝");
    40. }
    41. /**
    42. * 女人行为
    43. */
    44. public void woManAction(WoManPerson person){
    45. System.out.println("女人失恋,大多泪眼汪汪,谁劝也不好使");
    46. }
    47. }

    3、对象结构类(批量处理)

    1. /**
    2. * 对象结构类
    3. */
    4. public class ObjectStructure {
    5. List<Person> list = new ArrayList<>();
    6. public void add(Person person){
    7. list.add(person);
    8. }
    9. public void remove(Person person){
    10. list.remove(person);
    11. }
    12. public void structure(Action action){
    13. list.forEach(person -> {
    14. person.doAction(action);
    15. });
    16. }
    17. }

    4、测试类

    1. /**
    2. * 测试访问者模式
    3. */
    4. public class TestVisitor {
    5. public static void main(String [] args){
    6. ManPerson manPerson = new ManPerson();
    7. WoManPerson woManPerson = new WoManPerson();
    8. ObjectStructure objectStructure = new ObjectStructure();
    9. objectStructure.add(manPerson);
    10. objectStructure.add(woManPerson);
    11. Action success = new Success();
    12. Action lovelorn = new Lovelorn();
    13. objectStructure.structure(success);
    14. objectStructure.structure(lovelorn);
    15. }
    16. }

    测试结果:
    image.png

    访问者模式通常的使用场景:
    1、对象结构毕竟稳定,但是通常要对对象结构定义新的操作(譬如人类性别生理上分为男女两种,这个对象结构是固定的,但是人类的行为是千千万万)
    2、需要对对象结构进行很多不同,并且不相关的操作,而需要避免这些操作污染这些类的对象,也不希望增加操作时修改这些类