前言
Android的设计模式系列文章介绍,欢迎关注,持续更新中:
Android的设计模式-设计模式的六大原则
创建型模式:
Android的设计模式-单例模式
Android的设计模式-建造者模式
Android的设计模式-工厂方法模式
Android的设计模式-简单工厂模式
Android的设计模式-抽象工厂模式
Android的设计模式-原型模式
行为型模式:
Android的设计模式-策略模式
Android的设计模式-状态模式
Android的设计模式-责任链模式
Android的设计模式-观察者模式
Android的设计模式-模板方法模式
Android的设计模式-迭代器模式
Android的设计模式-备忘录模式
Android的设计模式-访问者模式
1.定义
封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
2.介绍
- 访问者模式属于行为型模式。
- 访问者模式是一种将数据结构和数据操作分离的设计模式。
- 访问者模式比较复杂,而且实际使用的地方并不多。
- 访问者模式适用于数据结构稳定的元素操作上,一旦数据结构易变,则不适用。
3.UML类图
角色说明:
- Visitor(抽象访问者):接口或者抽象类,为每一个元素(Element)声明一个访问的方法。
- ConcreteVisitor(具体访问者):实现抽象访问者中的方法,即对每一个元素都有其具体的访问行为。
- Element(抽象元素):接口或者抽象类,定义一个accept方法,能够接受访问者(Visitor)的访问。
- ConcreteElementA、ConcreteElementB(具体元素):实现抽象元素中的accept方法,通常是调用访问者提供的访问该元素的方法。
- Client(客户端类):即要使用访问者模式的地方。
4.实现
以我们平时听歌看视频为例,音乐视频网站都会提供在线播放和下载的功能,当我们有空的时候往往就选择了在线播放,比较忙的时候就选择先下载下来,有空的时候再去观看。其中,音乐视频网站就是具体的要访问的元素,闲人和忙人就是具体的访问者,闲人和忙人的访问行为是不一样的。
4.1 创建抽象元素
定义一个抽象的受访问方法以及其他公共的方法:
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;
}
}
4.2 创建具体元素
实现抽象元素中的accept()
方法,通常是调用访问者提供的访问该元素的方法。下面创建音乐类以及视频类,他们都有一个download()
方法,但是其具体下载的内容是不一样的,同时他们也存在各自独有的方法playMusic()
和playVideo()
:
public class Music extends Web {
//音乐类,继承自Web类
public Music(String name) {
super(name)