1. 访问者模式
1.1 介绍
在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。
它讲的是表示一个作用于某对象结构中的各元素的操作,它使我可以在不改变各元素的类的前提下定义作用于这些元素的新操作。例如,我在朋友家做客,我是访问者,朋友接收我的访问,我通过朋友的描述,然后对朋友的描述做出一个判断,这就是访问者模式。
1.2 优缺点
优点
-
符合单一职责原则
-
优秀的扩展性
-
灵活性
缺点
-
具体元素对访问者公布细节,违反了迪米特原则
-
具体元素变更比较困难
-
违反了依赖倒置原则,依赖了具体类,没有依赖抽象
1.3 使用场景
1.4 注意事项
访问者可以对功能进行统一,可以做报表、UI、拦截器与过滤器
2. 案例实现
很高兴的是,我爸妈同意了,所以我决定把车借给我朋友,他一上车就对我的车发出了惊叹,轮胎好帅啊,娃娃好漂亮,坐垫好舒服。他摸了摸娃娃,坐上了坐垫。
public abstract class Parts {
public abstract void accept(Friend friend);
}
public class Wheel extends Parts{
public void accept(Friend friend){
friend.visit(this);
}
}
public class Ragdoll extends Parts {
public void accept(Friend friend){
friend.visit(this);
}
}
public class Mat extends Parts {
public void accept(Friend friend){
friend.visit(this);
}
}
public class Car {
Parts[] parts;
public Car() {
this.parts = new Parts[]{
new Wheel(), new Mat(), new Ragdoll()};
}
public void accept(Friend friend){
for(int i = 0 ; i<parts.length; ++i){
parts[i].accept(friend);
}
}
}
public class Friend {
public void visit(Mat mat){
System.out.println("坐垫真棒");
}
public void visit(Wheel wheel){
System.out.println("轮胎真棒");
}
public void visit(Ragdoll ragdoll){
System.out.println("娃娃真棒");
}
}
/** * 访问者模式 * *@Author cly *@Date 2021/08/31 21:04 *@Version 1.0 */
public class Vistor {
public static void main(String[] args) {
Car car = new Car();
car.accept(new Friend());
}
}
访问者模式可以将数据结构和作用在数据结构上的操作之间的耦合解开。
如果系统可以按照算法和数据结构分开,且有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的