`

3. 行为型模式 (9) 访问者模式

阅读更多
3. 行为型模式 (9) 访问者模式

访问者模式(Visitor Pattern)中元素的执行算法可以随着访问者改变而改变。

元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。

优点:
1. 符合单一职责原则。
2. 优秀的扩展性。
3. 灵活性。

缺点:
1. 具体元素对访问者公布细节,违反了迪米特原则。
2. 具体元素变更比较困难。
3. 违反了依赖倒置原则,依赖了具体类,没有依赖抽象。


1. 访问者模式

package com.andrew.pattern0309.visitor.model01;
public interface ComputerPart {
    public void accept(ComputerPartVisitor computerPartVisitor);
}


package com.andrew.pattern0309.visitor.model01;
public class Keyboard implements ComputerPart {
    @Override
    public void accept(ComputerPartVisitor computerPartVisitor) {
        computerPartVisitor.visit(this);
    }
}

package com.andrew.pattern0309.visitor.model01;
public class Monitor implements ComputerPart {
    @Override
    public void accept(ComputerPartVisitor computerPartVisitor) {
        computerPartVisitor.visit(this);
    }
}

package com.andrew.pattern0309.visitor.model01;
public class Mouse implements ComputerPart {
    @Override
    public void accept(ComputerPartVisitor computerPartVisitor) {
        computerPartVisitor.visit(this);
    }
}

package com.andrew.pattern0309.visitor.model01;
public class Computer implements ComputerPart {
    ComputerPart[] parts;
    public Computer() {
        parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};
    }
    @Override
    public void accept(ComputerPartVisitor computerPartVisitor) {
        for (int i = 0; i < parts.length; i++) {
            parts[i].accept(computerPartVisitor);
        }
        computerPartVisitor.visit(this);
    }
}


package com.andrew.pattern0309.visitor.model01;
public interface ComputerPartVisitor {
    public void visit(Computer computer);
    public void visit(Mouse mouse);
    public void visit(Keyboard keyboard);
    public void visit(Monitor monitor);
}


package com.andrew.pattern0309.visitor.model01;
public class ComputerPartDisplayVisitor implements ComputerPartVisitor {
    @Override
    public void visit(Computer computer) {
        System.out.println("Displaying Computer.");
    }
    @Override
    public void visit(Mouse mouse) {
        System.out.println("Displaying Mouse.");
    }
    @Override
    public void visit(Keyboard keyboard) {
        System.out.println("Displaying Keyboard.");
    }
    @Override
    public void visit(Monitor monitor) {
        System.out.println("Displaying Monitor.");
    }
}


package com.andrew.pattern0309.visitor.model01;
/**
 * 1. 访问者模式
 * 
 * @author andrew
 * @date 2018/08/20
 */
public class Client {
    public static void main(String[] args) {
        ComputerPart computer = new Computer();
        computer.accept(new ComputerPartDisplayVisitor());
    }
}
运行结果:
Displaying Mouse.
Displaying Keyboard.
Displaying Monitor.
Displaying Computer.


2. 访问者模式

package com.andrew.pattern0309.visitor.model02;
public interface Element {
    public abstract void accept(IVisitor visitor);
    public abstract void doSomething();
}


package com.andrew.pattern0309.visitor.model02;
public class ConcreteElement1 implements Element {
    public void accept(IVisitor visitor) {
        visitor.visit(this);
    };
    public void doSomething() {
        System.out.println("这是元素1");
    }
}

package com.andrew.pattern0309.visitor.model02;
public class ConcreteElement2 implements Element {
    public void accept(IVisitor visitor) {
        visitor.visit(this);
    };
    public void doSomething() {
        System.out.println("这是元素2");
    }
}


package com.andrew.pattern0309.visitor.model02;
public interface IVisitor {
    public void visit(ConcreteElement1 el1);
    public void visit(ConcreteElement2 el2);
}


package com.andrew.pattern0309.visitor.model02;
public class Visitor implements IVisitor {
    @Override
    public void visit(ConcreteElement1 el1) {
        el1.doSomething();
    }
    @Override
    public void visit(ConcreteElement2 el2) {
        el2.doSomething();
    }
}


package com.andrew.pattern0309.visitor.model02;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class ObjectStruture {
    public static List<Element> getList() {
        List<Element> list = new ArrayList<Element>();
        Random ran = new Random();
        for (int i = 0; i < 10; i++) {
            int a = ran.nextInt(100);
            if (a > 50) {
                list.add(new ConcreteElement1());
            } else {
                list.add(new ConcreteElement2());
            }
        }
        return list;
    }
}


package com.andrew.pattern0309.visitor.model02;
import java.util.List;
/**
 * 2. 访问者模式
 * 
 * @author andrew
 * @date 2018/08/20
 */
public class Client {
    public static void main(String[] args) {
        List<Element> list = ObjectStruture.getList();
        for (Element e: list) {
            e.accept(new Visitor());
        }
    }
}
运行结果:
这是元素1
这是元素1
这是元素1
这是元素1
这是元素2
这是元素2
这是元素1
这是元素2
这是元素1
这是元素1
分享到:
评论

相关推荐

    c++设计模式-行为型模式-访问者模式

    c++设计模式-行为型模式-访问者模式;qt工程;c++简单源码; 访问者(Visitor)模式的定义:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新...

    (行为型模式) Visitor 访问者模式

    C#面向对象设计模式 (行为型模式) Visitor 访问者模式 视频讲座下载

    JAVA-设计模式-行为型模式-访问者模式

    JAVA-设计模式-行为型模式-访问者模式

    java 23种设计模式.zip

    设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象...4.行为型模式:模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。

    23种设计模式 (创建型,结构型,行为型)

    创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3.... 4.... 5....结构型: 6.... 7.... 8.... 9.... 10.... 11.... 12.... 13.... 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)

    23种设计模式,创建型模式共5种,结构型模式7种,行为型模式11种

    9. **访问者模式**:定义一个访问者的接口,用于访问一个对象结构中的元素,并定义一个访问操作在元素上的实现。 10. **迭代器模式**:提供一种方法顺序访问聚合对象的元素,而又不暴露其底层表示。 11. **解释器...

    [行为型模式] 访问者模式的理解

    3. **增加复杂性**:如果对象结构过于复杂,访问者模式会增加系统的理解难度。 在给出的`VisitorPattern.cpp`和`VisitorPattern.h`文件中,我们可以看到实现访问者模式的具体代码。通常,`VisitorPattern.cpp`会...

    设计模式_行为型_访问者模式.md

    访问者模式是23种经典设计模式中行为型模式的一种,其主要目的是封装一些施加于某数据结构元素之上的操作。当这些操作的种类越复杂,越需要经常变更时,访问者模式就显得十分有用。它将作用于元素的操作与元素本身...

    C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式

    ### C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式 #### 概述 在本篇文章中,我们将深入探讨面向对象设计模式中的一个非常重要的模式——**Visitor(访问者)模式**。此模式属于行为型模式的一...

    设计模式 访问者模式

    **访问者模式**是一种行为设计模式,它允许在不修改对象结构的情况下添加新的操作。这种模式主要用于处理具有复杂对象结构的情况,使得我们可以对结构中的每个元素执行特定操作,而无需暴露其内部实现。 访问者模式...

    设计模式的访问者模式的例子

    总结来说,访问者模式提供了一种优雅的方式来扩展对象的行为,而无需修改对象本身。通过将操作和数据结构分离,它增加了系统的灵活性和可维护性。"设计模式的访问者模式的例子"是理解并掌握这一模式的好材料,对于想...

    设计模式之访问者模式(Visitor)

    访问者模式是一种行为设计模式,它使你可以在不修改对象结构的情况下,为对象添加新的操作。这种模式的核心在于将数据结构与对这些数据的操作解耦,使得增加新的操作变得容易,同时也允许独立地改变元素类和访问者类...

    设计模式(创建型、结构型、行为型)

    5. 构造者模式:该模式提供了一种复杂对象的创建方式,通过分步创建对象的不同部分,满足对象的创建过程中不同的业务逻辑。 优点:可以根据业务逻辑来控制对象的创建过程,满足复杂对象的创建需求。 缺点:需要...

    访问者模式在实际开发中的Demo

    访问者模式是设计模式中的一种行为模式,它在实际的软件开发中具有重要的应用价值。通过理解并掌握访问者模式,开发者可以更好地实现对象结构中元素的操作,同时保持元素类的封装性,避免因频繁修改而引入的复杂性。...

    访问者模式代码

    访问者模式是一种设计模式,属于行为模式类别,其主要目的是在不修改对象结构的前提下,为对象结构中的元素提供新的操作。这种模式的核心思想是将数据结构与数据操作分离,使得增加新的操作变得容易,同时也避免了对...

    设计模式-访问者模式(讲解及其实现代码)

    访问者模式.docx`中应该详细介绍了访问者模式的概念、结构、优缺点以及如何实现。而`code`文件夹中则可能包含了上述步骤的示例代码,你可以通过查看这些代码来更深入地理解访问者模式的应用。 总的来说,访问者模式...

    设计模式之访问者模式

    访问者模式是一种软件设计模式,它在对象结构中定义了一个访问者的接口,使得该访问者可以访问该结构中的每一个元素,同时不影响这些元素自身的行为。这种模式的主要目的是将数据操作和业务逻辑分离,使得数据结构...

Global site tag (gtag.js) - Google Analytics