今日看了下访问者模式,并尝试编写代码查看其原理和实现方法。
访问者模式
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
个人理解
个人觉得就是一个通过实现接口的实现与转型来实现的一种设计模式,以通过不该变原来的操作方式进行拓展
代码实现操作
需要
- 被操作的元素-提供一个回调的方法
- 不同的访问模式-提供一个进行对象操作的方法
- 集中管理访问的管理接口
代码实现
被操作的元素(假设为各个星球)
public class Star
{
private String name;
//这里设定名字
public Star(String name)
{
this.setName(name);
}
//这里提供一个访问的入口
public void accept(Visitor visitor)
{
visitor.control(this);
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
提供一个观察者的接口,所有的观察者都要实现这个接口
public interface Visitor
{
void control(Star star);
}
第一个观察者,他所做的事情就是拯救这些星球(用系统打印代替想做的事情)
public class SaveVisitor implements Visitor
{
private String name;
public SaveVisitor(String name)
{
this.name = name;
}
@Override
public void control(Star star)
{
System.out.println(this.name + "正在尝试拯救" + star.getName());
}
}
第二个观察者,他所做的事情就是摧毁这些星球(用系统打印代替想做的事情)
public class DestoryVisitor implements Visitor
{
private String name;
public DestoryVisitor(String name)
{
this.name = name;
}
@Override
public void control(Star element)
{
System.out.println(this.name + "正在尝试摧毁" + element.getName());
}
}
统一的管理者
public class ObjectStructure
{
List<Star> list = new ArrayList<Star>();
public void add(Star e)
{
list.add(e);
}
public void remove(Star e)
{
list.remove(e);
}
public void accpet(Visitor visitor)
{
list.forEach(e -> {
e.accept(visitor);
});
}
}
进行测试
public class Client
{
public static void main(String[] args)
{
ObjectStructure os = new ObjectStructure();
os.add(new Star("地球"));
os.add(new Star("火星"));
Visitor v = new DestoryVisitor("灰太狼");
Visitor v1 = new SaveVisitor("喜羊羊");
os.accpet(v);
os.accpet(v1);
}
}
查看结果
个人想法
- 本次代码实现星球其实可以定义为接口,可以更具有普遍性。
- 集中管理的可以不定义为列表,根据业务需求进行定义
当数据结构提供观察者入口之后,以后可以在观察者本身定义自己独有的操作方法,而不用修改原来的数据结构
通俗的来讲就是对数据的操作,可以通过拓展类来进行增加新的操作方法,但是假如新增的过多,可能不便管理