访问者模式

Posted forthedream1991

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了访问者模式相关的知识,希望对你有一定的参考价值。

1.基本概念

  • 使用一个访问者类,改变元素类的执行算法,通过这种方式,元素的执行算法可以随着访问者改变而改变
  • 目的:将数据结构与数据操作分离
  • 应用实例:您在朋友家做客,您是访问者,朋友接受您的访问,您通过朋友的描述,然后对朋友的描述做出一个判断,这就是访问者模式。
  • UML

  技术图片

2.代码实现

技术图片
 1 package com.chengjie;
 2 
 3 interface ComputerPart1 {
 4     public void accept(ComputerPartVisitor computerPartVisitor);
 5 }
 6 
 7 class KeyBoard implements ComputerPart1 {
 8     @Override
 9     public void accept(ComputerPartVisitor computerPartVisitor) {
10         computerPartVisitor.visit(this);
11     }
12 }
13 
14 class Monitor  implements ComputerPart1 {
15 
16     @Override
17     public void accept(ComputerPartVisitor computerPartVisitor) {
18         computerPartVisitor.visit(this);
19     }
20 }
21 
22 class Mouse  implements ComputerPart1 {
23 
24     @Override
25     public void accept(ComputerPartVisitor computerPartVisitor) {
26         computerPartVisitor.visit(this);
27     }
28 }
29 class Computer1 implements ComputerPart1 {
30 
31     ComputerPart1[] parts;
32 
33     public Computer1(){
34         parts = new ComputerPart1[] {new Mouse(), new KeyBoard(), new Monitor()};
35     }
36 
37 
38     @Override
39     public void accept(ComputerPartVisitor computerPartVisitor) {
40         for (int i = 0; i < parts.length; i++) {
41             parts[i].accept(computerPartVisitor);
42         }
43         computerPartVisitor.visit(this);
44     }
45 }
46 
47 interface ComputerPartVisitor {
48     public void visit(Computer1 computer);
49     public void visit(Mouse mouse);
50     public void visit(KeyBoard keyboard);
51     public void visit(Monitor monitor);
52 }
53 
54 class ComputerPartDisplayVisitor implements ComputerPartVisitor {
55     @Override
56     public void visit(Computer1 computer) {
57         System.out.println("Displaying computer!");
58     }
59 
60     @Override
61     public void visit(Mouse mouse) {
62         System.out.println("Displaying Mouse.");
63     }
64 
65     @Override
66     public void visit(KeyBoard keyboard) {
67         System.out.println("Displaying Keyboard.");
68     }
69 
70     @Override
71     public void visit(Monitor monitor) {
72         System.out.println("Displaying Monitor.");
73     }
74 }
75 
76 public class TestVisitor {
77     public static void main(String[] args) {
78         Computer1 comp = new Computer1();
79         comp.accept(new ComputerPartDisplayVisitor());
80     }
81 }
View Code

3.优点

  • 符合单一职责原则
  • 优秀的扩展性

4.缺点

  • 具体元素对访问者暴露细节,违反迪米特原则
  • 违反了依赖倒置原则,依赖了具体类

5.应用场景

  • 对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作

6.参考

   http://www.runoob.com/design-pattern/visitor-pattern.html

以上是关于访问者模式的主要内容,如果未能解决你的问题,请参考以下文章

在不存在的片段上调用片段生命周期和 onCreate 的问题

尝试使用片段保存夜间模式状态

是否有在单个活动中处理多个片段的 Android 设计模式?

片段管理访问错误可见 return false

如何访问 MainActivity() 中的片段元素?

使用绑定从片段访问父活动的 UI 元素