访问者模式结构图:
示例代码:
// 抽象访问者
public interface Visistor {
void checkWork(Engineer engineer);
void checkWork(Manager manager);
}
// 具体访问者boss
public class BossVisistor implements Visistor{
@Override
public void checkWork(Engineer engineer) {
engineer.workProgress();
}
@Override
public void checkWork(Manager manager) {
manager.workProgress();
}
}
// 具体访问者投资人
public class InvestorsVisistor implements Visistor{
@Override
public void checkWork(Engineer engineer) {
engineer.workProgress();
}
@Override
public void checkWork(Manager manager) {
manager.workProgress();
}
}
// 抽象工作者(假定员工只有工程师和项目经理)
public abstract class Worker {
protected String name;
abstract void accept(Visistor visistor);
}
// 具体工作者工程师
public class Engineer extends Worker{
public Engineer(String name) {
this.name = name;
}
@Override
void accept(Visistor visistor) {
visistor.checkWork(this);
}
public void workProgress(){
System.out.println(this.getClass().getSimpleName() + name + "完成工作进度:" + new Random().nextInt(100) + "%");
}
}
// 具体工作者项目经理
public class Manager extends Worker{
public Manager(String name) {
this.name = name;
}
@Override
void accept(Visistor visistor) {
visistor.checkWork(this);
}
public void workProgress(){
System.out.println(this.getClass().getSimpleName() + name + "完成产品设计进度:" + new Random().nextInt(100) + "%");
}
}
// 容器
public class ObjectStruct {
List<Worker> list = new ArrayList<>();
public void accept(Visistor visistor){
list.forEach(a -> a.accept(visistor));
}
public void add(Worker worker){
list.add(worker);
}
public void remove(Worker worker){
list.remove(worker);
}
}
// 测试
public class VisistorTest {
public static void main(String[] args) {
ObjectStruct objectStruct = new ObjectStruct();
objectStruct.add(new Engineer("张三"));
objectStruct.add(new Engineer("李四"));
objectStruct.add(new Engineer("王五"));
objectStruct.add(new Manager("斯蒂芬"));
objectStruct.add(new Manager("詹姆斯"));
objectStruct.add(new Manager("约翰逊"));
System.out.println("=========老板检查工作进度===========");
objectStruct.accept(new BossVisistor());
System.out.println("=========投资人检查工作进度===========");
objectStruct.accept(new InvestorsVisistor());
}
}
总结:(举例不是太恰当,主要是为了学习访问者模式)
优点:解偶数据结构与数据操作,符合单一职责原则;
缺点:无法增加元素类型,违背依赖倒置原则.
原文:https://www.cnblogs.com/wqlken/p/14687523.html