php设计模式小结

PHP设计模式小结

PHP设计模式是面向对象编程的一种重要组成部分,它通过复用、扩展和抽象已有的代码解决常见的编程问题,提高了代码的可维护性、可读性和可重用性。本文将逐一介绍常见的PHP设计模式,并针对每一种设计模式进行示例说明,以便读者更好地理解。

工厂模式

工厂模式是一种用于创建对象的设计模式。它通过将对象的创建逻辑封装在一个工厂类中,使得对于外部调用者来说,只需要调用工厂类的方法,无需关心对象创建的具体过程。

示例一:创建不同类型的Logger对象

// Logger interface
interface Logger {
    public function log($message);
}

// FileLogger class
class FileLogger implements Logger {
    public function log($message) {
        echo 'Log message to file: ' . $message . "\n";
    }
}

// DbLogger class
class DbLogger implements Logger {
    public function log($message) {
        echo 'Log message to database: ' . $message . "\n";
    }
}

// LoggerFactory class
class LoggerFactory {
    public static function getLogger($type) {
        if ($type == 'file') {
            return new FileLogger();
        } else if ($type == 'db') {
            return new DbLogger();
        } else {
            throw new Exception('Invalid logger type');
        }
    }
}

// Usage
$logger1 = LoggerFactory::getLogger('file');
$logger1->log('Hello');

$logger2 = LoggerFactory::getLogger('db');
$logger2->log('World');

示例二:创建不同类型的Pizza对象

// Pizza abstract class
abstract class Pizza {
    public abstract function prepare();
    public abstract function bake();
    public abstract function cut();
    public abstract function box();
}

// CheesePizza class
class CheesePizza extends Pizza {
    public function prepare() {
        echo 'Preparing Cheese Pizza...' . "\n";
    }
    public function bake() {
        echo 'Baking Cheese Pizza...' . "\n";
    }
    public function cut() {
        echo 'Cutting Cheese Pizza...' . "\n";
    }
    public function box() {
        echo 'Boxing Cheese Pizza...' . "\n";
    }
}

// ClamPizza class
class ClamPizza extends Pizza {
    public function prepare() {
        echo 'Preparing Clam Pizza...' . "\n";
    }
    public function bake() {
        echo 'Baking Clam Pizza...' . "\n";
    }
    public function cut() {
        echo 'Cutting Clam Pizza...' . "\n";
    }
    public function box() {
        echo 'Boxing Clam Pizza...' . "\n";
    }
}

// PizzaFactory class
class PizzaFactory {
    public static function createPizza($type) {
        if ($type == 'cheese') {
            return new CheesePizza();
        } else if ($type == 'clam') {
            return new ClamPizza();
        } else {
            throw new Exception('Invalid pizza type');
        }
    }
}

// Usage
$pizza1 = PizzaFactory::createPizza('cheese');
$pizza1->prepare();
$pizza1->bake();
$pizza1->cut();
$pizza1->box();

$pizza2 = PizzaFactory::createPizza('clam');
$pizza2->prepare();
$pizza2->bake();
$pizza2->cut();
$pizza2->box();

单例模式

单例模式是一种保证系统中只有一个实例对象的设计模式。它通过将构造函数私有化,并提供一个静态方法来获取实例对象,保证全局范围内只有一个实例对象存在。

示例:创建唯一的配置对象

// Config class
class Config {
    private static $instance = null;
    private $config = [];
    private function __construct() {
        $this->config = [
            'db_host' => 'localhost',
            'db_port' => '3306',
            'db_user' => 'root',
            'db_pass' => '123456',
            'db_name' => 'mydb',
        ];
    }
    public static function getInstance() {
        if (self::$instance == null) {
            self::$instance = new Config();
        }
        return self::$instance;
    }
    public function get($key) {
        return isset($this->config[$key]) ? $this->config[$key] : null;
    }
}

// Usage
$config1 = Config::getInstance();
echo $config1->get('db_host') . "\n";

$config2 = Config::getInstance();
echo $config2->get('db_port') . "\n";

观察者模式

观察者模式是一种实现对象间“一对多”依赖关系的设计模式。它通过定义主题和观察者两个接口,使得主题在发生状态改变时通知所有注册的观察者对象,从而实现对象间的动态交互。

示例:实现股票行情更新的观察者模式

// Subject interface
interface Subject {
    public function registerObserver($observer);
    public function removeObserver($observer);
    public function notifyObservers($data);
}

// Observer interface
interface Observer {
    public function update($data);
}

// StockMarket class
class StockMarket implements Subject {
    private $observers = [];
    public function registerObserver($observer) {
        $this->observers[] = $observer;
    }
    public function removeObserver($observer) {
        $key = array_search($observer, $this->observers);
        if ($key !== false) {
            unset($this->observers[$key]);
        }
    }
    public function notifyObservers($data) {
        foreach ($this->observers as $observer) {
            $observer->update($data);
        }
    }
    public function updateStockPrice($symbol, $price) {
        $data = [
            'symbol' => $symbol,
            'price' => $price
        ];
        $this->notifyObservers($data);
    }
}

// StockMonitor class
class StockMonitor implements Observer {
    private $name = '';
    public function __construct($name) {
        $this->name = $name;
    }
    public function update($data) {
        echo $this->name . ': Stock price update - Symbol: ' . $data['symbol'] . ', Price: ' . $data['price'] . "\n";
    }
}

// Usage
$market = new StockMarket();
$google = new StockMonitor('Google');
$apple = new StockMonitor('Apple');

$market->registerObserver($google);
$market->registerObserver($apple);

$market->updateStockPrice('GOOG', 1342.48);
$market->updateStockPrice('AAPL', 309.63);

$market->removeObserver($google);

$market->updateStockPrice('AAPL', 311.34);

迭代器模式

迭代器模式是一种访问集合对象元素的设计模式。它通过定义迭代器接口和集合接口,将集合对象的内部结构和外部访问分离,从而实现对集合对象的遍历访问。

示例:实现数组访问的迭代器模式

// Iterator interface
interface Iterator {
    public function hasNext();
    public function next();
}

// Collection interface
interface Collection {
    public function add($item);
    public function remove($item);
    public function getIterator();
}

// ArrayIterator class
class ArrayIterator implements Iterator {
    private $arr = [];
    private $index = 0;
    public function __construct($arr) {
        $this->arr = $arr;
    }
    public function hasNext() {
        return $this->index < count($this->arr);
    }
    public function next() {
        return $this->arr[$this->index++];
    }
}

// ArrayCollection class
class ArrayCollection implements Collection {
    private $items = [];
    public function add($item) {
        $this->items[] = $item;
    }
    public function remove($item) {
        $key = array_search($item, $this->items);
        if ($key !== false) {
            unset($this->items[$key]);
        }
    }
    public function getIterator() {
        return new ArrayIterator($this->items);
    }
}

// Usage
$collection = new ArrayCollection();
$collection->add(1);
$collection->add(2);
$collection->add(3);

$iterator = $collection->getIterator();
while ($iterator->hasNext()) {
    echo $iterator->next() . "\n";
}

策略模式

策略模式是一种将算法封装起来,使得它们可以相互替换而不影响客户端的设计模式。它通过定义策略接口和策略实现类,以及上下文类来组合策略和客户端使用策略的能力。

示例:实现不同加密方式的策略模式

// EncryptionStrategy interface
interface EncryptionStrategy {
    public function encrypt($text);
}

// SimpleEncryption class
class SimpleEncryption implements EncryptionStrategy {
    public function encrypt($text) {
        return strrev($text);
    }
}

// SHA256Encryption class
class SHA256Encryption implements EncryptionStrategy {
    public function encrypt($text) {
        return hash('sha256', $text);
    }
}

// EncryptionContext class
class EncryptionContext {
    private $strategy = null;
    public function __construct(EncryptionStrategy $strategy) {
        $this->strategy = $strategy;
    }
    public function setStrategy(EncryptionStrategy $strategy) {
        $this->strategy = $strategy;
    }
    public function encrypt($text) {
        return $this->strategy->encrypt($text);
    }
}

// Usage
$context1 = new EncryptionContext(new SimpleEncryption());
echo $context1->encrypt('hello') . "\n";

$context2 = new EncryptionContext(new SHA256Encryption());
echo $context2->encrypt('world') . "\n";

以上就是本文对于常见的PHP设计模式的详细介绍和示例解析。其它常见的设计模式如模板方法、装饰器、代理等也可参考相关文献学习。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php设计模式小结 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • powershell-在批处理脚本中使用echo命令

    当你在编写批处理脚本时,你可能需要在脚本中输出一些文本信息。在 PowerShell 中,你可以使用 echo 命令来输出文本信息。本攻略将细讲解如何在批处理脚本使用 echo 命令,并提供两个示例说明。 在批处理脚本中使用 echo 命令 在 PowerShell 中,你可以使用 echo 命令来输出文本信息。echo 命令的语法如下: echo [字符串…

    other 2023年5月8日
    00
  • go语言学习之包和变量详解

    Go语言学习之包和变量详解 1. 包(Package) 在Go语言中,包是组织代码的基本单位。一个包可以包含多个Go源文件,这些文件可以是函数、变量、常量和类型的集合。通过使用包,我们可以将代码模块化,提高代码的可读性和可维护性。 1.1 包的声明 在每个Go源文件的开头,我们需要声明所属的包。包的声明使用package关键字,后面跟着包的名称。例如,下面是…

    other 2023年7月29日
    00
  • vim进入粘贴模式

    Vim进入粘贴模式的完整攻略 Vim是一种常用的文本编辑器,可以在Linux、Unix和Mac OS X等操作系统中使用。在Vim中,有时需要进入粘贴模式,以便更好地处理复制和粘贴的文本。本文将介绍如何进入Vim的粘贴模式,并提供两个示例说明。 进入粘贴模式 在Vim中,可以使用以下命令进入粘贴模式: :set paste 这个命令将Vim设置为粘贴模式,以…

    other 2023年5月9日
    00
  • filezilla如何配置,filezilla服务器配置的方法图文教程

    下面我就为您详细讲解“filezilla如何配置,filezilla服务器配置的方法图文教程”。 filezilla如何配置 下载安装 首先,您需要从filezilla官方网站上下载并安装filezilla客户端软件。 连接 在软件界面中,点击“文件”-“站点管理器”,在弹出的对话框中点击“新建站点”按钮,填写服务器地址、用户名、密码等信息,点击“连接”按钮…

    other 2023年6月25日
    00
  • wpf设置控件大小和位置

    以下是关于“WPF设置控件大小和位置”的完整攻略,包括如何设置控件的大小和位置,以及两个示例说明。 设置控件大小和位置 在WPF中,可以使用控件的Width、Height、Margin、HorizontalAlignment和VerticalAlignment属性来设置控件的大小和位置。 Width和Height属性 Width和Height属性用于设置控件…

    other 2023年5月7日
    00
  • python跨文件使用全局变量的实现

    Python跨文件使用全局变量的实现攻略 在Python中,要在多个文件中共享全局变量,可以使用以下方法: 方法一:使用模块 创建一个包含全局变量的模块,例如globals.py。 # globals.py global_var = 10 在其他文件中导入该模块,并使用全局变量。 # main.py import globals print(globals.…

    other 2023年7月28日
    00
  • python版本单链表实现代码

    让我来详细讲解一下“python版本单链表实现代码”的完整攻略。 1. 单链表介绍 单链表是一种数据结构,它由多个节点构成,每个节点包含数据和指向下一个节点的指针。单链表的特点是插入和删除的时间复杂度为O(1),但访问的时间复杂度为O(n)。具体实现时,我们需要定义一个链表节点类Node和链表类LinkedList来表示单链表。 2. 链表节点类Node 链…

    other 2023年6月27日
    00
  • js数组的基本用法及数组根据下标(数值或字符)移除元素

    基本用法 JavaScript中的数组(Array)是用来存储一组数据的变量,它可以存储任意类型的数据,包括字符串、数字、对象等等。下面是JavaScript数组的一些基本用法。 创建数组 可以通过以下方式创建数组: // 创建空数组 var arr1 = []; // 直接创建有元素的数组 var arr2 = [1, 2, 3, ‘hello’, nul…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部