主页 > 知识库 > 网络编程 > JSP/Java >

《JAVA与模式》系列二十四:访问者模式 (下)

来源:csdn 作者:特种兵—AK47 发表于:2012-08-24 09:23  点击:
具体节点类NodeA 双击代码全选 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package com.bankht.Visitor.visitor; /** * @author: 特种兵AK47 * @创建时间:2012-7-3 上午10:59:45 * * @类说明 : */ public class NodeA extends Nod
具体节点类NodeA
双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.bankht.Visitor.visitor;   
        
/**  
 * @author: 特种兵—AK47  
 * @创建时间:2012-7-3 上午10:59:45  
 *   
 * @类说明 :  
 */
public class NodeA extends Node {   
    /**  
     * 接受操作  
     */
    @Override
    public void accept(Visitor visitor) {   
        visitor.visit(this);   
    }   
        
    /**  
     * NodeA特有的方法  
     */
    public String operationA() {   
        return "NodeA";   
    }   
        
}
 
具体节点类NodeB
双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.bankht.Visitor.visitor;   
        
/**  
 * @author: 特种兵—AK47  
 * @创建时间:2012-7-3 上午10:59:59  
 *   
 * @类说明 :  
 */
public class NodeB extends Node {   
    /**  
     * 接受方法  
     */
    @Override
    public void accept(Visitor visitor) {   
        visitor.visit(this);   
    }   
        
    /**  
     * NodeB特有的方法  
     */
    public String operationB() {   
        return "NodeB";   
    }   
}
 
结构对象角色类,这个结构对象角色持有一个聚集,并向外界提供add()方法作为对聚集的管理操作。通过调用这个方法,可以动态地增加一个新的节点。
双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.bankht.Visitor.visitor;   
        
import java.util.ArrayList;   
import java.util.List;   
        
/**  
 * @author: 特种兵—AK47  
 * @创建时间:2012-7-3 上午11:00:15  
 *   
 * @类说明 :  
 */
public class ObjectStructure {   
        
    private List<Node> nodes = new ArrayList<Node>();   
        
    /**  
     * 执行方法操作  
     */
    public void action(Visitor visitor) {   
        
        for (Node node : nodes) {   
            node.accept(visitor);   
        }   
        
    }   
        
    /**  
     * 添加一个新元素  
     */
    public void add(Node node) {   
        nodes.add(node);   
    }   
}
 
  客户端类
双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.bankht.Visitor.visitor;   
        
/**  
 * @author: 特种兵—AK47  
 * @创建时间:2012-7-3 上午11:00:29  
 *   
 * @类说明 :  
 */
public class Client {   
        
    public static void main(String[] args) {   
        // 创建一个结构对象   
        ObjectStructure os = new ObjectStructure();   
        // 给结构增加一个节点   
        os.add(new NodeA());   
        // 给结构增加一个节点   
        os.add(new NodeB());   
        // 创建一个访问者   
        Visitor visitor = new VisitorA();   
        os.action(visitor);   
    }   
        
}
 
虽然在这个示意性的实现里并没有出现一个复杂的具有多个树枝节点的对象树结构,但是,在实际系统中访问者模式通常是用来处理复杂的对象树结构的,而且访问者模式可以用来处理跨越多个等级结构的树结构问题。这正是访问者模式的功能强大之处。

  准备过程时序图

  首先,这个示意性的客户端创建了一个结构对象,然后将一个新的NodeA对象和一个新的NodeB对象传入。
  其次,客户端创建了一个VisitorA对象,并将此对象传给结构对象。
  然后,客户端调用结构对象聚集管理方法,将NodeA和NodeB节点加入到结构对象中去。
  最后,客户端调用结构对象的行动方法action(),启动访问过程。

  访问过程时序图

  
  结构对象会遍历它自己所保存的聚集中的所有节点,在本系统中就是节点NodeA和NodeB。首先NodeA会被访问到,这个访问是由以下的操作组成的:
  (1)NodeA对象的接受方法accept()被调用,并将VisitorA对象本身传入;
  (2)NodeA对象反过来调用VisitorA对象的访问方法,并将NodeA对象本身传入;
  (3)VisitorA对象调用NodeA对象的特有方法operationA()。
  从而就完成了双重分派过程,接着,NodeB会被访问,这个访问的过程和NodeA被访问的过程是一样的,这里不再叙述。

访问者模式的优点

  ●  好的扩展性
  能够在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。
  ●  好的复用性
  可以通过访问者来定义整个对象结构通用的功能,从而提高复用程度。
  ●  分离无关行为
  可以通过访问者来分离无关的行为,把相关的行为封装在一起,构成一个访问者,这样每一个访问者的功能都比较单一。

访问者模式的缺点

  ●  对象结构变化很困难
  不适用于对象结构中的类经常变化的情况,因为对象结构发生了改变,访问者的接口和访问者的实现都要发生相应的改变,代价太高。
  ●  破坏封装
  访问者模式通常需要对象结构开放内部数据给访问者和ObjectStructrue,这破坏了对象的封装性。

 

    有帮助
    (0)
    0%
    没帮助
    (0)
    0%