// 20210202
写在前面:刚期末考试完,考了面向对象,里边儿有23个设计模式,我寻思着考完挨个儿实现一下,本文实现访问者模式
访问者模式核心思想
- 网上找的帖子都说访问者模式是最复杂的一个模式,但是看完懂了之后感觉也没有多复杂,但是模式之中的成分关系比较抽象
- 总的来说,核心思想就是让数据结构和数据操作分离,数据结构(被访问者)不变,被访问者每次被访问都作出一个相同的动作,但是每个访问者由于水平不同,对一个相同的访问者可能出现不同的反应,所以再不用更改被访问者代码的情况下,可以增加访问者以增加被访问者没有的操作————通俗点就是见人说人话,见鬼说鬼话
- 上面说的很抽象,下面上张图(被访问者A、B可不做任何事)
程序源代码
- 此处使用男人和女人做被访问类,人就分男人女人,很稳定,符合被访问者角色的定义,然后失败和成功分别访问男人和女人
/**
* 访问者父类
*/
public abstract class Action {
//得到男人的结论或反应
public abstract void getManConclusion(Man man);
//得到女人的结论或反应
public abstract void getWomanConclusion(Women woman);
}
/**
* 被访问者父类——人类
*/
public abstract class Person {
//接受
public abstract void accept(Action action);
}
/**
* 关系承载者
*/
import java.util.LinkedList;
import java.util.List;
public class ObjectStructure {
private List<Person> elements = new LinkedList<>();
//增加
public void attach(Person person){
elements.add(person);
}
//移除
public void detach(Person person){
elements.remove(person);
}
//查看显示
public void display(Action action) {
for(Person person:elements) {
person.accept(action);
}
}
}
/**
* 访问者——失败类
*/
public class Failing extends Action{
@Override
public void getManConclusion(Man man) {
System.out.println("男人失败...");
}
@Override
public void getWomanConclusion(Women woman) {
System.out.println("女人失败...");
}
}
/**
* 访问者——成功类
*/
public class Success extends Action{
@Override
public void getManConclusion(Man man) {
System.out.println("男人成功...");
}
@Override
public void getWomanConclusion(Women woman) {
System.out.println("女人成功...");
}
}
/**
* 被访问者——男人
*/
public class Man extends Person{
@Override
public void accept(Action action) {
action.getManConclusion(this);
}
}
/**
* 被访问者——女人
*/
public class Women extends Person{
@Override
public void accept(Action action) {
action.getWomanConclusion(this);
}
}
/**
* 测试主类
*/
public class Main {
public static void main(String[] args) {
ObjectStructure objectStructure = new ObjectStructure();
objectStructure.attach(new Man());
objectStructure.attach(new Women());
//成功
Success success = new Success();
objectStructure.display(success);
Failing failing = new Failing();
objectStructure.display(failing);
}
}
- 输出如下:
以上
希望对大家有所帮助