设计模式-行为型-访问者模式

155 阅读2分钟

简介

访问者模式是行为型模式的一种,在开发中应用不多,《设计模式》作者评价道:大多情况下,你不需要使用访问者模式,但是一旦需要使用它时,那就真的需要使用了。访问者模式下,不需要改变类的结构来达到更新其属性的目的,以我们的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
         */
    }
}