访问者模式

  • 参考 访问者模式一篇就够了

  • 使用场景

    • 对一个结构体(比如若干对象组成的数组)中的对象进行不同的不相关的操作,并且尽量减少对对象的修改

    • 对象结构(代码)较为稳定,方法属性等稳定

    • 主要目的:

      • 新增功能:外部类访问结构体中每个元素,访问各自的方法/变量。

        • 传统方法:

          • 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);
        };
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值