-
参考 访问者模式一篇就够了
-
使用场景
-
对一个结构体(比如若干对象组成的数组)中的对象进行不同的不相关的操作,并且尽量减少对对象的修改
-
对象结构(代码)较为稳定,方法属性等稳定
-
主要目的:
-
新增功能:外部类访问结构体中每个元素,访问各自的方法/变量。
-
传统方法:
-
public class Visitor{ public void visit(){ if (e instanceof ElementA) { (ElementA)e.funca(); } if (e instanceof ElementB) { (ElementB)e.funcb(); } } }
- 有大量的判断和类型转换
-
-
现在:每个元素多实现一个方法accept(v),让访问者直接获取元素对象
-
数组中每个元素调用accept(v){v.visit(this)} --> v调用自己的方法
-
-
-
缺点
- 具体元素对访问者公布细节,违反了迪米特原则
- 具体元素变更时导致修改成本大:变更元素属性时,多个访问者都要修改。
-
-
基本元素
-
Visitor: 访问者。接口类或者抽象类。一个visitor对每个element分别实现visit方法
-
public interface Visitor { // 访问A元素 void visit(ElementA eA); // 访问B元素 void visit(ElementB eB); }
-
-
ConcreteVisitor: 具体访问者
-
public class VisitorA extend Visitor{ // 访问A元素 void visit(ElementA eA){print("EA " + EA.funca)}; // 访问B元素 void visit(ElementB eB){print("EB " + EB.funcb)};
-
-
Element: 元素接口/抽象类,定义accept(visitor v)方法,使visitor v可以访问当前元素
-
public class Element{ public void accept(visitor v){ v.visit(this) } }
-
-
ConcreteElement: 具体元素
-
public class ElementA extend element{ public void accept(visitor v){ v.visit(this) } } public class ElementB extend element{ public void accept(visitor v){ v.visit(this) } }
-
-
使用
-
// 元素列表 Element[] eList = {new EA(1), new EB(2), new EA(3), new EB(4)}; VisitorA Va = new VisitorA(); // main for(e in eList){ e.accept(va); };
-
-
访问者模式
最新推荐文章于 2025-06-11 12:35:09 发布