php设计模式小结

yizhihongxing

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日

相关文章

  • 关于linux服务器hosts文件配置详解

    下面我将详细讲解关于Linux服务器hosts文件配置的完整攻略。 什么是hosts文件 hosts文件是一个简单的文本文件,它被用来将IP地址和域名进行简单的映射。在Linux系统中hosts文件位于/etc/hosts路径下,它可以被用来配置DNS解析对于一些本地站点的自定义。 hosts文件的格式 在hosts文件中,每行表示一条IP地址和域名的映射关…

    other 2023年6月25日
    00
  • 电脑自动重启怎么办 电脑频繁重启的解决方法

    电脑自动重启怎么办:电脑频繁重启的解决方法 电脑频繁自动重启是一种比较常见的问题,会给我们的工作和学习带来影响。然而,它通常并不是一个严重的问题,并且大多数情况下都可以通过以下方法轻松解决。 前期准备 在开始解决电脑自动重启的问题之前,您需要进行以下准备: 备份重要文件,以防意外数据丢失。 关闭自动重启:打开“控制面板” -> “系统和安全” -&gt…

    other 2023年6月26日
    00
  • webpack 4 简单介绍

    Webpack 4 简单介绍 Webpack是一个现代化的JavaScript应用程序的静态模块打包器。它将多个模块打包成一个或多个bundle,以便在浏览器中加载。Webpack 4是Webpack的最新版本,它提供了更好的性能和更好的开发体验。本文将简单介绍Webpack 4的基本概念、使用方法和示例说明。 Webpack 4的基本概念 Webpack …

    other 2023年5月5日
    00
  • 服务器建立超级隐藏账号方法

    首先,需要指出的是,“服务器建立超级隐藏账号方法”的做法涉及到服务器的安全性和管理员访问权限等问题,因此需要谨慎使用。以下是建立超级隐藏账号的方法攻略: 1. 创建新用户 在Linux系统中,可以使用以下命令创建新的用户: sudo adduser new_username 其中,“new_username”为新用户的用户名,执行命令后,会提示输入新用户的密…

    other 2023年6月27日
    00
  • 详解C语言之单链表

    详解C语言之单链表 什么是单链表 单链表是一种数据结构,将数据存储在一系列的节点(Node)中。每个节点包含两部分:数据(Datum)和指向下一个节点的指针(Pointer)。节点之间通过指针连接起来,形成链表。单链表只能从头节点一直访问到尾节点,不能随机访问。 单链表的操作 单链表的常见操作有以下几个: 链表的创建 创建一个链表需要两个步骤:先创建头节点,…

    other 2023年6月27日
    00
  • 在Linux中使用命令行计算器GNU bc的方法

    当需要在Linux终端中进行计算时,可以通过命令行计算器GNU bc来快速进行数学运算。下面是使用命令行计算器GNU bc的方法: 安装GNU bc 在大多数Linux发行版中,GNU bc可能已经预装了,可以使用以下命令进行检查: bc –version 如果GNU bc没有安装,则可以使用以下命令进行安装: 在Debian/Ubuntu中: sudo …

    other 2023年6月26日
    00
  • 朋友网手机客户端下载页面的设计分享(图文)

    来一步一步讲解一下“朋友网手机客户端下载页面的设计分享(图文)”的完整攻略。 1. 确定页面设计的方向和主题 在设计“朋友网手机客户端下载页面”时,需要确定手机客户端的主题和方向,包括页面风格、配色方案、字体、布局等。具体的方向可以通过市场调研和竞品研究来确定,设计时要考虑用户群的需求和关注点,以及如何通过设计来突出产品的优势和特点。 2. 设计页面结构和布…

    other 2023年6月25日
    00
  • Win10电脑如何更改鼠标右键菜单选项?

    当我们在使用Win10电脑时,经常需要使用到右键菜单选项。但是,有时候默认的右键菜单选项可能并不能满足我们的需求。因此,本文将详细讲解Win10电脑如何更改鼠标右键菜单选项的完整攻略。 一、打开注册表 首先,我们需要打开注册表,以便我们可以修改右键菜单选项。具体操作步骤如下: 按下Win+R键,调出运行对话框。 输入“regedit”,点击“确定”按钮。 在…

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