Android的设计模式系列文章介绍,欢迎关注,持续更新中:
Android的设计模式-设计模式的六大原则
创建型模式:
Android的设计模式-单例模式
Android的设计模式-建造者模式
Android的设计模式-工厂方法模式
Android的设计模式-简单工厂模式
Android的设计模式-抽象工厂模式
Android的设计模式-原型模式
行为型模式:
Android的设计模式-策略模式
Android的设计模式-状态模式
Android的设计模式-责任链模式
Android的设计模式-观察者模式
Android的设计模式-模板方法模式
Android的设计模式-迭代器模式
Android的设计模式-备忘录模式
Android的设计模式-访问者模式
封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
以我们平时听歌看视频为例,音乐视频网站都会提供在线播放和下载的功能,当我们有空的时候往往就选择了在线播放,比较忙的时候就选择先下载下来,有空的时候再去观看。其中,音乐视频网站就是具体的要访问的元素,闲人和忙人就是具体的访问者,闲人和忙人的访问行为是不一样的。
定义一个抽象的受访问方法以及其他公共的方法:
public abstract class Web {
public String name;
public Web(String name) {
this.name = name;
}
//定义一个抽象的受访问方法
public abstract void accept(Visitor visitor);
//下载资源
public abstract void download();
public String getName() {
return name;
}
}
实现抽象元素中的accept()
方法,通常是调用访问者提供的访问该元素的方法。下面创建音乐类以及视频类,他们都有一个download()
方法,但是其具体下载的内容是不一样的,同时他们也存在各自独有的方法playMusic()
和playVideo()
:
public class Music extends Web {//音乐类,继承自Web类
public Music(String name) {
super(name);
}
@Override
public void accept(Visitor visitor) {//接受访问者的访问
visitor.visit(this);
}
@Override
public void download() {//实现父类中的公共方法
System.out.println("下载音乐~~");
}
public void playMusic() {//音乐类独有方法
System.out.println("播放音乐ing");
}
}
public class Video extends Web {//视频类,继承自Web类
public Video(String name) {
super(name);
}
@Override
public void accept(Visitor visitor) {//接受访问者的访问
visitor.visit(this);
}
@Override
public void download() {//实现父类中的公共方法
System.out.println("下载视频~~");
}
public void playVideo() {//视频类独有方法
System.out.println("播放视频ing");
}
}
为每一个元素声明一个访问的方法:
public interface Visitor {
void visit(Music music);//访问音乐类
void visit(Video video);//访问视频类
}
实现抽象访问者中的方法,即对每一个元素都有其具体的访问行为。下面以闲人和忙人为例:
public class Idler implements Visitor {//闲人
private String name;
public Idler(String name) {
this.name = name;
}
@Override
public void visit(Music music) {
System.out.println(name + "浏览音乐网站:" + music.getName());
music.playMusic();
}
@Override
public void visit(Video video) {
System.out.println(name + "浏览视频网站:" + video.getName());
video.playVideo();
}
}
public class Busy implements Visitor {//忙人
private String name;
public Busy(String name) {
this.name = name;
}
@Override
public void visit(Music music) {
System.out.println(name + "浏览音乐网站:" + music.getName());
music.download();
}
@Override
public void visit(Video video) {
System.out.println(name + "浏览视频网站:" + video.getName());
video.download();
}
}
另外,为了方便访问多个元素,创建一个对象结构,在其内部管理元素集合,并且可以迭代这些元素供访问者访问:
public class Websites {
List<Web> list = new ArrayList<>();//元素集合
public void accept(Visitor visitor) {
Iterator<Web> iterator = list.iterator();
while (iterator.hasNext()) {//迭代遍历访问
iterator.next().accept(visitor);
}
}
public void addWeb(Web web) {
list.add(web);
}
}
public void test() {
//创建不同的元素
Music wangyiyue = new Music("网易云音乐");
Music kugou = new Music("酷狗");
Video youku = new Video("优酷");
Video iqiyi = new Video("爱奇艺");
//放入对象结构中
Websites websites = new Websites();
websites.addWeb(wangyiyue);
websites.addWeb(kugou);
websites.addWeb(youku);
websites.addWeb(iqiyi);
Visitor idler1 = new Idler("闲人1号");
websites.accept(idler1);//集合接受idler1的访问
System.out.println("-------------------------------------");
Visitor busy1 = new Busy("忙人2号");
websites.accept(busy1);集合接受busy1的访问
}
闲人1号浏览音乐网站:网易云音乐
播放音乐ing
闲人1号浏览音乐网站:酷狗
播放音乐ing
闲人1号浏览视频网站:优酷
播放视频ing
闲人1号浏览视频网站:爱奇艺
播放视频ing
-------------------------------------
忙人2号浏览音乐网站:网易云音乐
下载音乐~~
忙人2号浏览音乐网站:酷狗
下载音乐~~
忙人2号浏览视频网站:优酷
下载视频~~
忙人2号浏览视频网站:爱奇艺
下载视频~~
访问者模式实际使用中比较少,但是真正需要用到时,还是很有用的。
相关文章阅读
Android的设计模式-设计模式的六大原则
创建型模式:
Android的设计模式-单例模式
Android的设计模式-建造者模式
Android的设计模式-工厂方法模式
Android的设计模式-简单工厂模式
Android的设计模式-抽象工厂模式
Android的设计模式-原型模式
行为型模式:
Android的设计模式-策略模式
Android的设计模式-状态模式
Android的设计模式-责任链模式
Android的设计模式-观察者模式
Android的设计模式-模板方法模式
Android的设计模式-迭代器模式
Android的设计模式-备忘录模式
Android的设计模式-访问者模式