访问者模式

1 介绍


Acey:小白,放假了你天天在家干嘛呀?

小白:天天在家玩呢,整个人都颓风了。

访问者模式_第1张图片

Acey:这么严重,那咋们今天去图书馆转转吧。

小白:好哇好哇。

Acey:不过咋们先..

小白:Stop,I konw, I konw 你又要讲设计模式了吧,,ԾㅂԾ,,。

Acey:哈哈,还是你懂我。

访问者模式:Visitor 模式是行为模式的一种。将访问者和访问者所访问的元素进行分离,在不改变已有类的情况下增加新的操作。

小白:如果拿图书馆举例的话,其中访问者就可以是管理员或者是读者,而被访问的元素就是不同分馆内的书籍对吗?

Acey:可以这么说,不同的管理员可以管理不同的分馆,即使在分馆不变的情况下,我们也可以增加管理员让其管理多个分馆。

2 实现


先来看看访问者模式的类图

访问者模式_第2张图片
类图

其中:

  • Visitor:访问者角色,为每一个具体访问者角色创建一个访问操作接口
  • ConcreteVisitor:具体访问者角色,实现 Vistor 接口,并实现独自的操作。
  • Element:元素角色,定义一个接收访问者方法,以访问者作为参数。
  • ConcreteElement:具体元素角色,实现Element接口并实现接收操作。
  • ObjectStructure:对象结构角色,使访问者能够访问到对应的元素。

具体实现

一步:创建Vistor角色

Visitor.class

//访问者接口
public interface Visitor {
    //访问文化馆的接口
    public void visitor(Literature literature);
    //访问自然馆的接口
    public void visitor(Natural natural);
}

二步,创建具体的Vistor角色

LiteratureAdmin.class / NaturalAdmin.class

//文化类书籍管理员
public class LiteratureAdmin implements Visitor{

    @Override
    public void visitor(Literature literature) {
        System.out.println("Literature 管理员负责管理文化类书籍");
        
    }

    @Override
    public void visitor(Natural natural) {
    }

}
//自然类书籍管理员
public class NaturalAdmin implements Visitor{

    @Override
    public void visitor(Literature literature) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void visitor(Natural natural) {
        System.out.println("Natural 管理员负责管理自然类书籍");
        
    }

}

三步,创建Element角色

Library.class

//图书馆接口
public interface Library {
    public void accept(Visitor visitor);
}

四步,创建具体的Element角色

Literature.class / Natural.class

//文化馆
public class Literature implements Library{

    @Override
    public void accept(Visitor visitor) {
        visitor.visitor(this);
    }

}
//自然馆
public class Natural implements Library{

    @Override
    public void accept(Visitor visitor) {
        visitor.visitor(this);
    }

}

五步,创建ObjectStructure

LibraryCon.class


//对象构造角色 -- 访问者进行访问
public class LibraryCon implements Library {
    private Literature literature;
    private Natural natural;
    
    public LibraryCon(){
        literature = new Literature();
        natural = new Natural();
    }
    
    @Override
    public void accept(Visitor visitor) {
        literature.accept(visitor);
        natural.accept(visitor);
    }

}

五步,测试

MainClass.class

public class MainClass {
    public static void main(String[] args) {
        //创建对象结构角色
        LibraryCon con = new LibraryCon();
        //具体的访问者
        LiteratureAdmin literatureAdmin = new LiteratureAdmin();
        NaturalAdmin naturalAdmin = new NaturalAdmin();
        //进行访问
        con.accept(naturalAdmin);
        con.accept(literatureAdmin);
    }
}
访问者模式_第3张图片
result

这样就实现了一个简单的访问者模式,不同的访问者可以去访问不同的元素。在元素不改变的情况下,我们增加一个新的访问者很容易,不需要去改变元素本身。但是如果我们要去新增一个元素那么就会非常困难,不仅需要去改动元素本身,还需要去修改访问者。

喜欢的话戳一下喜欢呗。
有什么建议的话希望大家能在下方回复
上一篇:《命令模式 - 年年年货》

你可能感兴趣的:(访问者模式)