ruby设计模式--适配器模式
在硬件世界当中处处充满了适配器,比如从香港买回来的大部分手机的充电器是不能够直接在国内进行使用的,必须使用一个转换器进行转换,这个转换器就是一个适配器。在软件世界当中同样也需要适配器,当遗留系统当中的主体部分不能进行修改时,就需要把部分不能工作的对象通过适配器进行转换予以替代,从而使得现有系统能够正常的工作。适配器模式就是这样一个目的,通过转换对象接口,填补系统空隙。
?
class Device attr_accessor :name def initialize name @name = name end def electricize plug plug.work end endclass Plug def work p "native plug works" end enddevice = Device.new("device")plug = Plug.newdevice.electricize plug
?现在有一个设备,需要进行充电,每次充电都会传入一个插头对象予以工作,经过一段时间之后,发现这个插头不能够满足现有设备的正常工作了,所以需要替换插头,碰巧新设计的插头结构又跟老插头完全不一样
?
class NewPlug def start p "new plug works" end end
?问题出现了,如何使得现有插头能够满足老系统当中充电功能,对,可以使用适配器来进行一次转换。
首先声明适配器类,再将新插头聚合到适配器当中
?
class PlugAdapter < Plug attr_accessor :new_plug def initialize new_plug @new_plug = new_plug end def work @new_plug.start end end?
可以看出,适配器是继承于目标对象的,即跟目标对象具有同样的结构,所以主体对象在调用适配器处理和调用真正的老插头对象处理感觉是一样的,当调用适配器时,适配器就会进行新插头的工作,这样主体对象没有进行修改,只是通过增加适配器的方式来完成了接口的替换,系统代码清晰,可读。
?
?
device = Device.new("device")new_plug = NewPlug.newplug_adapter = PlugAdapter.new new_plugdevice.electricize plug_adapter
?
适配器模式的主要特点就是转换当前新对象的接口,用以可以适应遗留系统的架构,并且不会破坏遗留系统架构,只是采用增加代码的形式来完成,从而体现开闭原则。上述代码当中device是主体对象,plug是目标对象,newPlug是适配对象,plugAdapter是适配器对象,通过转换newPlug的接口保证了现有系统的正常工作。
?
ruby特性来实现此模式,也可以用proc对象来代替newplug。另外可以动态的改变原有插头类的代码,这是ruby一个高级特性,也就是在运行时动态的往类中增加状态或者行为,从而使得老插头类结构发生变化,可以满足新插头的使用