接口版本演化引发的思考二
接口版本演化一讲解了接口如何进行演化,基本思想是当接口发生变化的时候尽可能小的对派生类型造成影响。某种程度上也就是对“别人”的代码造成最小的影响。
下面从设计模式的角度给出另外一个接口版本演化的方案,其核心是visitor模式。
该模式相信很多朋友都有了解。下面给出具体的实现代码:
如上,Test类型增加新的服务转嫁为visitor类型增加一个新的扩展类型,符合开闭原则,是个不错的设计方案。该方案的缺点我总结了下:
可以看到,没有完美的解决方案。这也就是软件设计的魅力所在,一切都是需求驱动。
下面从设计模式的角度给出另外一个接口版本演化的方案,其核心是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
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

如上,Test类型增加新的服务转嫁为visitor类型增加一个新的扩展类型,符合开闭原则,是个不错的设计方案。该方案的缺点我总结了下:
1. 原体系必须能够增加accept方法。
2. Visitor有可能没有足够的信息(从原体系获取的)来完成动态增加的方法。
3. 原体系发生变化,访问体系也要发生变化。可以看到,没有完美的解决方案。这也就是软件设计的魅力所在,一切都是需求驱动。