zoukankan      html  css  js  c++  java
  • 【设计模式】—— 访问者模式Visitor

      前言:【模式总览】——————————by xingoo

      模式意图

      对于某个对象或者一组对象,不同的访问者,产生的结果不同,执行操作也不同。此时,就是访问者模式的典型应用了。

      应用场景

      1 不同的子类,依赖于不同的其他对象

      2 需要对一组对象,进行许多不相关的操作,又不想在类中是现在这些方法

      3 定义的类很少改变,但是执行的操作却经常发生改变。

      模式结构

      Context 环境角色

    class Context{
        List<Node> list = new ArrayList();
        public void add(Node node) {
            list.add(node);
        }
        public void visit(Visitor visitor) {
            for(Node node : list){
                node.accept(visitor);
            }
        }
    }

      Visitor 访问者角色

    interface Visitor{
        public void visit(NodeA nodeA);
        public void visit(NodeB nodeB);
    }
    class VisitA implements Visitor{
        public void visit(NodeA nodeA){
            System.out.println("***visitA***");
            nodeA.action();
        }
        public void visit(NodeB nodeB){
            System.out.println("***visitA***");
            nodeB.action();
        }
    }
    class VisitB implements Visitor{
        public void visit(NodeA nodeA){
            System.out.println("***visitB***");
            nodeA.action();
        }
        public void visit(NodeB nodeB){
            System.out.println("***visitB***");
            nodeB.action();
        }
    }

      Node 被访问角色

    interface Node{
        public void accept(Visitor visitor);
    }
    class NodeA implements Node{
        public void accept(Visitor visitor) {
            visitor.visit(this);
        }
        public void action(){
            System.out.println("NodeA visited");
        }
    }
    class NodeB implements Node{
        public void accept(Visitor visitor) {
            visitor.visit(this);
        }
        public void action(){
            System.out.println("NodeB visited");
        }
    }

      全部代码

     1 package com.xingoo.test.design.visitor;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 interface Visitor{
     7     public void visit(NodeA nodeA);
     8     public void visit(NodeB nodeB);
     9 }
    10 class VisitA implements Visitor{
    11     public void visit(NodeA nodeA){
    12         System.out.println("***visitA***");
    13         nodeA.action();
    14     }
    15     public void visit(NodeB nodeB){
    16         System.out.println("***visitA***");
    17         nodeB.action();
    18     }
    19 }
    20 class VisitB implements Visitor{
    21     public void visit(NodeA nodeA){
    22         System.out.println("***visitB***");
    23         nodeA.action();
    24     }
    25     public void visit(NodeB nodeB){
    26         System.out.println("***visitB***");
    27         nodeB.action();
    28     }
    29 }
    30 interface Node{
    31     public void accept(Visitor visitor);
    32 }
    33 class NodeA implements Node{
    34     public void accept(Visitor visitor) {
    35         visitor.visit(this);
    36     }
    37     public void action(){
    38         System.out.println("NodeA visited");
    39     }
    40 }
    41 class NodeB implements Node{
    42     public void accept(Visitor visitor) {
    43         visitor.visit(this);
    44     }
    45     public void action(){
    46         System.out.println("NodeB visited");
    47     }
    48 }
    49 class Context{
    50     List<Node> list = new ArrayList();
    51     public void add(Node node) {
    52         list.add(node);
    53     }
    54     public void visit(Visitor visitor) {
    55         for(Node node : list){
    56             node.accept(visitor);
    57         }
    58     }
    59 }
    60 public class Client {
    61     private static Context ctx = new Context();
    62     public static void main(String[] args) {
    63         ctx.add(new NodeA());
    64         ctx.add(new NodeB());
    65         ctx.visit(new VisitA());
    66         ctx.visit(new VisitB());
    67     }
    68 }
    View Code

      运行结果

    ***visitA***
    NodeA visited
    ***visitA***
    NodeB visited
    ***visitB***
    NodeA visited
    ***visitB***
    NodeB visited
  • 相关阅读:
    04-set方法的内存管理
    03-OC内存管理原则
    02-引用计数器的使用(含野指针、空指针)
    01-OC内存管理的基本原理
    16-NSDate
    15-NSValue
    14-NSNumber
    13-NSMutableDictionary
    12-NSDictionary(字典)
    11-NSArray和NSSet的区别
  • 原文地址:https://www.cnblogs.com/xing901022/p/4085008.html
Copyright © 2011-2022 走看看