php面向对象开发之——装饰模式

黄舟
Lepaskan: 2023-03-04 12:38:02
asal
1452 orang telah melayarinya

在网上买过手机的朋友都知道,商家通常会为手机搭配好几个套餐,让客户自由选择,现在有一家卖手机的店,为所有手机推出了三种套餐,标准套餐为4999元,裸机为标准套餐减200元,全套配置为标准套餐加100元,我们用php将之实现。

<?php
abstract class mobile{
	abstract public function getInfo();
	abstract public function getPrice();
}

class iphone extends mobile{

	private $price=4999;
	private $info=&#39;官方标配(手机+电源+数据线+耳机)&#39;;
	
	public function getInfo(){
		return $this->info;
	}
	
	public function getPrice(){
		return $this->price;
	}

}

class bareIphone extends iphone{
	
	private $info=&#39;裸机(手机)&#39;;
	
	public function getInfo(){
		return $this->info;
	}
	public function getPrice(){
		return parent::getPrice()-200;
	}

}

class fullSetIphone extends iphone{
	
	private $info=&#39;套装(手机+电源+数据线+耳机+手机壳+贴膜+移动电源)&#39;;
	
	public function getInfo(){
		return $this->info;
	}
	public function getPrice(){
		return parent::getPrice()+100;
	}
	
}

class lumia920 extends mobile{

	private $price=4399;
	private $info=&#39;官方标配(手机+电源+数据线+耳机)&#39;;
	
	public function getInfo(){
		return $this->info;
	}
	
	public function getPrice(){
		return $this->price;
	}

}

class bareLumia920 extends lumia920{
	
	private $info=&#39;裸机(手机)&#39;;
	
	public function getInfo(){
		return $this->info;
	}
	public function getPrice(){
		return parent::getPrice()-200;
	}

}

class fullSetLumia920 extends lumia920{
	
	private $info=&#39;套装(手机+电源+数据线+耳机+手机壳+贴膜+移动电源)&#39;;
	
	public function getInfo(){
		return $this->info;
	}
	public function getPrice(){
		return parent::getPrice()+100;
	}
	
}

$iphone=new fullSetIphone();
echo &#39;iphone全套配置价格为:&#39;.$iphone->getPrice().&#39;,配置为:&#39;.$iphone->getInfo();
echo &#39;<br>&#39;;
$lumia920=new bareLumia920();
echo &#39;lumia920全套配置价格为:&#39;.$lumia920->getPrice().&#39;,配置为:&#39;.$lumia920->getInfo();
?>
Salin selepas log masuk

我们为iphone和lumia920分别设置了三种套餐,但观察一下可以发现,iphone和lumia920的bare方法和fullSet方法完全一样的,这造成了一种耦合,我们完全可以将bare方法和fullSet方法分离出来,这就需要装饰模式,代码如下:

<?php
abstract class mobile{
	abstract public function getInfo();
	abstract public function getPrice();
}

class iphone extends mobile{

	private $price=4999;
	private $info=&#39;官方标配(手机+电源+数据线+耳机)&#39;;
	
	public function getInfo(){
		return $this->info;
	}
	
	public function getPrice(){
		return $this->price;
	}

}

class lumia920 extends mobile{

	private $price=4399;
	private $info=&#39;官方标配(手机+电源+数据线+耳机)&#39;;
	
	public function getInfo(){
		return $this->info;
	}
	
	public function getPrice(){
		return $this->price;
	}

}

//装饰类
abstract class decorateIphone extends mobile{

	protected $iphone;
	
	public function __construct(mobile $iphone){
		$this->iphone=$iphone;
	} 

}

class bare extends decorateIphone{
	
	private $info=&#39;裸机(手机)&#39;;
	
	public function getInfo(){
		return $this->info;
	}
	public function getPrice(){
		return $this->iphone->getPrice()-200;
	}

}

class fullSet extends decorateIphone{
	
	private $info=&#39;套装(手机+电源+数据线+耳机+手机壳+贴膜+移动电源)&#39;;
	
	public function getInfo(){
		return $this->info;
	}
	public function getPrice(){
		return $this->iphone->getPrice()+100;
	}
	
}

$iphone=new fullSet(new iphone());
echo &#39;iphone全套配置价格为:&#39;.$iphone->getPrice().&#39;,配置为:&#39;.$iphone->getInfo();
echo &#39;<br>&#39;;
$lumia920=new bare(new lumia920());
echo &#39;lumia920裸机价格为:&#39;.$lumia920->getPrice().&#39;,配置为:&#39;.$lumia920->getInfo();
?>
Salin selepas log masuk

 以上就是php面向对象开发之——装饰模式的内容,更多相关内容请关注PHP中文网(www.php.cn)!


sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!