Matlab访问者模式(Visitor)

25 篇文章 2 订阅
21 篇文章 1 订阅

访问者(Visitor)模式的定义:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构(Element)进行分离,数据结构的类只需要提供对"访问者"开放的接口(API),而对元素的具体处理则作交给访问者(Visitor)负责。

访问者模式中的角色:
Visitor:表示访问者的抽象类,用于声明对数据结构中xxx元素访问的visit(xxx)方法。
ConcreteVisitor:表示具体的访问者,继承Visitor并对其声明的抽象方法提供具体实现。
Element:表示元素的抽象类,即访问者实际要访问的对象,Element角色需要对访问者提供一个开放的接口,即accept方法,该方法的参数就是Visitor角色。
ConcreteElement:表示具体的元素,提供accept方法的实现。
ObjectStructure:负责处理Element元素的集合,即表示数据结构的类。

类图:

Element.m

classdef Element < handle & matlab.mixin.Heterogeneous
    methods(Abstract)
        accept(~,~);
    end   
end

ElementA.m

classdef ElementA < Element
    methods
        function accept(obj,visitor)
            visitor.visitElementA(obj);
        end
        function operationA(~)
            disp("this is OperationA")
        end
    end   
end

ElementB.m

classdef ElementB < Element
    methods
        function accept(obj,visitor)
            visitor.visitElementB(obj);
        end
        function operationB(~)
            disp("this is OperationB")
        end
    end   
end

Visitor.m

classdef Visitor < handle
    methods(Abstract)
       visitElementA(~,~);
       visitElementB(~,~);
    end
end

ConcreteVisitorA.m

classdef ConcreteVisitorA < Visitor    
    methods
        function visitElementA(~,element)
            disp("ConcreteVisitorA 访问 ElementA");           
            element.operationA();
        end       
        function visitElementB(~,element)
            disp("ConcreteVisitorA 访问 ElementB");            
            element.operationB();
        end        
    end    
end

ConcreteVisitorB.m

classdef ConcreteVisitorB < Visitor    
    methods
        function visitElementA(~,element)
            disp("ConcreteVisitorB 访问 ElementA");           
            element.operationA();
        end       
        function visitElementB(~,element)
            disp("ConcreteVisitorB 访问 ElementB");            
            element.operationB();
        end        
    end    
end

ObjectStructure.m

classdef ObjectStructure < handle
    properties
        elements = Element.empty();
    end
    methods
        function handleRequest(obj,visitor)       
            for i = 1:length(obj.elements) 
                obj.elements(i).accept(visitor);
            end
        end
        function addElement(obj,ele)
            obj.elements(end + 1) = ele;
        end
    end
end

测试代码:

os = ObjectStructure();
eleA = ElementA();
eleB = ElementB();
os.addElement(eleA);
os.addElement(eleB);
visitor = ConcreteVisitorA();
os.handleRequest(visitor);
visitor = ConcreteVisitorB();
os.handleRequest(visitor);

运行结果:

参考资料:

https://blog.csdn.net/iluojie/article/details/80382901

https://blog.csdn.net/SomeoneMH/article/details/80591429

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值