如何建立一个公网可以访问的网站,品牌策划与管理,wordpress 去掉category,给手机做网站的公司小谈设计模式#xff08;29#xff09;—访问者模式 专栏介绍专栏地址专栏介绍 访问者模式角色分析访问者被访问者 优缺点分析优点将数据结构与算法分离增加新的操作很容易增加新的数据结构很困难4 缺点增加新的数据结构比较困难增加新的操作会导致访问者类的数量增加34 总结… 小谈设计模式29—访问者模式 专栏介绍专栏地址专栏介绍 访问者模式角色分析访问者被访问者 优缺点分析优点将数据结构与算法分离增加新的操作很容易增加新的数据结构很困难4 缺点增加新的数据结构比较困难增加新的操作会导致访问者类的数量增加34 总结 Java程序示例要求首先我们定义一个抽象的图形类Element其中包含一个接受访问者的方法 accept()以及一个抽象的计算面积和周长的方法 calculate()。接下来我们定义一个访问者接口Visitor其中包含了访问圆形和矩形的方法 visit()。然后我们实现具体的访问者类AreaVisitor和PerimeterVisitor分别用于计算图形的面积和周长。最后我们可以在客户端代码中使用访问者模式来计算图形的面积和周长。程序分析 总结 专栏介绍
专栏地址
http://t.csdnimg.cn/VpriY
专栏介绍
主要对目前市面上常见的23种设计模式进行逐一分析和总结希望有兴趣的小伙伴们可以看一下会持续更新的。希望各位可以监督我我们一起学习进步加油各位
访问者模式
访问者模式是一种行为型设计模式它允许你将算法与一个对象结构分离开来。通过这种方式可以在不改变对象结构的情况下向对象结构中添加新的操作。
角色分析
访问者Visitor和被访问者Element
访问者
定义了一组可以访问不同类型被访问者的方法
被访问者
定义了接受访问者的方法。访问者通过被访问者的接口访问被访问者并对其进行操作。
优缺点分析
优点
将数据结构与算法分离
访问者模式可以将数据结构与算法分离使得算法可以独立于数据结构而变化提高了代码的可维护性和可扩展性。
增加新的操作很容易
当需要增加新的操作时只需要增加一个新的访问者类即可不需要修改原有的代码。
增加新的数据结构很困难
当需要增加新的数据结构时需要修改所有的访问者类因此增加新的数据结构比较困难。
4
访问者模式符合单一职责原则和开闭原则 缺点
增加新的数据结构比较困难
当需要增加新的数据结构时需要修改所有的访问者类因此增加新的数据结构比较困难。
增加新的操作会导致访问者类的数量增加
当需要增加新的操作时需要增加一个新的访问者类因此访问者类的数量会增加。
3
导致系统变得复杂增加了代码的阅读难度。
4
访问者模式需要对数据结构进行抽象增加了系统的抽象性和理解难度。
总结
访问者模式适用于数据结构相对稳定但是经常需要增加新的操作的场景同时访问者模式也需要权衡系统的复杂度和可维护性。 Java程序示例
要求
为一个图形库添加一个新的功能即计算图形的面积和周长。我们可以使用访问者模式来实现这个功能。
首先我们定义一个抽象的图形类Element其中包含一个接受访问者的方法 accept()以及一个抽象的计算面积和周长的方法 calculate()。
abstract class Shape {public abstract void accept(Visitor visitor);public abstract void calculate();
}
### 然后我们定义两个具体的图形类圆形和矩形它们都继承自图形类。
java
class Circle extends Shape {private double radius;public Circle(double radius) {this.radius radius;}public double getRadius() {return radius;}public void accept(Visitor visitor) {visitor.visit(this);}public void calculate() {System.out.println(Calculating area and perimeter of circle);}
}class Rectangle extends Shape {private double width;private double height;public Rectangle(double width, double height) {this.width width;this.height height;}public double getWidth() {return width;}public double getHeight() {return height;}public void accept(Visitor visitor) {visitor.visit(this);}public void calculate() {System.out.println(Calculating area and perimeter of rectangle);}
}接下来我们定义一个访问者接口Visitor其中包含了访问圆形和矩形的方法 visit()。
interface Visitor {void visit(Circle circle);void visit(Rectangle rectangle);
}然后我们实现具体的访问者类AreaVisitor和PerimeterVisitor分别用于计算图形的面积和周长。
class AreaVisitor implements Visitor {public void visit(Circle circle) {double area Math.PI * circle.getRadius() * circle.getRadius();System.out.println(Area of circle: area);}public void visit(Rectangle rectangle) {double area rectangle.getWidth() * rectangle.getHeight();System.out.println(Area of rectangle: area);}
}class PerimeterVisitor implements Visitor {public void visit(Circle circle) {double perimeter 2 * Math.PI * circle.getRadius();System.out.println(Perimeter of circle: perimeter);}public void visit(Rectangle rectangle) {double perimeter 2 * (rectangle.getWidth() rectangle.getHeight());System.out.println(Perimeter of rectangle: perimeter);}
}最后我们可以在客户端代码中使用访问者模式来计算图形的面积和周长。
public static void main(String[] args) {ListShape shapes new ArrayList();shapes.add(new Circle(5));shapes.add(new Rectangle(3, 4));Visitor areaVisitor new AreaVisitor();Visitor perimeterVisitor new PerimeterVisitor();for (Shape shape : shapes) {shape.accept(areaVisitor);shape.accept(perimeterVisitor);}
}程序分析
在上面的代码中我们创建了一个包含圆形和矩形的列表并分别使用面积访问者和周长访问者来计算每个图形的面积和周长。 总结
访问者模式可以帮助我们将算法与对象结构分离开来提高代码的可维护性和可扩展性。在实现访问者模式时需要定义一个抽象的被访问者类和访问者接口然后实现具体的被访问者类和访问者类。在客户端代码中可以使用访问者来访问被访问者并对其进行操作。