1 介绍
Acey:小白,放假了你天天在家干嘛呀?
小白:天天在家玩呢,整个人都颓风了。
Acey:这么严重,那咋们今天去图书馆转转吧。
小白:好哇好哇。
Acey:不过咋们先..
小白:Stop,I konw, I konw 你又要讲设计模式了吧,,ԾㅂԾ,,。
Acey:哈哈,还是你懂我。
访问者模式:Visitor 模式是行为模式的一种。将访问者和访问者所访问的元素进行分离,在不改变已有类的情况下增加新的操作。
小白:如果拿图书馆举例的话,其中访问者就可以是管理员或者是读者,而被访问的元素就是不同分馆内的书籍对吗?
Acey:可以这么说,不同的管理员可以管理不同的分馆,即使在分馆不变的情况下,我们也可以增加管理员让其管理多个分馆。
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);
}
}
这样就实现了一个简单的访问者模式,不同的访问者可以去访问不同的元素。在元素不改变的情况下,我们增加一个新的访问者很容易,不需要去改变元素本身。但是如果我们要去新增一个元素那么就会非常困难,不仅需要去改动元素本身,还需要去修改访问者。
喜欢的话戳一下喜欢呗。
有什么建议的话希望大家能在下方回复😋
上一篇:《命令模式 - 年年年货》