不三不四的脑洞—— 设计模式之访问者模式(Visitor Pattern)

0 阅读6分钟

《相亲女生的彩礼要求 —— 见人下菜碟》

1. 背景(Foundation of the Pyramid)

在一座民风淳朴却传统深厚的小城,婚姻大事向来由父母操心,相亲是年轻人步入婚姻的主要方式。
小芳,28岁,大学毕业,工作稳定,性格聪慧务实。她不排斥相亲,但也不愿被当成“待价而沽”的商品。她深知,在这个彩礼动辄十几万甚至几十万的年代,如何提彩礼,不仅关乎金钱,更是一场关于尊重、智慧与人情的博弈

她的目标很明确:找到一个真正懂她、能共度余生的人,而不是一场交易。

在这里插入图片描述

2. 冲突(Rising Tension)

小芳很快发现,相亲市场并非理想之地。

  • 有人认为她“太恋爱脑”,不愿谈钱;
  • 也有人觉得她“太现实”,张口就是高价彩礼;
  • 更多家庭则陷入僵局:给不起怕被看不起,给多了又怕被“宰”。

她意识到:一刀切的彩礼标准只会让真心被误解,让感情被物化。
真正的难题是:如何在不失尊严的前提下,根据对方实际情况,提出既体面又合理的彩礼方案?

在这里插入图片描述


3. 转折与行动(Climbing the Pyramid)

小芳决定改变策略。她不再被动等待,而是主动出击,像一位“情感分析师”一样,深入了解每一位相亲对象的家庭背景、经济状况和价值观。

她给自己定下原则:

“不是见钱下菜碟,而是见人下菜碟。”

她开始以“访问者”的姿态,走进每一个家庭的故事中:

第一站:普通家庭的小李

  • 家境普通,父母是工人,积蓄有限。
  • 小芳了解后,提出:“彩礼象征心意即可,我更看重的是我们两个人的努力。”
  • 她建议用“三金+八万”作为礼节性表达,并主动提出婚后共同还房贷。
  • 结果:小李感动于她的体谅,父母也赞她“懂事”。

在这里插入图片描述

第二站:困难家庭的小王

  • 父亲患病,家庭负债,相亲只为“完成任务”。
  • 小芳没有提具体金额,而是说:“彩礼不是负担,是祝福。你们给个仪式,我带份心意,未来我们一起扛。”
  • 她甚至主动提出:“如果结婚,我愿意把彩礼返还,用于家庭周转。”
  • 结果:小王红了眼眶,坦言“从没人这样为我考虑过”。

在这里插入图片描述

第三站:富裕家庭的小张

  • 家族企业,经济优渥,母亲强势,认为“高价彩礼才显诚意”。
  • 小芳不卑不亢:“我受过良好教育,有独立事业,对未来生活有期待。如果你们愿意接纳我,我希望彩礼能体现这份价值——比如五十万,用于我们婚后创业基金。”
  • 结果:母亲起初不满,但父亲欣赏她的自信与规划,最终达成共识。

在这里插入图片描述


4. 高潮(Apex of the Pyramid)

一次家庭聚会上,三位母亲偶然相遇,聊起小芳。

  • 小李妈说:“她体谅我们,真是好姑娘。”
  • 小王妈哽咽:“她没嫌弃我们穷,还愿意帮我们。”
  • 小张妈点头:“她有底气,不贪钱,但也不委屈自己。”

三人惊讶地发现:小芳对每个家庭都提出了不同的彩礼方案,却都让人感到被尊重、被理解。

那一刻,小芳的智慧不再是“精明算计”,而是一种高情商的共情能力

在这里插入图片描述

5. 结局(Resolution)

最终,小芳没有选择最有钱的小张,也没有同情最困难的小王,而是和踏实努力的小李走到了一起。
他们的婚礼简单而温馨,彩礼不多,但每一分都承载着理解与承诺。

小城的人们开始谈论:“小芳不是要钱,她是在用彩礼这面镜子,照出每一段关系的本质。” 在这里插入图片描述

具体代码实现

定义接口和类

using System;

// 定义相亲对象接口
public interface IProspectivePartner
{
    void Accept(IProspectVisitor visitor);
}

// 定义访问者接口
public interface IProspectVisitor
{
    void Visit(PoorProspect prospect);
    void Visit(AverageProspect prospect);
    void Visit(RichProspect prospect);
}

// 具体的相亲对象实现
public class PoorProspect : IProspectivePartner
{
    public void Accept(IProspectVisitor visitor)
    {
        visitor.Visit(this);
    }
}

public class AverageProspect : IProspectivePartner
{
    public void Accept(IProspectVisitor visitor)
    {
        visitor.Visit(this);
    }
}

public class RichProspect : IProspectivePartner
{
    public void Accept(IProspectVisitor visitor)
    {
        visitor.Visit(this);
    }
}

// 小芳访问者类
public class XiaoFang : IProspectVisitor
{
    public void Visit(PoorProspect prospect)
    {
        Console.WriteLine("对于困难家庭的男生,小芳提出象征性的彩礼要求,并表示愿意共同面对未来的挑战。");
    }

    public void Visit(AverageProspect prospect)
    {
        Console.WriteLine("对于普通家庭的男生,小芳提出适中的彩礼要求,并强调双方感情的重要性。");
    }

    public void Visit(RichProspect prospect)
    {
        Console.WriteLine("对于富裕家庭的男生,小芳提出较高的彩礼要求,并表示这反映了她对未来生活的期望。");
    }
}

class Program
{
    static void Main()
    {
        // 创建不同的相亲对象
        IProspectivePartner poorProspect = new PoorProspect();
        IProspectivePartner averageProspect = new AverageProspect();
        IProspectivePartner richProspect = new RichProspect();

        // 创建小芳访问者
        IProspectVisitor xiaoFang = new XiaoFang();

        // 访问不同的相亲对象
        poorProspect.Accept(xiaoFang);
        averageProspect.Accept(xiaoFang);
        richProspect.Accept(xiaoFang);
    }
}

代码解释

  1. 接口定义

    • IProspectivePartner 接口定义了一个 Accept 方法,用于接受一个访问者。
    • IProspectVisitor 接口定义了针对不同类型的相亲对象的具体访问方法。
  2. 具体实现

    • PoorProspectAverageProspectRichProspect 分别实现了 IProspectivePartner 接口,每个类都提供了一个 Accept 方法来接受访问者。
    • XiaoFang 类实现了 IProspectVisitor 接口,根据不同的相亲对象类型提出了不同的彩礼要求。

在这里插入图片描述

  1. 主程序
    • 创建了不同类型的相亲对象。
    • 创建了小芳访问者。
    • 通过 Accept 方法让不同的相亲对象接受小芳访问者的访问。

通过这种方式,我们实现了访问者模式的一个简单例子。小芳作为访问者,根据不同的相亲对象类型提出了不同的彩礼要求,实现了个性化的访问。

在这里插入图片描述

classDiagram
direction BT
    IProspectivePartner <|.. PoorProspect : implement
    IProspectivePartner <|.. AverageProspect : implement
    IProspectivePartner <|.. RichProspect : implement
	IProspectivePartner ..> IProspectVisitor : dependency
	
	PoorProspect <..> IProspectVisitor : dependency
	AverageProspect <..> IProspectVisitor : dependency
	RichProspect <..> IProspectVisitor : dependency
	
    IProspectVisitor <|.. XiaoFang  : implement

    XiaoFang ..>  PoorProspect : dependency
    XiaoFang ..>  AverageProspect : dependency
    XiaoFang ..>  RichProspect : dependency

    class IProspectivePartner {
	    <<interface>>
        +Accept(IProspectVisitor visitor): void
    }
    
    class IProspectVisitor {
	    <<interface>>
        +Visit(PoorProspect prospect): void
        +Visit(AverageProspect prospect): void
        +Visit(RichProspect prospect): void
    }
    
    class PoorProspect {
        +Accept(IProspectVisitor visitor): void
    }
    
    class AverageProspect {
        +Accept(IProspectVisitor visitor): void
    }
    
    class RichProspect {
        +Accept(IProspectVisitor visitor): void
    }
    
    class XiaoFang {
        +Visit(PoorProspect prospect): void
        +Visit(AverageProspect prospect): void
        +Visit(RichProspect prospect): void
    }

设计模式映射:访问者模式(Visitor Pattern)

这个故事映射了软件设计中的 访问者模式(Visitor Pattern)

  • 对象结构(Object Structure):多个相亲家庭(普通、困难、富裕),各自有不同的状态和属性。
  • 元素(Elements):每个家庭作为“可被访问的元素”,接受小芳的“访问”。
  • 访问者(Visitor):小芳作为“访问者”,根据每个家庭的类型,执行不同的“访问逻辑”(即彩礼策略)。
  • 优势体现:无需修改家庭类本身,小芳就能动态地为不同类型的家庭提供个性化方案,实现了数据与行为的分离

就像代码中的 Accept(Visitor) 方法,每个家庭“接受”小芳的访问,而小芳的 Visit() 方法则根据家庭类型返回不同的彩礼策略。


🎯 结语

真正的好故事,不是讲 “她要了多少钱”,而是讲 “她如何用智慧,让每一段关系都变得更有温度”。
《见人下菜碟》不是一个关于算计的故事,而是一个关于理解、尊重与选择的故事。