网站尾部,wordpress 收费,大连装修公司排名榜,retweet主题 wordpress文章目录 一.什么是访问者模式#xff1f;二.访问者模式的结构三.访问者模式的应用场景四.访问者模式的优缺点五.访问者模式的C实现六.访问者模式的JAVA实现七.代码解释八.总结 类图#xff1a;
访问者设计模式类图 一.什么是访问者模式#xff1f; 访问者模式#xff08;… 文章目录 一.什么是访问者模式二.访问者模式的结构三.访问者模式的应用场景四.访问者模式的优缺点五.访问者模式的C实现六.访问者模式的JAVA实现七.代码解释八.总结 类图
访问者设计模式类图 一.什么是访问者模式 访问者模式Visitor Pattern是一种行为型设计模式允许在不更改元素类的情况下为对象结构中的元素增加新的操作。访问者模式通过将操作从元素类中抽离出来实现操作的扩展。 在访问者模式中核心思想是将数据结构和操作分开数据结构负责提供必要的接口而具体的操作逻辑由访问者实现。
二.访问者模式的结构
Visitor访问者接口声明一组访问方法每个方法对应一种具体的元素类型。ConcreteVisitor具体访问者实现访问者接口中声明的操作对不同的元素提供不同的处理。Element元素接口定义一个Accept方法用于接收访问者对象。ConcreteElement具体元素实现元素接口并在Accept方法中调用访问者的相应方法。ObjectStructure对象结构提供元素的容器负责存储和遍历元素。
三.访问者模式的应用场景
数据结构稳定操作逻辑需要频繁变化例如编译器中的语法树遍历。需要对一组不相关的类执行操作如不同形状的图形对象圆形、矩形等。需要集中管理行为而不想污染元素类。
四.访问者模式的优缺点
优点 增加新的操作很方便只需新增一个具体访问者类。遵循单一职责原则将操作与元素本身解耦。 缺点 增加新的元素类型需要修改所有访问者违背了开闭原则。对象结构不容易扩展。
五.访问者模式的C实现
#include iostream
#include vector
#include memory// 前置声明避免循环引用
class ConcreteElementA;
class ConcreteElementB;
class Visitor;// 访问者接口Visitor
class Visitor {
public:virtual void visitConcreteElementA(ConcreteElementA element) 0;virtual void visitConcreteElementB(ConcreteElementB element) 0;virtual ~Visitor() default;
};// 元素接口Element
class Element {
public:virtual void accept(std::shared_ptrVisitor visitor) 0;virtual ~Element() default;
};// 具体元素 AConcreteElementA
class ConcreteElementA : public Element {
public:void accept(std::shared_ptrVisitor visitor) override {visitor-visitConcreteElementA(*this);}void operationA() {std::cout ConcreteElementA specific operation.\n;}
};// 具体元素 BConcreteElementB
class ConcreteElementB : public Element {
public:void accept(std::shared_ptrVisitor visitor) override {visitor-visitConcreteElementB(*this);}void operationB() {std::cout ConcreteElementB specific operation.\n;}
};// 具体访问者 1ConcreteVisitor1
class ConcreteVisitor1 : public Visitor {
public:void visitConcreteElementA(ConcreteElementA element) override {std::cout ConcreteVisitor1 visiting ConcreteElementA.\n;element.operationA();}void visitConcreteElementB(ConcreteElementB element) override {std::cout ConcreteVisitor1 visiting ConcreteElementB.\n;element.operationB();}
};// 具体访问者 2ConcreteVisitor2
class ConcreteVisitor2 : public Visitor {
public:void visitConcreteElementA(ConcreteElementA element) override {std::cout ConcreteVisitor2 visiting ConcreteElementA.\n;element.operationA();}void visitConcreteElementB(ConcreteElementB element) override {std::cout ConcreteVisitor2 visiting ConcreteElementB.\n;element.operationB();}
};// 对象结构ObjectStructure
class ObjectStructure {
private:std::vectorstd::shared_ptrElement elements;public:void addElement(std::shared_ptrElement element) {elements.push_back(element);}void accept(std::shared_ptrVisitor visitor) {for (auto element : elements) {element-accept(visitor);}}
};// 测试代码
int main() {// 创建对象结构ObjectStructure objectStructure;// 添加元素objectStructure.addElement(std::make_sharedConcreteElementA());objectStructure.addElement(std::make_sharedConcreteElementB());// 创建访问者 1 并访问std::shared_ptrVisitor visitor1 std::make_sharedConcreteVisitor1();std::cout Using ConcreteVisitor1:\n;objectStructure.accept(visitor1);// 创建访问者 2 并访问std::shared_ptrVisitor visitor2 std::make_sharedConcreteVisitor2();std::cout \nUsing ConcreteVisitor2:\n;objectStructure.accept(visitor2);return 0;
}六.访问者模式的JAVA实现
// 抽象访问者
interface Visitor {void VisitConcreteElementA(ConcreteElementA elementA);void VisitConcreteElementB(ConcreteElementB elementB);
}// 具体访问者1
class ConcreteVisitor1 implements Visitor {Overridepublic void VisitConcreteElementA(ConcreteElementA elementA) {System.out.println(ConcreteVisitor1 visiting ConcreteElementA);}Overridepublic void VisitConcreteElementB(ConcreteElementB elementB) {System.out.println(ConcreteVisitor1 visiting ConcreteElementB);}
}// 具体访问者2
class ConcreteVisitor2 implements Visitor {Overridepublic void VisitConcreteElementA(ConcreteElementA elementA) {System.out.println(ConcreteVisitor2 visiting ConcreteElementA);}Overridepublic void VisitConcreteElementB(ConcreteElementB elementB) {System.out.println(ConcreteVisitor2 visiting ConcreteElementB);}
}// 抽象元素
abstract class Element {public abstract void Accept(Visitor visitor);
}// 具体元素A
class ConcreteElementA extends Element {Overridepublic void Accept(Visitor visitor) {visitor.VisitConcreteElementA(this);}public void OperationA() {System.out.println(ConcreteElementA specific operation.);}
}// 具体元素B
class ConcreteElementB extends Element {Overridepublic void Accept(Visitor visitor) {visitor.VisitConcreteElementB(this);}public void OperationB() {System.out.println(ConcreteElementB specific operation.);}
}// 对象结构
class ObjectStructure {private final ListElement elements new ArrayList();public void Add(Element element) {elements.add(element);}public void Accept(Visitor visitor) {for (Element element : elements) {element.Accept(visitor);}}
}// 客户端代码
public class VisitorPatternDemo {public static void main(String[] args) {// 创建对象结构ObjectStructure structure new ObjectStructure();// 添加具体元素structure.Add(new ConcreteElementA());structure.Add(new ConcreteElementB());// 创建并使用访问者1ConcreteVisitor1 visitor1 new ConcreteVisitor1();structure.Accept(visitor1);// 创建并使用访问者2ConcreteVisitor2 visitor2 new ConcreteVisitor2();structure.Accept(visitor2);}
}七.代码解释
Element 接口和 ConcreteElement Element接口定义了一个accept方法具体元素类需要实现该方法并在其中调用访问者的相应方法。 Visitor 接口和 ConcreteVisitor Visitor接口声明了针对每种具体元素的访问方法。ConcreteVisitor1和ConcreteVisitor2实现了Visitor接口并定义了对ConcreteElementA和ConcreteElementB的具体操作。 ObjectStructure 类 ObjectStructure维护了一个元素集合并提供accept方法用于将访问者传递给集合中的每个元素。 测试代码 创建了一个对象结构并添加了两种具体元素。使用两个不同的访问者访问元素集合展示了访问者模式的扩展性。
八.总结 访问者模式是一种将操作和数据结构分离的强大工具。当需要频繁添加新的操作或行为时它提供了扩展性良好的解决方案。通过访问者模式可以大幅简化复杂操作的管理提升代码的可读性和维护性。