设计模式-访问者模式
表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作
我们来举个例子
先定义抽象 Element 电子设备
public interface Electronics {
void accept(Person person);
}
两个实现电视和手机
public class Television implements Electronics{
@Override
public void accept(Person person) {
System.out.print("电视在工作,");
person.watchTelevision(this);
}
}
public class Mobile implements Electronics{
@Override
public void accept(Person person) {
System.out.print("手机在工作,");
person.playMobile(this);
}
}
抽象的 Visitor 人
public interface Person {
void playMobile(Mobile mobile);
void watchTelevision(Television television);
}
分别实现爸爸,妈妈和儿子三个Visitor
public class Father implements Person {
@Override
public void playMobile(Mobile mobile) {
System.out.print("爸爸在读新闻\n");
}
@Override
public void watchTelevision(Television television) {
System.out.print("爸爸在看新闻\n");
}
}
public class Mother implements Person {
@Override
public void playMobile(Mobile mobile) {
System.out.print("妈妈在看八卦\n");
}
@Override
public void watchTelevision(Television television) {
System.out.print("妈妈在看电视剧\n");
}
}
public class Son implements Person {
@Override
public void playMobile(Mobile mobile) {
System.out.print("儿子在聊天\n");
}
@Override
public void watchTelevision(Television television) {
System.out.print("儿子在看演唱会\n");
}
}
定义对象结构
public class Home {
private List<Electronics> list = new ArrayList<>();
public void add(Electronics electronics){
list.add(electronics);
}
public void action(Person person){
for (Electronics electronics : list){
electronics.accept(person);
}
}
}
调用
public class Demo {
public static void main(String[] args) {
Home home = new Home();
home.add(new Mobile());
home.add(new Television());
home.action(new Father());
home.action(new Mother());
home.action(new Son());
}
}
结果
访问者模式使 Visitor 的增减不影响其他类代码,同时使 Element 的增减复杂了,需要修改所有代码