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

推荐订阅源

GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
Jina AI
Jina AI
Hugging Face - Blog
Hugging Face - Blog
A
About on SuperTechFans
Y
Y Combinator Blog
D
DataBreaches.Net
I
InfoQ
Recent Announcements
Recent Announcements
Last Week in AI
Last Week in AI
G
Google Developers Blog
博客园_首页
博客园 - 司徒正美
V
V2EX
Stack Overflow Blog
Stack Overflow Blog
博客园 - 叶小钗
Engineering at Meta
Engineering at Meta
Apple Machine Learning Research
Apple Machine Learning Research
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
B
Blog
MongoDB | Blog
MongoDB | Blog
博客园 - 【当耐特】
D
Docker
量子位

博客园 - 小峰

反思下 [.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.    原体系发生变化,访问体系也要发生变化。
    可以看到,没有完美的解决方案。这也就是软件设计的魅力所在,一切都是需求驱动。