访问者模式是一种设计模式,它将数据结构与作用于结构上的操作解耦,使得操作集合可相对自由地演化而不影响系统的数据结构。访问者模式把相关的行为封装在一起,构成一个访问者,使每一个访问者的功能都比较单一。访问者模式的主要缺点如下:增加新的元素类很困难;在访问者模式中,每增加一个新的元素类,都要在每一个具体访问者类中增加相应的具体操作,这违背了“开闭原则”;破坏封装;访问者模式中具体元素对访问者公布细节,这破坏了对象的封装性;违反了依赖倒置原则。 ,,观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时,它的所有依赖者都会收到通知并自动更新自己。
本文目录导读:
访问者模式(Visitor Pattern)是一种将数据结构与业务逻辑分离的设计模式,它允许你在不修改数据结构的情况下,为数据结构中的元素添加新的操作,这种模式在编程中非常实用,特别是在处理具有多个相同基类的派生类时,在本篇文章中,我们将详细介绍访问者模式的定义、特点、实现以及应用场景,并通过一个实例来演示如何使用访问者模式。
访问者模式的定义
访问者模式定义了一种一对多的依赖关系,让多个对象都有机会处理某一个对象,从而避免了不必要的代码重复,它是在面向对象编程中的一种结构型设计模式,可以让你在不改变数据结构的前提下增加新的操作。
访问者模式的特点
1、松耦合:访问者模式将数据和业务逻辑分离,使得数据结构和业务逻辑可以独立地变化,这有助于提高代码的可维护性和可扩展性。
2、易于扩展:当需要为数据结构中的元素添加新的操作时,只需添加一个访问者类即可,无需修改原有的数据结构和业务逻辑。
3、符合单一职责原则:访问者模式将数据结构和业务逻辑分离,使得每个类都只负责一项职责,有利于降低类之间的耦合度。
访问者模式的实现
下面我们通过一个简单的示例来说明如何实现访问者模式,假设我们有一个表示动物的基类Animal,以及两个表示不同动物类型的派生类Dog和Cat,我们希望为这些动物添加一个计算体重的方法。
// 抽象动物类 public abstract class Animal { public abstract void accept(Visitor visitor); } // Dog类 public class Dog extends Animal { private String name; private int weight; public Dog(String name, int weight) { this.name = name; this.weight = weight; } @Override public void accept(Visitor visitor) { visitor.visitDog(this); } } // Cat类 public class Cat extends Animal { private String name; private int weight; public Cat(String name, int weight) { this.name = name; this.weight = weight; } @Override public void accept(Visitor visitor) { visitor.visitCat(this); } }
接下来我们需要定义一个访问者接口和具体的访问者类。
// 访问者接口 public interface Visitor { void visitDog(Dog dog); void visitCat(Cat cat); } // 具体访问者类(计算体重) public class WeightCalculator implements Visitor { private int totalWeight; @Override public void visitDog(Dog dog) { totalWeight += dog.getWeight(); } @Override public void visitCat(Cat cat) { totalWeight += cat.getWeight(); } public int getTotalWeight() { return totalWeight; } }
我们可以在客户端代码中使用访问者模式。
public class Client { public static void main(String[] args) { List<Animal> animals = new ArrayList<>(); animals.add(new Dog("旺财", 30)); animals.add(new Cat("汤姆", 10)); Visitor visitor = new WeightCalculator(); for (Animal animal : animals) { animal.accept(visitor); // 通过访问者模式计算总体重并输出结果:60 (30 + 10)