【设计模式】(二十八)--行为型模式--访问者模式

【设计模式】(二十八)–行为型模式–访问者模式

行为型模式--访问者模式

  • 【设计模式】(二十八)--行为型模式--访问者模式
    • 访问者模式定义
    • 访问者模式的优点
    • 访问者模式的使用场景
    • 访问者模式的简单实现

访问者模式定义

Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.

意思是:封装一些作用于某个数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新操作。
访问者模式基于以下四个元素:

  • Visitor 抽象访问者,声明了每个Concrete Element相应的方法。方法的名称相同,但是每个方法都按照其接受的类型区分。
  • Concrete Visitor 具体访问者,实现抽象访问者角色中的各个访问操作。当需要一组单独的操作时,只需要创建另一个访问者。
  • Element 元素,表示对象结构的基类。结构中所有类都是它的派生,都必须实现accept(Visitor visitor)
  • Concrete Element 具体元素,可能有多种具体元素,是想要添加在Visitor类中实现的外部操作的具体类。

访问者模式的优点

  • 1、符合单一职责原则。
  • 2、优秀的扩展性。
  • 3、灵活性。
    但是访问者模式也有以下缺点
  • 1、具体元素对访问者公布细节,违反了迪米特原则。
  • 2、具体元素变更比较困难。 只要变更,所有访问者都需要变更。
  • 3、违反了依赖倒置原则,依赖了具体类,没有依赖抽象。

访问者模式的使用场景

  • 1、对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。
  • 2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,也不希望在增加新操作时修改这些类。

访问者模式的简单实现

类图
【设计模式】(二十八)--行为型模式--访问者模式_第1张图片
实现

public class Test {
     
    public static void main(String[] args) {
     
        Computer computer = new Computer();
        computer.accept(new ComputerDisplayVisitor());
    }
}
public class Computer {
     
    private Hardware keyboard;
    private Hardware mouse;

    public Computer() {
     
        this.keyboard = new Keyboard("机械键盘", "KeyTronic");
        this.mouse = new Mouse("蓝牙鼠标", "逻辑");
    }

    public void accept(ComputerVisitor computerVisitor) {
     
        keyboard.accept(computerVisitor);
        mouse.accept(computerVisitor);
    }
}
public interface ComputerVisitor {
     
    void visit(Hardware hardware);
}
public class ComputerDisplayVisitor implements ComputerVisitor {
     
    @Override
    public void visit(Hardware hardware) {
     
        System.out.println("显示硬件信息:" + hardware.getInfo());
    }
}
public abstract class Hardware {
     

    private String name;

    private String brand;

    public Hardware(String name, String brand) {
     
        this.name = name;
        this.brand = brand;
    }

    public String getInfo() {
     
        return brand + name;
    }

    abstract void accept(ComputerVisitor computerVisitor);
}
public class Keyboard extends Hardware {
     

    public Keyboard(String name, String brand) {
     
        super(name, brand);
    }

    @Override
    public void accept(ComputerVisitor computerVisitor) {
     
        computerVisitor.visit(this);
    }
}
public class Mouse extends Hardware {
     
    public Mouse(String name, String brand) {
     
        super(name, brand);
    }

    @Override
    public void accept(ComputerVisitor computerVisitor) {
     
        computerVisitor.visit(this);
    }
}

结果
在这里插入图片描述

你可能感兴趣的:(#,设计模式,访问者模式,设计模式,Java)