Facade模式
当你需要使用一个很复杂的系统,你作为一个使用者,当然希望使用起来越简单越好,最好是一个概念上的功能只需要调用一个函数接口。这时候向你提供系统的人就要考虑使用facade模式了。通过这种模式改进后,系统提供者把系统的对外使用的复杂度降低了,使用者就可以很简单的使用系统了。举例来说,在导航软件中,路径规划功能是一个比较复杂的调用过程:
1,设置起点
2,设置终点
3,设置规划模式
4,计算路径
5,计算导航信息
作为使用者,你需要调用5个函数来完成,也就是你需要学习5个函数调用,每个函数的参数如何设置,5个函数的返回值的含义等等,这些都需要学习。于是,你就会问:“我只需要调用一个函数,参数为3个(起点,终点,模式),只需要调用一次就好了。”并且,这5个函数就是一个整体,一个路径规划必须包含这5个过程。于是,提供者提供了一个接口,内部就是调用上面5个函数来实现。这就是facade模式。
adapter模式
为了统一接口风格,而现有的系统同样的功能确实另一个名字,这时候就可以用把现有的系统封装成一个类,这个类暴露出统一的接口风格,而这个接口的内部实现只是简单的调用原来那个功能。其实就是把现有的函数名,使用用用户希望的函数名再包一层出去。举例来说,你有一个shap类,shap类有3个子类,point类,line类和square类。shap类中有个虚函数为display()。每个子类都会具体实现display()函数,这个就是多态。对子类显示功能,都可以通过父类指针调用display()函数来实现。这时候,我们需要添加一个circle类,很显然的想法,circle类也从shap中继承,这样通过父类指针调用display()也就可以实现显示功能,和其他3个子类的使用方法一样。但是问题出来了,隔壁有人已经实现了circle类类似的功能,秉着复用的精神,我们最好直接拿过来用。但是,他们的circle类有另一个名字,叫xxcircle类,它的显示函数不叫display(),叫xxdisplay()。状况变成,要使用已经实现的xxcircle类,必然无法统一使用父类指针操作,如果修改xxcircle类,对方不见得同意,并且修改总会带来bug。这时候adapter模式出现了。你还是定义自己的circle类,继承于shape类,接口函数名也是display()。这是circle类中包含一个xxcircle类的对象,而display()内部函数通过调用xxcircle类对象的xxdisplay()方法来实现。
总结
上面2种模式有其相同之处,就是对现有系统的内容不做修改,而是把对外的接口重新定义了下。区别在于facade中新定义的接口通过调用现有系统多个函数来实现,它们是1对多的关系;而adapter中新定义的接口和内部原来的接口为1对1的关系。
当你需要使用一个很复杂的系统,你作为一个使用者,当然希望使用起来越简单越好,最好是一个概念上的功能只需要调用一个函数接口。这时候向你提供系统的人就要考虑使用facade模式了。通过这种模式改进后,系统提供者把系统的对外使用的复杂度降低了,使用者就可以很简单的使用系统了。举例来说,在导航软件中,路径规划功能是一个比较复杂的调用过程:
1,设置起点
2,设置终点
3,设置规划模式
4,计算路径
5,计算导航信息
作为使用者,你需要调用5个函数来完成,也就是你需要学习5个函数调用,每个函数的参数如何设置,5个函数的返回值的含义等等,这些都需要学习。于是,你就会问:“我只需要调用一个函数,参数为3个(起点,终点,模式),只需要调用一次就好了。”并且,这5个函数就是一个整体,一个路径规划必须包含这5个过程。于是,提供者提供了一个接口,内部就是调用上面5个函数来实现。这就是facade模式。
adapter模式
为了统一接口风格,而现有的系统同样的功能确实另一个名字,这时候就可以用把现有的系统封装成一个类,这个类暴露出统一的接口风格,而这个接口的内部实现只是简单的调用原来那个功能。其实就是把现有的函数名,使用用用户希望的函数名再包一层出去。举例来说,你有一个shap类,shap类有3个子类,point类,line类和square类。shap类中有个虚函数为display()。每个子类都会具体实现display()函数,这个就是多态。对子类显示功能,都可以通过父类指针调用display()函数来实现。这时候,我们需要添加一个circle类,很显然的想法,circle类也从shap中继承,这样通过父类指针调用display()也就可以实现显示功能,和其他3个子类的使用方法一样。但是问题出来了,隔壁有人已经实现了circle类类似的功能,秉着复用的精神,我们最好直接拿过来用。但是,他们的circle类有另一个名字,叫xxcircle类,它的显示函数不叫display(),叫xxdisplay()。状况变成,要使用已经实现的xxcircle类,必然无法统一使用父类指针操作,如果修改xxcircle类,对方不见得同意,并且修改总会带来bug。这时候adapter模式出现了。你还是定义自己的circle类,继承于shape类,接口函数名也是display()。这是circle类中包含一个xxcircle类的对象,而display()内部函数通过调用xxcircle类对象的xxdisplay()方法来实现。
总结
上面2种模式有其相同之处,就是对现有系统的内容不做修改,而是把对外的接口重新定义了下。区别在于facade中新定义的接口通过调用现有系统多个函数来实现,它们是1对多的关系;而adapter中新定义的接口和内部原来的接口为1对1的关系。