设计模式之适配器模式 浏览次数:143 日期:2020-07-22 13:17:29 适配器模式,顾名思义,就是把原本不兼容的接口,通过适配,使之兼容。无需修改原有代码,只需要添加适配器类去适配接口即可。 举例来说,比如现在有个消息类、有个发送邮件的类,消息类跟邮件类有不同的方法,现在想实现像发送邮件一样的方式发送消息,那怎么办,就有了适配器模式,通过适配邮件实现的方法,来发送短信。 ### 分类 适配器模式一般分为三类: - 类适配器模式 - 对象适配器模式 - 接口适配器模式 ### 具体实现 - 类适配器模式 一句话就是用一个类去适配其它类或者接口,如下代码: ```php sendText或者obj->sendAttachment即可发送短信,注意Sms类只有send方法,适配器模式代码如下: ```php class SmsAdapter extends Sms implements Message { public function sendText() { $this->send(); } public function sendAttachment() { } } ``` 就这么简单,这就是一个实现了类适配器模式的代码,需要注意的是继承Sms类并且实现了Message接口,测试代码如下: ```php $adapter = new SmsAdapter(); $adapter->sendText(); ``` - 对象适配器模式 让一个已知的对象去适配其它类或者接口 如上面的代码我们有一个Sms类的实例$sms,适配器全部代码如下 ```php sms = $sms; } public function sendText() { $this->sms->send(); } public function sendAttachment() { } } ``` 测试使用代码如下: ```php $sms = new Sms();//模拟已知的对象 $adapter = new SmsAdapter($sms); $adapter->sendText(); ``` - 接口适配器模式 接口适配器模式常用在接口有很多方法,但是需要实现的或者说业务只关心的是一部分方法,而不需要全部实现。 ```php sms = $sms; } public function sendText() { $this->sms->send(); } } $sms = new Sms();//模拟已知的对象 $adapter = new SmsAdapter($sms); $adapter->sendText(); ``` 接口适配器模式利用一个空实现了接口所有方法的适配器,然后结合对象适配器模式,在对象适配器中实现具体关心的方法。 ### 优点 - 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构。 - 增加了类的透明性和复用性,将具体的业务实现过程封装在适配者类中,对于客户端类而言是透明的,而且提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用。 - 灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”。 ### 总结 - 类适配器模式,继承源类,实现目标接口。 - 对象适配器模式,持有源类的对象,把继承关系改变为组合关系。 - 接口适配器模式,借助中间类空实现目标接口所有方法,适配器选择性重写。 最后更新时间为: 5个月前 (2020-07-22 13:17:29)