惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

小众软件
小众软件
A
About on SuperTechFans
博客园 - Franky
Engineering at Meta
Engineering at Meta
Recent Announcements
Recent Announcements
云风的 BLOG
云风的 BLOG
B
Blog
Microsoft Security Blog
Microsoft Security Blog
L
LangChain Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
U
Unit 42
Martin Fowler
Martin Fowler
Y
Y Combinator Blog
Stack Overflow Blog
Stack Overflow Blog
博客园 - 叶小钗
Vercel News
Vercel News
Apple Machine Learning Research
Apple Machine Learning Research
The Cloudflare Blog
Last Week in AI
Last Week in AI
腾讯CDC
Microsoft Azure Blog
Microsoft Azure Blog
爱范儿
爱范儿
V
V2EX
G
Google Developers Blog

博客园 - 小峰

反思下 [.net] 将 datatable 存储到数据库 - 小峰 要上班了 表达式模版学习笔记 模版元编程学习笔记 模版默认参数小探 boost serialization 试用 套接字 io 模型 小结 精简版 rtti class 能不能这么写 boost/format试用 类成员变量私有化 设计模式小结 c# 程序最小化到系统托盘 [xna]帧数 皆是#惹的祸 [xna]键盘 代码片段 单元测试
接口版本演化引发的思考二
小峰 · 2006-11-08 · via 博客园 - 小峰

   接口版本演化一讲解了接口如何进行演化,基本思想是当接口发生变化的时候尽可能小的对派生类型造成影响。某种程度上也就是对“别人”的代码造成最小的影响。
    下面从设计模式的角度给出另外一个接口版本演化的方案,其核心是visitor模式。
该模式相信很多朋友都有了解。下面给出具体的实现代码:

 1    public interface ITest
 2    {
 3        void Accept(ITestVisitor visitor);
 4    }

 5    public class Test1 : ITest
 6    {
 7        public void Accept(ITestVisitor visitor)
 8        {
 9            visitor.Visitor(this);
10        }

11    }

12    public class Test2 : ITest
13    {
14        public void Accept(ITestVisitor visitor)
15        {
16            visitor.Visitor(this);
17        }

18    }

19    
20    public interface ITestVisitor
21    {
22        void Visitor(Test1 test1);
23        void Visitor(Test2 test2);
24    }

25    public class TestVisitor : ITestVisitor
26    {
27        public void Visitor(Test1 test1)
28        {
29        }

30        public void Visitor(Test2 test2)
31        {
32        }

33    }

   如上,Test类型增加新的服务转嫁为visitor类型增加一个新的扩展类型,符合开闭原则,是个不错的设计方案。该方案的缺点我总结了下:

1. 原体系必须能够增加accept方法。

2. Visitor有可能没有足够的信息(从原体系获取的)来完成动态增加的方法。

3.    原体系发生变化,访问体系也要发生变化。
    可以看到,没有完美的解决方案。这也就是软件设计的魅力所在,一切都是需求驱动。