行为型设计模式之访问者模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了行为型设计模式之访问者模式相关的知识,希望对你有一定的参考价值。

访问者模式

应用

1.数据结构稳定,作用于数据结构的操作经常变化的场景

2.需要数据结构与数据操作分离的场景

3.需要对不同数据类型(元素)进行操作,而不使用分支判断具体类型的场景

举例:饭馆吃饭,饭馆菜品相对固定,但每天去吃饭的人是变化的,人即访问者。

主要角色

1.抽象访问者(Visitor)

2.具体访问者(ConcreteVisitor)

3.抽象元素(Element)

4.具体元素(Concrete Element)

5.结构对象(ObjectStruture)

优缺点

优点:

1.解耦了数据结构与数据操作,使得操作集合可以独立变化

2.扩展性好:可以通过扩展访问者角色,实现对数据集的不同操作

3.元素具体类型并非单一,访问者均可操作

4.心各角色职责分离,符合单一职责原侧出前

缺点:

1.无法增加元素类型:若系统数据结构对象易于变化,经常有新的数据对象增加进来,则访问者类必须增加对应元素类型的操作,违背开闭原则

2.具体元素变更困难:具体元素增加属性,删除属性等操作会导致对应的访问者类需要进行相应的修改,尤其当有大量访问者类时,修改范围太大

3.违背依赖倒置原则:访问者依赖的是具体元素类型,而不是抽象。

基本使用

创建抽象访问者

public interface IVisitor 

    void visit(ConcreteElementA element);

    void visit(ConcreteElementB element);

创建具体访问者

public class ConcreteVisitorA implements IVisitor 

    public void visit(ConcreteElementA element) 
        String result = element.get();
        System.out.println("具体访问者ConcreteVisitorA,访问结果: " + result);
    

    public void visit(ConcreteElementB element) 
        String result = element.get();
        System.out.println("具体访问者ConcreteVisitorA,访问结果: " + result);
    

public class ConcreteVisitorB implements IVisitor 

    public void visit(ConcreteElementA element) 
        String result = element.get();
        System.out.println("具体访问者ConcreteVisitorB,访问结果: " + result);
    


    public void visit(ConcreteElementB element) 
        String result = element.get();
        System.out.println("具体访问者ConcreteVisitorB,访问结果: " + result);
    

创建抽象元素

public interface IElement 
    void accept(IVisitor visitor);

创建具体元素

public class ConcreteElementA implements IElement 

    public void accept(IVisitor visitor) 
        visitor.visit(this);
    

    public String get() 
        return "我是具体元素ConcreteElementA";
    

public class ConcreteElementB implements IElement 

    public void accept(IVisitor visitor) 
        visitor.visit(this);
    

    public String get() 
      return "我是具体元素ConcreteElementB";
    

创建结构对象

public class ObjectStructure 
    private List<IElement> list = new ArrayList<IElement>();

    
        this.list.add(new ConcreteElementA());
        this.list.add(new ConcreteElementB());
    

    public void accept(IVisitor visitor) 
        for (IElement element : this.list) 
            element.accept(visitor);
        
    

客户端执行

    public static void main(String[] args) 
        // 结构对象
        ObjectStructure collection = new ObjectStructure();
        // 访问者A
        IVisitor visitorA = new ConcreteVisitorA();
        collection.accept(visitorA);
        System.out.println("------------------------------------");
        // 访问者B
        IVisitor visitorB = new ConcreteVisitorB();
        collection.accept(visitorB);
    
具体访问者ConcreteVisitorA,访问结果: 我是具体元素ConcreteElementA
具体访问者ConcreteVisitorA,访问结果: 我是具体元素ConcreteElementB
------------------------------------
具体访问者ConcreteVisitorB,访问结果: 我是具体元素ConcreteElementA
具体访问者ConcreteVisitorB,访问结果: 我是具体元素ConcreteElementB

以上是关于行为型设计模式之访问者模式的主要内容,如果未能解决你的问题,请参考以下文章

行为型模式之访问者模式

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

Java设计模式之十一种行为型模式(附实例和详解)

设计模式之行为型模式

GoF23种设计模式之行为型模式之访问者模式

设计模式——行为型模式之迭代器模式