访问者模式:如何实现对象级别的矩阵结构?

今天我们先来看一个原理看似很简单,但是理解起来有一定难度,使用场景相对较少的行为型模式:访问者模式

一、模式原理分析

访问者模式的原始定义是:允许在运行时将一个或多个操作应用于一组对象,将操作与对象结构分离。

这个定义会比较抽象,但是我们依然能看出两个关键点:一个是运行时使用一组对象的一个或多个操作,比如,对不同类型的文件(.pdf、.xml、.properties)进行扫描;另一个是分离对象的操作和对象本身的结构,比如,扫描多个文件夹下的多个文件,对于文件来说,扫描是额外的业务操作,如果在每个文件对象上都加一个扫描操作,太过于冗余,而扫描操作具有统一性,非常适合访问者模式。

所以说,访问者模式核心关注点是分离一组对象结构和对象的操作,对象结构可以各不相同,但必须以某一个或一组操作作为连接的中心点。换句话说,访问者模式是以行为(某一个操作)作为扩展对象功能的出发点,在不改变已有类的功能的前提下进行批量扩展

访问者模式的UML图如下:


从这个 UML 图中,我们能看出访问者模式包含的关键角色有四个。

  • 访问者类(Visitor):这是一个接口或抽象类,定义声明所有可访问类的访问操作。

  • 访问者实现类(VisitorBehavior):实现在访问者类中声明的所有访问方法。

  • 访问角色类(Element):定义一个可以获取访问操作的接口,这是使客户端对象能够“访问”的入口点。

  • 访问角色实现类(Element A 等):实现访问角色类接口的具体实现类,将访问者对象传递给此对象作为参数。

也就是说,访问者模式可以在不改变各来访类的前提下定义作用于这些来访类的新操作。比如,在没有二维码的时代,旅游景区检票大门提供的访问者实现类就是人工检票,无论哪里来的游客只有购票、检票后才能入园。现在有了二维码后,园区新增一个检票机,将二维码作为一种新的进景点的操作(对应访问者类),那么各类游客(对应访问角色类)可能用支付宝扫二维码,也可能使用微信扫二维码,这时二维码就是新的一个访问点。园区没有改变来访者,但是提供了一种新的操作,对于园区来说,不管你是什么身份的人,对他们来说都只是一个访问者而已。

接下来,我们再来看看 UML 对应的代码实现:

public interface Visitor {
   
    void visitA(ElementA elementA);
    void visitB(ElementB elementB);
    //...
    //void visitN(ElementN elementN);
}
public class VisitorBehavior implements Visitor {
   
    @Override
    public void visitA(ElementA elementA) {
   
        int x = elementA.getAState();
        x++;
        System.out.println("=== 当前A的state为:"+x);
        elementA.setAState(x);
    }
    @Override
    public void visitB(ElementB elementB) {
   
        double x = elementB.getBState();
        x++;
        System.out.println("=== 当前B的state为:"+x);
        elementB.setBState(x
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
访问 Eigen::Matrix 的元素有多种方式,具体取决于你想要实现的功能和操作。以下是几种常见的访问方式: 1. 使用括号运算符:可以使用括号运算符 ( ) 来访问和修改矩阵的元素。例如,`matrix(0, 1)` 可以用来访问矩阵的第一行第二列的元素。 2. 使用方括号运算符:Eigen 还支持使用方括号运算符 [ ] 来访问和修改矩阵的元素。通过将元素的行索引和列索引作为参数传递给方括号运算符,可以访问特定位置的元素。例如,`matrix[0][1]` 可以用来访问矩阵的第一行第二列的元素。 3. 使用 `.row()` 和 `.col()` 成员函数:Eigen 提供了 `.row()` 和 `.col()` 成员函数,用于访问矩阵的行和列。这些函数返回一个表示相应行或列的向量对象,可以对这些向量对象进行进一步的操作。例如,`matrix.row(0)` 返回一个表示矩阵的第一行的向量对象。 4. 使用 `.block()` 成员函数:如果你需要访问矩阵的子矩阵或连续的一部分区域,可以使用 `.block()` 成员函数。该函数接受起始行、起始列、行数和列数作为参数,并返回一个表示指定区域的子矩阵对象。例如,`matrix.block(0, 0, 2, 2)` 返回一个表示矩阵的左上角2x2子矩阵对象。 这些只是访问 Eigen::Matrix 元素的一些常见方式,还有其他更高级的操作和方法可用于特定的需求。你可以根据自己的需求选择最合适的访问方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱娃哈哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值