设计模式(行为模式) 之 访问者模式

访问者模式目的:

封装一些施加于某种数据结构元素之上的操作,一旦这些操作需要修改,接受这些操作的数据结构可以保持不变。

为不同类型的元素提供多种访问操作方式,且可以在不修改原有系统的情况下增加新的操作方式。

访问者模式的四种角色:

1,抽象事物功能接口,定义了固定方法及可变功能方法接口;

2,具体的功能实现类;

3,访问者接口,为所有访问者对象声明一个 visit 方法,用来代表为对象结构添加的功能,原则上可以代表任意的功能;

4,具体访问者的实现类,实现要真正被添加到对象结构中的功能。

举例:(可能不太恰当,但能说明意思)“人,会哭 会笑;还有很多特性如:喜欢、讨厌等”


/**
* 人
*/
public interface Person {
/**
* 哭
*/
void cry();

/**
* 笑
*/
void smile();

/**
* 其它
*
* @param visitor
* @return
*/
Object accept(IVisitor visitor);
}

public class ChinaPerson implements Person {
String name = "";

public ChinaPerson(String name) {
this.name = name;
}

public String getName() {
return name;
}

@Override
public void cry() {
System.out.println(name + " 哭");
}

@Override
public void smile() {
System.out.println(name + " 笑");
}

@Override
public Object accept(IVisitor visitor) {
return visitor.visit(this);
}
}
/**
* 访问者接口
*/
public interface IVisitor {
Object visit(ChinaPerson chinaPerson);
}
public class Hate implements IVisitor {
@Override
public Object visit(ChinaPerson chinaPerson) {
System.out.println(chinaPerson.getName() + " 讨厌岛国");
return null;
}
}
public class Like implements IVisitor {
@Override
public Object visit(ChinaPerson chinaPerson) {
System.out.println(chinaPerson.getName() + " 喜欢中国");
return null;
}
}

执行:
public static void main(String[] args) {
ChinaPerson chinaPerson = new ChinaPerson("中国人");
chinaPerson.cry();
chinaPerson.smile();
chinaPerson.accept(new Hate());
chinaPerson.accept(new Like());
}
结果:


原文地址:https://www.cnblogs.com/fish-in-sky/p/6540453.html