php适配器模式

php模式设计之 适配器模式
在这个有没有对象都要高呼“面向对象”的年代,掌握面向对象会给我们带来意想不到的方便。学编程的小伙伴从开始能写几行代码实现简单功能到后来懂得将一些重复的操作组合起来形成一个“函数”,再到后来将“函数”和属性组合起来形成一个“类”。一步步走来,我们在考虑着机器运行代码效率的提高的同时也在考虑减轻程序员的工作量。 那么我们今天讲到的 适配器模型更着重考虑的是什么呢?是程序员工作量。
什么是适配器模式呢?
适配器模式将一个接口转换成客户端需要的另一个接口,使原本不兼容的接口能一起工作。举个栗子:一家玩具工厂,它可能同时成产小猫、小狗等多种玩具,但是都要求玩具会说话,那我们怎么实现呢?见如下代码:
<?php
# 首先定义一个抽象的接口,其中我们添加一个公共的say方法
interface Toys
{
	public function say();
}
# 具体的类Dog
class Dog implements Toys
{
	public function say(){
		echo '主人你好,我是一只小狗狗';
	}
}
# 具体的类Cat
class Cat implements Toys
{
	public function say(){
		echo '主人你好,我是一只小喵喵';
	}
}

class client
{
	public static function run(){
		# 实例化一只狗玩具  
		$adaptee_dog = new Dog();
		$adaptee_dog->say();
		echo '<br />';
		# 实例化一只猫玩具  
		$adaptee_cat = new Cat();
		$adaptee_cat->say();
	}
}

client::run();
?>

这基本一个简单的示例就实现了现有业务的需求,那么问题来了,随着业务的发展,现在公司要求:当我去敲打玩具的时候,玩具也会说话,这时候我们的第一个想法是那就加一个click方法不就解决了吗?

实现代码:

# 首先定义一个抽象的接口,其中我们添加一个公共的say方法
interface Toys
{
	public function say();
	public function click();
}
# 具体的类Dog
class Dog implements Toys
{
	public function say(){
		echo '主人你好,我是一只小狗狗';
	}
	public function click(){
		echo '主人你好,我是一只小狗狗';
	}
}
# 具体的类Cat
class Cat implements Toys
{
	public function say(){
		echo '主人你好,我是一只小喵喵';
	}
	public function click(){
		echo '主人你好,我是一只小喵喵';
	}
}

class client
{
	public static function run(){
		# 实例化一只狗玩具  
		$adaptee_dog = new Dog();
		$adaptee_dog->say();
		$adaptee_dog->click();
		echo '<br />';
		# 实例化一只猫玩具  
		$adaptee_cat = new Cat();
		$adaptee_cat->say();
		$adaptee_cat->click();
	}
}

client::run();
?>
这样写我们就可以发现一个问题,如果玩具有几十种,几百种怎么办?每个具体类都加一遍?那如果以后会提出揪耳朵会说话怎么办?再挨个加个方法?很明显,不应该是这样的,这样也不符合编程的开-闭原则,前辈们就想到了一个方法,那就是适配器,我 个人理解啊:所谓的适配器就是做一个中间人的角色,你两个不是对不上话吗,那好,我在中间给你转一下,让你两个都明白不就完事了吗?
实现代码:
<?php
# 首先定义一个抽象的接口,其中我们添加一个公共的say方法
interface Toys
{
	public function say();
}
# 具体的类Dog
class Dog implements Toys
{
	public function say(){
		echo '主人你好,我是一只小狗狗';
	}
}
# 具体的类Cat
class Cat implements Toys
{
	public function say(){
		echo '主人你好,我是一只小喵喵';
	}
}

# 适配器内容部分
interface ClickToys
{
	public function click();
	public function say();
}

class ClickMethods implements ClickToys
{
         private $adaptee;  
  
        function __construct($newobject)  
        {  
            $this->adaptee = $newobject;  
        }
	public function click(){
		$this->adaptee->say();
	}
	public function say(){
		$this->adaptee->say();
	}
}


class client
{
	public static function run(){
		# 实例化一只狗玩具  
		$adaptee_dog = new Dog();
		$adapyee_click = new ClickMethods($adaptee_dog);
		$adapyee_click->click();
		$adapyee_click->say();
		echo '<br />';
		# 实例化一只猫玩具  同上
	}
}

client::run();
?>
在我们添加了适配器之后,在原代码不做任何修改的情况下,就实现了现有的业务需求,同时也做到了降低耦合的目的。这是个人理解的代码实现逻辑。
适配器模式核心思想
把对某些相似的类的操作转化为一个统一的“接口”(这里是比喻的说话)--适配器,或者比喻为一个“界面”,统一或屏蔽了那些类的细节。适配器模式还构造了一种“机制”,使“适配”的类可以很容易的增减,而不用修改与适配器交互的代码, 符合“减少代码间耦合”的设计原则

更多设计模式文章请点击下面链接:
【设计模式概述】 http://blog.csdn.net/bk_guo/article/details/73828064
【简单工厂模式】 http://blog.csdn.net/bk_guo/article/details/73849317
【单例模式】 http://blog.csdn.net/bk_guo/article/details/73845244
【工厂方法模式】 http://blog.csdn.net/bk_guo/article/details/73896262

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值