访问者模式,自我感觉就相当于是从不同的方向去实现相同的问题,只不过使用访问者模式后,和一般写法导致的扩展能力正好相反。
相当于将接口中原本应该存在的每一 个功能方法都变成了一个个的功能访问者。
一般继承接口,实现所有接口方法:不同实现类的扩展容易,其中的方法扩展困难。
访问者模式:不同实现类扩展困难,其中的方法扩展容易。
一般情况下我们都是定义好接口,以及接口需要实现的所有方法,然后方法的具体实现就交给不同的实现类去实现。这样的话,新增不同
的实现类非常容易,但是要扩展接口的方法就不是那么容易了,因为这样需要将所有实现类都重新实现新的接口方法。
如果我们目前面临的情况是,我们的实现类一般情况下不需要变化扩展,但是里面的方法可能需要经常变化,这样,直接使用上面的实现
模式就不太友好了。这时候,访问 者模 式就闪亮登场了。
首先,为了好说明,我们先定义一个Person接口,有两个实现类BoyPerson,GirlPerson。有一个访问者接口Visitor。
访问者模式的思路:在person接口中我们只需要定义一个方法,用来接收不同的访问者,然后将自身传给访问者。
而我们在访问者的接口中,定义一个重载方法,方法名都是visit,但 是参数是person具体的实现类,注意,所有的
实现类都要用这个visit方法列举一 遍,在这里就是BoyPerson,GirlPerson参数的两个重载方法。
按理说,Person应该有自己的方法啊,例如:吃饭eat()方法,睡觉sleep()方法。但是,我们在Person中并没有定义这两个方法,我们
要把这两个方法分别定义成两个访问者, 分别是吃饭访问者,睡觉访问者。然后在吃饭访问者中实现BoyPerson的吃饭功能和GrilPerson
的吃饭功能,以及在睡觉访问者中实现BoyPerson的睡觉功能和 GrilPerson的睡觉功能。
就这样,我们把原本应该定义的Person接口中的方法分别定义成了不同的访问者,如果我们还要为Person添加新的能力,只要新建对应
功能的访问者就可以了。导致 新增方法变得很容易,但是这样,扩展不同的Person就变得困难了,因为这样要扩展黑人,白人等各种Person,
我们就需要在所有的访问者中都添加一遍黑人,白人等各种Person的visit实现。
友情链接:http://www.runoob.com/design-pattern/visitor-pattern.html
这只是本人看了访问者模式的一点想法,如有不对的地方还请留言指正。