Posts 【行为型】访问者模式详解
Post
Cancel

【行为型】访问者模式详解

【行为型】访问者模式

定义

1
2
3
4
5
6
7
8
定义:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

访问者模式中角色:
    1.抽象访问者类(VisitorAbstract): 为ConcreteElement的每一个类声明一个visit操作
    2.具体访问者(ConcreteVisitor): 实现抽象访问者类声明的操作
    3.抽象元素类(ElementAbstract): 声明一个接受的操作,参数为一个访问者
    4.具体元素类(ConcreteElement): 具体的元素类实现抽象类的声明操作
    5.对象结构类(ObjectStructure): 能枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素

UML图

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
 _ _ _ _ _      _ _ _ _ _ _ _ _ _
|         |    |                 |
| Context |---→| VisitorAbstract |
|_ _ _ _ _|    |_ _ _ _ _ _ _ _ _|
  |                     ↑
  |          ___________|____________
  |         |                        |
  |         |                        |
  |  _ _ _ _|_ _ _ _ _        _ _ _ _|_ _ _ _ _
  | |                 |      |                 |
  | | ConcreteVisitorA|      | ConcreteVisitorB|
  | |_ _ _ _ _ _ _ _ _|      |_ _ _ _ _ _ _ _ _|
  |
  |
  |
 _↓_ _ _ _ _ _ _ _      _ _ _ _ _
|                 |    |         |
| ObjectStructure |---→| Element |
|_ _ _ _ _ _ _ _ _|    |_ _ _ _ _|
                            ↑
                  __________|______________
                 |                         |
       _ _ _ _ _ | _ _ _ _       _ _ _ _ _ | _ _ _
      |                   |     |                 |
      | ConcreteElementA  |     | ConcreteElementB|
      |_ _ _ _ _ _ _ _ _ _|     |_ _ _ _ _ _ _ _ _|

代码

1
2
3
4
5
6
public abstract class Visitor{

    public abstract void visitDeathPrisoner(DeathPrisoner deathPrisoner);

    public abstract void visitGeneralPrisoner(GeneralPrisoner generalPrisoner);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Police extends Visitor{

    @override
    public void visitDeathPrisoner(DeathPrisoner deathPrisoner){

        System.out.println("Dangerous level:"+deathPrisoner.getLevel()+". Don't touch with yourself!");
    }

    @override
    public void visitGeneralPrisoner(GeneralPrisoner generalPrisoner){

        System.out.println("Dangerous level:"+generalPrisoner.getLevel()+". Keep vigilance!");
    }

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Worker extends Visitor{

    @override
    public void visitDeathPrisoner(DeathPrisoner deathPrisoner){

        System.out.println("Dangerous level:"+deathPrisoner.getLevel()+". Have no power to contact!");
    }

    @override
    public void visitGeneralPrisoner(GeneralPrisoner generalPrisoner){

        System.out.println("Dangerous level:"+generalPrisoner.getLevel());
    }
}

1
2
3
4
5
6
7
public abstract class Prisoner{

    private int level;

    public abstract void visit(Visitor visitor);

}

1
2
3
4
5
6
7
8
9
10
11
12
13
public class DeathPrisoner extends Prisoner{

    public DeathPrisoner(int level){

        this.level = level;
    }

    @override
    public void visit(Visitor visitor){

        visitor.visitDeathPrisoner(this);
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
public class GeneralPrisoner extends Prisoner{

    public GeneralPrisoner(int level){

        this.level = level;
    }

    @override
    public void visit(Visitor visitor){

        visitor.visitGeneralPrisoner(this);
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Register{

    private ArrayList<Prisoner> allowVisitList = new ArrayList<Prisoner>();


    public void addRegister(Prisoner prisoner){

        allowVisitList.add(prisoner);
    }

    public void cancelRegister(Prisoner prisoner){

        allowVisitList.remote(prisoner);
    }

    public void acceptVisit(Visitor visitor){

        foreach(Prisoner prisoner:allowVisitList){

            prisoner.visit(visitor);
        }
    }
}

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
public class Client{


    public static void main(String[] args){

        Register register = new Register();

        register.addRegister( new DeathPrisoner(5) );

        register.addRegister( new GeneralPrisoner(1) );

        Police police = new Police();

        Worker worker = new Worker();

        register.acceptVisit( police );

        register.acceptVisit( worker );
    }
}


运行结果:

    Dangerous level:5. Don't touch with yourself!

    Dangerous level:2. Keep vigilance!

    Dangerous level:5. Have no power to contact!

    Dangerous level:2.

应用


This post is licensed under CC BY 4.0 by the author.

【行为型】状态模式详解

【行为型】中介者模式详解