面向对象的洗礼:设计模式(十七)之适配器模式
适配器模式,尽管是一种常见的设计模式,但是有点亡羊补牢的感觉。不是首选的设计模式。适配器模式是连接两个类的中间件,当一个类想要调用某一个类的接口时,发现尽管这个类的接口可以实现想要的功能,但是却不能用。比如因为格式的问题等等,这时候需要一个中间件来充当转换器,这就是适配器模式。
适配器模式:适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。(本段摘自百度百科(因为想找个不是我的白话文的定义-.-))。
实际生活中,比如我们买美版、欧版的电子产品,人家很多国家时110V电压,而我们国家时220V电压,所以需要一个电源适配器,来转换电压以便能够再国内的电网环境中安全的使用。
下面的例子是一个假设,由于历史原因或者开发不规范的原因,时有些定义并不一致。比如已经离职的同事A定义了商品字符串为id|num^id|num,而另一个同事B在开发时使用的是id@num#id@num,使得第三个同事C在开发时不能直接调用A和B同事的写好的现成类的方法,需要写一个类做为中间件来转换它。使的他们兼容。开放 - 封闭原则告诉我们,不要去修改人家的类,而是以扩展的方式去改变它。因此适配器模式诞生了。以PHP为代码环境:
<?php //id|num^id|num class ColleagueA{ public static function getString(){ //读取mysql略 return '1|1^2|1'; } public static function setString($str){ echo '写进mysql:' . $str; } } //id@num#id@num class ColleagueB{ public static function getString(){ //读取mysql略 return '1@1#2@1'; } public static function setString($str){ echo '写进mysql:' . $str; } } //适配器 class Adaptation{ public static function changeAToB($str){ $data = array(); $arr = explode('^', $str); foreach($arr as $a){ $data[] = explode('|', $a); } $arr = $data; $data = ''; foreach($arr as $a){ $data[] = implode('@', $a); } return implode('#', $data); } public static function changeBToA($str){ $data = array(); $arr = explode('#', $str); foreach($arr as $a){ $data[] = explode('@', $a); } $arr = $data; $data = ''; foreach($arr as $a){ $data[] = implode('|', $a); } return implode('^', $data); } } //客户端/接口 $stringFromA = ColleagueA::getString(); $stringFromAdaptation = Adaptation::changeAToB($stringFromA); ColleagueB::setString($stringFromAdaptation); echo '<br>'; $stringFromB = ColleagueB::getString(); $stringFromAdaptation = Adaptation::changeBToA($stringFromB); ColleagueA::setString($stringFromAdaptation);
Ps:严格执行开发规范,开发前该抽象的抽象,该封装的封装,比到最后没办法了用这个适配器模式强的多。
适配器模式,一种亡羊补牢的模式,食之无味,弃之可惜。