简介
访问者模式是行为型模式的一种,在开发中应用不多,《设计模式》作者评价道:大多情况下,你不需要使用访问者模式,但是一旦需要使用它时,那就真的需要使用了。访问者模式下,不需要改变类的结构来达到更新其属性的目的,以我们的Windows更新为例,有时候我们发现,系统更新完了我们的默认浏览器和默认office都变了,这就是访问者模式的体现,下面以此为例来Demo示例。
Demo示例
我们以Windows系统更新为例,我们自己设置的默认浏览器为Google Chrome,office为wps,当更新完成后默认浏览器为Edge,office编程了MS Office了。
1.定义Visitor接口,然后定义一个更新接口来实现:
public interface Visitor {
void visitBrowser(Browser browser);
void visitOffice(Office office);
}
public class OSUpdateVisit implements Visitor{
private String newBrowser;
private String newOffice;
public OSUpdateVisit(String newBrowser, String newOffice) {
this.newBrowser = newBrowser;
this.newOffice = newOffice;
}
@Override
public void visitBrowser(Browser browser) {
browser.setName(newBrowser);
}
@Override
public void visitOffice(Office office) {
office.setName(newOffice);
}
}
2.定义一个Application抽象类,然后Browser和Office类继承。
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public abstract class Application {
private String name;
public abstract void run();
public abstract void accept(Visitor visitor);
}
public class Browser extends Application{
public Browser(String name) {
super(name);
}
@Override
public void run() {
System.out.println("Default browser is " + this.getName());
}
@Override
public void accept(Visitor visitor) {
visitor.visitBrowser(this);
}
}
public class Office extends Application{
public Office(String name) {
super(name);
}
@Override
public void run() {
System.out.println("Default office is " + this.getName());
}
@Override
public void accept(Visitor visitor) {
visitor.visitOffice(this);
}
}
3.定义一个操作系统类
public class OperationSystem {
private Browser browser;
private Office office;
public OperationSystem() {
browser = new Browser("Google Chrome");
office = new Office("WPS");
}
public void run() {
this.browser.run();
this.office.run();
}
public void accept(Visitor visitor) {
browser.accept(visitor);
office.accept(visitor);
}
}
4.客户端调用
public class Test {
public static void main(String[] args) {
OperationSystem windows = new OperationSystem();
windows.run();
/*
Default browser is Google Chrome
Default office is WPS
*/
Visitor visitor = new OSUpdateVisit("Edge", "MS Office");
windows.accept(visitor);
windows.run();
/**
* Default browser is Edge
* Default office is MS Office
*/
}
}