访问者模式Visitor Pattern-23种常用设计模式快速入门教程
1.访问者模式定义
访问者模式是一种行为型设计模式,它可以让我们在不改变被访问者类的前提下定义一个新的操作。
它的主要目的是将操作从被访问者类中解耦出来,从而使被访问者和访问者之间的耦合度降低。
2.访问者模式优点
1)可以让我们实现可重用的访问者,
2)可以让被访问者维护所有的访问者的状态,
3)可以让我们实现面向对象的扩展性和可维护性
4)它可以让我们实现简单的代码复用,
5)可以让我们对不同的类型的访问者进行添加和删除,
6)可以让我们对多个访问者进行灵活的控制。
3.访问者模式缺点
1) 可能会导致系统变得非常复杂
2) 可能会增加系统的开发时间
3) 可能会导致系统性能的下降。
4.访问者模式示例代码
传统设计模式讲解时使用的示例代码,大都采用与读者日常生活接解的业务系统没有多大关联关系。以致大部分读者无法做到学以致用,学完就忘记。本文采用使用日常生活中随处可见的支付业务来编写实现代码:
//定义抽象访问者类
public interface PaymentVisitor {
void visit(Payment payment);
}
//定义具体访问者类
public class AlipayVisitor implements PaymentVisitor {
@Override
public void visit(Payment payment) {
//支付宝支付访问者
System.out.println("支付宝支付:" + payment.getAmount());
}
}
//定义另一个具体访问者类
public class WechatVisitor implements PaymentVisitor {
@Override
public void visit(Payment payment) {
//微信支付访问者
System.out.println("微信支付:" + payment.getAmount());
}
}
//定义被访问者类
public class Payment {
private int amount;
public Payment(int amount) {
this.amount = amount;
}
public int getAmount() {
return amount;
}
//接受访问者的访问
public void accept(PaymentVisitor visitor) {
visitor.visit(this); }
}
//定义对象结构类
public class PaymentObjectStructure {
private List<Payment> payments = new ArrayList<>();
//添加
payment public void add(Payment payment) {
payments.add(payment);
}
//移除
payment public void remove(Payment payment) {
payments.remove(payment);
}
//接受访问者
public void accept(PaymentVisitor visitor) {
for (Payment payment : payments) {
payment.accept(visitor);
}
}
}
//客户端使用
public class Client {
public static void main(String[] args) {
Payment payment1 = new Payment(100);
Payment payment2 = new Payment(200);
Payment payment3 = new Payment(300);
PaymentObjectStructure paymentObjectStructure = new PaymentObjectStructure();
paymentObjectStructure.add(payment1);
paymentObjectStructure.add(payment2);
paymentObjectStructure.add(payment3);
PaymentVisitor alipayVisitor = new AlipayVisitor();
PaymentVisitor wechatVisitor = new WechatVisitor();
paymentObjectStructure.accept(alipayVisitor);
paymentObjectStructure.accept(wechatVisitor);
}
}