这里是对“php设计模式介绍之编程惯用法第1/3页”的完整攻略。
该文章主要是对编程中的一些惯用法进行系统的整理和归纳。这些惯用法包括OOP中常用的设计模式、一些小技巧和最佳实践等。通过学习这些惯用法,可以帮助我们更好地编写代码,提高代码的可读性和可维护性。
2.1 设计模式的概念
设计模式是指在特定情境下,经过深思熟虑的一种解决问题的方案。它描述了一个在特定环境下,用于解决某些问题的可复用的解决方案。设计模式可分为三种类型:创建型、结构型和行为型。
2.2 创建型模式
创建型模式关注对象的实例化,提供了一种创建对象的最佳方式。常见的创建型模式包括:工厂方法模式、抽象工厂模式、单例模式、建造者模式和原型模式等。
2.3 结构型模式
结构型模式关注对象的组合,如何将对象和类组合成更大的结构。常见的结构型模式包括:适配器模式、代理模式、装饰模式、桥接模式、外观模式、享元模式和组合模式等。
2.4 行为型模式
行为型模式关注对象间的通信,如何协调对象间的活动。常见的行为型模式包括:命令模式、观察者模式、中介者模式、迭代器模式、解释器模式、访问者模式、责任链模式和备忘录模式等。
下面是两个常见的设计模式示例。
3.1 工厂模式
工厂模式是创建型模式中的一种,在工厂模式中,我们通过调用一个工厂方法来创建对象,避免了直接在客户端代码中进行对象的实例化。
示例代码:
interface Shape
{
public function draw();
}
class Rectangle implements Shape
{
public function draw()
{
echo "Rectangle::draw() method.\n";
}
}
class Square implements Shape
{
public function draw()
{
echo "Square::draw() method.\n";
}
}
class ShapeFactory
{
public static function getShape($shapeType)
{
if ($shapeType == 'Rectangle') {
return new Rectangle();
} elseif ($shapeType == 'Square') {
return new Square();
} else {
return null;
}
}
}
// 使用工厂方法创建对象
$rectangle = ShapeFactory::getShape('Rectangle');
$rectangle->draw();
3.2 观察者模式
观察者模式是行为型模式中的一种,它定义对象之间的一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都得到通知并自动更新自己。
示例代码:
interface Observer
{
public function update($temperature, $humidity, $pressure);
}
interface Subject
{
public function registerObserver(Observer $o);
public function removeObserver(Observer $o);
public function notifyObservers();
}
class WeatherData implements Subject
{
private $observers;
private $temperature;
private $humidity;
private $pressure;
public function __construct()
{
$this->observers = array();
}
public function registerObserver(Observer $o)
{
array_push($this->observers, $o);
}
public function removeObserver(Observer $o)
{
$key = array_search($o, $this->observers, true);
if ($key !== false) {
unset($this->observers[$key]);
}
}
public function notifyObservers()
{
foreach ($this->observers as $observer) {
$observer->update($this->temperature, $this->humidity, $this->pressure);
}
}
public function measurementsChanged()
{
$this->notifyObservers();
}
public function setMeasurements($temperature, $humidity, $pressure)
{
$this->temperature = $temperature;
$this->humidity = $humidity;
$this->pressure = $pressure;
$this->measurementsChanged();
}
}
class CurrentConditionsDisplay implements Observer
{
private $temperature;
private $humidity;
public function update($temperature, $humidity, $pressure)
{
$this->temperature = $temperature;
$this->humidity = $humidity;
$this->display();
}
public function display()
{
echo "Current conditions: " . $this->temperature . "F degrees and " . $this->humidity . "% humidity\n";
}
}
// 创建天气数据对象
$weatherData = new WeatherData();
// 创建当前条件展示对象,并注册到天气数据对象中
$currentDisplay = new CurrentConditionsDisplay();
$weatherData->registerObserver($currentDisplay);
// 模拟气象数据的改变
$weatherData->setMeasurements(80, 65, 30.4);