thinkphp6.0常用设计模式实例

单例模式 (Singleton)

场景:确保一个类只有一个实例,并提供一个全局访问点。
实际业务:数据库连接、日志记录器、配置管理等。

ThinkPHP 6.0 实现:

namespace app\common;class DatabaseConnection
{private static $instance = null;private function __construct() {}public static function getInstance(){if (self::$instance === null) {self::$instance = new self();}return self::$instance;}public function connect(){// 连接数据库return "Database connected!";}
}// 使用
$db = DatabaseConnection::getInstance();
echo $db->connect();
namespace app\lib;class Database
{private static $instance = null;private function __construct(){// 私有化构造函数,防止外部实例化}public static function getInstance(){if (self::$instance === null) {self::$instance = new self();}return self::$instance;}public function query($sql){// 执行数据库查询return "Executing: $sql";}
}// 使用
$db = Database::getInstance();
echo $db->query("SELECT * FROM users");

工厂模式 (Factory)

场景:根据不同的条件创建不同的对象。
实际业务:支付方式选择、日志记录器创建等。

namespace app\lib;class PaymentFactory
{public static function create($type){switch ($type) {case 'wechat':return new WechatPayment();case 'alipay':return new AlipayPayment();default:throw new \Exception("Unsupported payment type");}}
}class WechatPayment
{public function pay(){return "Paying with WeChat";}
}class AlipayPayment
{public function pay(){return "Paying with Alipay";}
}// 使用
$payment = PaymentFactory::create('wechat');
echo $payment->pay();

观察者模式 (Observer)

场景:当一个对象的状态发生变化时,通知依赖它的所有对象。
实际业务:订单状态变更通知、用户注册后发送邮件等。

示例代码:

namespace app\lib;class Order
{private $observers = [];public function attach($observer){$this->observers[] = $observer;}public function notify(){foreach ($this->observers as $observer) {$observer->update($this);}}public function complete(){echo "Order completed!\n";$this->notify();}
}class EmailNotifier
{public function update($order){echo "Sending email notification...\n";}
}// 使用
$order = new Order();
$order->attach(new EmailNotifier());
$order->complete();

策略模式 (Strategy)

场景:定义一系列算法,使它们可以互相替换。
实际业务:支付方式选择、折扣计算等。

示例代码:

namespace app\lib;interface DiscountStrategy
{public function calculate($price);
}class NoDiscount implements DiscountStrategy
{public function calculate($price){return $price;}
}class HalfDiscount implements DiscountStrategy
{public function calculate($price){return $price * 0.5;}
}class Order
{private $discountStrategy;public function setDiscountStrategy(DiscountStrategy $strategy){$this->discountStrategy = $strategy;}public function calculatePrice($price){return $this->discountStrategy->calculate($price);}
}// 使用
$order = new Order();
$order->setDiscountStrategy(new HalfDiscount());
echo $order->calculatePrice(100); // 输出: 50

命令模式 (Command)

场景:将请求封装为对象,使请求的发送者和接收者解耦。
实际业务:任务队列、撤销操作等。

示例代码:

namespace app\lib;interface Command
{public function execute();
}class LightOnCommand implements Command
{private $light;public function __construct($light){$this->light = $light;}public function execute(){$this->light->on();}
}class Light
{public function on(){echo "Light is on\n";}
}// 使用
$light = new Light();
$command = new LightOnCommand($light);
$command->execute();

适配器模式 (Adapter)

场景:将一个类的接口转换成客户端期望的另一个接口。
实际业务:兼容不同第三方库、接口转换等。

示例代码:

namespace app\lib;class OldLibrary
{public function specificRequest(){return "Old library response";}
}interface NewLibraryInterface
{public function request();
}class Adapter implements NewLibraryInterface
{private $oldLibrary;public function __construct(OldLibrary $oldLibrary){$this->oldLibrary = $oldLibrary;}public function request(){return $this->oldLibrary->specificRequest();}
}// 使用
$oldLibrary = new OldLibrary();
$adapter = new Adapter($oldLibrary);
echo $adapter->request();

装饰者模式 (Decorator)

场景:动态地为对象添加功能。
实际业务:日志记录、权限校验等。

示例代码:

namespace app\lib;interface Component
{public function operation();
}class ConcreteComponent implements Component
{public function operation(){return "ConcreteComponent";}
}class Decorator implements Component
{protected $component;public function __construct(Component $component){$this->component = $component;}public function operation(){return $this->component->operation();}
}class LogDecorator extends Decorator
{public function operation(){echo "Logging before operation\n";$result = parent::operation();echo "Logging after operation\n";return $result;}
}// 使用
$component = new ConcreteComponent();
$decorator = new LogDecorator($component);
echo $decorator->operation();

责任链模式 (Chain of Responsibility)

场景:将请求的发送者和接收者解耦,使多个对象都有机会处理请求。
实际业务:权限校验、日志记录等。

示例代码:

namespace app\lib;abstract class Handler
{protected $nextHandler;public function setNext(Handler $handler){$this->nextHandler = $handler;}public function handle($request){if ($this->nextHandler !== null) {return $this->nextHandler->handle($request);}return null;}
}class AuthHandler extends Handler
{public function handle($request){if ($request === 'auth') {return "AuthHandler: Handling request\n";}return parent::handle($request);}
}class LogHandler extends Handler
{public function handle($request){if ($request === 'log') {return "LogHandler: Handling request\n";}return parent::handle($request);}
}// 使用
$authHandler = new AuthHandler();
$logHandler = new LogHandler();
$authHandler->setNext($logHandler);echo $authHandler->handle('log');

访问者模式 (Visitor)

场景:将算法与对象结构分离。
实际业务:报表生成、数据导出等。

示例代码:

namespace app\lib;interface Visitor
{public function visitElementA(ElementA $element);public function visitElementB(ElementB $element);
}class ConcreteVisitor implements Visitor
{public function visitElementA(ElementA $element){echo "Visiting ElementA\n";}public function visitElementB(ElementB $element){echo "Visiting ElementB\n";}
}interface Element
{public function accept(Visitor $visitor);
}class ElementA implements Element
{public function accept(Visitor $visitor){$visitor->visitElementA($this);}
}class ElementB implements Element
{public function accept(Visitor $visitor){$visitor->visitElementB($this);}
}// 使用
$visitor = new ConcreteVisitor();
$elementA = new ElementA();
$elementB = new ElementB();$elementA->accept($visitor);
$elementB->accept($visitor);

中介者模式 (Mediator)

场景:减少对象之间的直接依赖,通过中介者进行通信。
实际业务:聊天室、事件调度等。

示例代码:

namespace app\lib;class ChatRoom
{public static function showMessage($user, $message){echo "[" . $user . "] : " . $message . "\n";}
}class User
{private $name;public function __construct($name){$this->name = $name;}public function sendMessage($message){ChatRoom::showMessage($this->name, $message);}
}// 使用
$john = new User("John");
$jane = new User("Jane");$john->sendMessage("Hi Jane!");
$jane->sendMessage("Hello John!");

备忘录模式 (Memento)

场景:捕获并外部化对象的内部状态,以便以后可以恢复。
实际业务:撤销操作、游戏存档等。

示例代码:

namespace app\lib;class Editor
{private $content;public function setContent($content){$this->content = $content;}public function getContent(){return $this->content;}public function save(){return new EditorMemento($this->content);}public function restore(EditorMemento $memento){$this->content = $memento->getContent();}
}class EditorMemento
{private $content;public function __construct($content){$this->content = $content;}public function getContent(){return $this->content;}
}// 使用
$editor = new Editor();
$editor->setContent("First content");
$saved = $editor->save();$editor->setContent("Second content");
echo $editor->getContent(); // 输出: Second content$editor->restore($saved);
echo $editor->getContent(); // 输出: First content

迭代器模式 (Iterator)

场景:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部表示。
实际业务:遍历集合、分页查询等。

示例代码:

namespace app\lib;class Book
{private $title;public function __construct($title){$this->title = $title;}public function getTitle(){return $this->title;}
}class BookList implements \Iterator
{private $books = [];private $position = 0;public function addBook(Book $book){$this->books[] = $book;}public function current(){return $this->books[$this->position];}public function next(){$this->position++;}public function key(){return $this->position;}public function valid(){return isset($this->books[$this->position]);}public function rewind(){$this->position = 0;}
}// 使用
$bookList = new BookList();
$bookList->addBook(new Book("Design Patterns"));
$bookList->addBook(new Book("Clean Code"));foreach ($bookList as $book) {echo $book->getTitle() . "\n";
}

门面模式

ThinkPHP 6.0 的门面模式依赖于容器(Container)和门面类(Facade)。门面类通过 __callStatic 方法将静态调用转发到容器中的实例。

示例代码:
以下是一个自定义门面类的实现:

namespace app\facade;use think\Facade;class MyService extends Facade
{protected static function getFacadeClass(){// 返回容器中绑定的类标识return 'my_service';}
}

绑定服务到容器:
在服务提供者中,将具体的实现类绑定到容器:

namespace app\provider;use think\Service;class MyServiceProvider extends Service
{public function register(){// 绑定服务到容器$this->app->bind('my_service', \app\service\MyService::class);}
}

具体实现类:

namespace app\service;class MyService
{public function doSomething(){return "Doing something...";}
}

使用门面类:

use app\facade\MyService;echo MyService::doSomething(); // 输出: Doing something...

ThinkPHP 6.0 内置门面类

ThinkPHP 6.0 提供了许多内置的门面类,例如:

Db:数据库操作

Cache:缓存操作

Log:日志记录

Request:请求对象

Config:配置管理

示例:使用内置门面类

use think\facade\Db;
use think\facade\Cache;
use think\facade\Log;// 数据库查询
$users = Db::table('users')->select();// 缓存操作
Cache::set('name', 'ThinkPHP');
echo Cache::get('name');// 日志记录
Log::info('This is a log message.');

门面模式的优势

简化调用:通过静态方法调用,代码更加简洁。

解耦:调用者无需关心具体的实现类,降低了耦合度。

易于扩展:可以通过绑定不同的实现类来扩展功能。

统一接口:为复杂的子系统提供一个统一的接口。

门面模式的使用场景

数据库操作:通过 Db 门面类,统一调用数据库操作方法。

缓存操作:通过 Cache 门面类,统一调用缓存操作方法。

日志记录:通过 Log 门面类,统一调用日志记录方法。

配置管理:通过 Config 门面类,统一调用配置管理方法。

自定义服务:为自定义的服务提供统一的静态调用接口。

门面模式的实现原理

ThinkPHP 6.0 的门面模式依赖于容器和 Facade 基类。以下是其核心实现原理:

Facade 基类:

namespace think;abstract class Facade
{protected static $app;public static function setFacadeApplication($app){self::$app = $app;}public static function __callStatic($method, $params){$instance = self::$app->make(static::getFacadeClass());return $instance->$method(...$params);}protected static function getFacadeClass(){throw new \RuntimeException('Facade does not implement getFacadeClass method.');}
}

关键点:
__callStatic 方法:将静态调用转发到容器中的实例。

getFacadeClass 方法:返回容器中绑定的类标识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/66467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨年烟花C++代码

嘿&#xff0c;朋友们&#xff01;今天来给大家讲讲一段挺有意思的C代码呀&#xff0c;这段代码主要是用来实现一个烟花效果展示的程序哦&#xff0c;下面咱们一点点来看哈。 效果 1. 开头包含的那些头文件 #include <graphics.h> #include <conio.h> #include &…

Element-plus表单总结

表单包含输入框&#xff0c;单选框&#xff0c;下拉选择&#xff0c;多选框等用户输入的组件。输入表单&#xff0c;您可以收集、验证和提交数据。 经典表单 最基础的表单包括各种输入表单项&#xff0c;比如input、select、radio、checkbox等。 在每一个form组件中&#xff0…

[Qt] 多元素控件 | 容器类控件 | 布局管理器layout

目录 一.多元素控件 1、List Widget 【使用 ListWidget】 2、Table Widget 【使用 QTableWidget】 3、Tree Widget 【使用 QTreeWidget】 二、容器类控件 1、Group Box 【给麦当劳案例加上分组框】 2、Tab Widget 【使用标签页管理多组控件】 三、布局管理器 1、…

【竞技宝】CS2:HLTV2024职业选手排名TOP8-broky

北京时间2025年1月7日,HLTV年度选手排名正在持续公布中,今日凌晨正式公布了今年的TOP8为FAZE战队的broky。 选手简介 broky是一位来自拉脱维亚的职业CS选手,现年23岁。2018年7月,broky获得了FPL资格,连续几季在榜上前5。他的首次赛场留名是跟随拉脱维亚本土战队Wolsung出征BES…

MP4 与Fragmented MP4 (fMP4)的区别

区别 类别MP4FMP4&#xff08;Fragmented MP4&#xff09;存储结构视频文件整体存储为一个连续文件&#xff0c;moov 元数据通常在文件末尾视频分成多个片段&#xff0c;每个片段包含独立的元数据&#xff08;分片&#xff09;播放需求必须先下载 moov 元数据后才能播放可边下…

Ubuntu桌面管理环境: GDM3,KDM,LightDM

介绍 Ubuntu是一个广受欢迎的Linux操作系统&#xff0c;拥有强大而多样化的桌面管理环境。其中三个常用的桌面管理环境是GDM3&#xff0c;KDM和LightDM。本篇博客将介绍这三个桌面管理环境的特点和功能。 GDM3 (GNOME Display Manager) GDM3是默认的桌面管理环境&#xff0c…

VSCode快捷键Ctrl+/是注释;Ctrl+\是拆分编辑器;Ctrl+w是关闭编辑器

VSCode快捷键Ctrl/是注释&#xff1b;Ctrl\是拆分编辑器&#xff1b;Ctrlw是关闭编辑器 Ctrl/是注释&#xff0c;但是如果没弄对&#xff0c;有可能会按成Ctrl\ ,而这个快捷键是拆分编辑器&#xff0c;尤其是多按几个&#xff0c;就拆分出很多窗口&#xff0c;非常影响编程工作…

CSS:背景样式、盒子模型与文本样式

背景样式 背景样式用于设置网页元素的背景&#xff0c;包括颜色、图片等。 背景颜色 使用 background-color 属性设置背景颜色&#xff0c;支持多种格式&#xff08;颜色英文、十六进制、RGB等&#xff09;。 div {background-color: lightblue; }格式示例十六进制#ff5733R…

【Linux】记录一下考RHCE的学习过程(七)

年底了&#xff0c;公司接的北京地铁轨道交通的项目做不完了&#xff0c;一百多列地铁的设备都得调&#xff0c;派我出差了几周&#xff0c;这几天才回来&#xff0c;出差累死了实在是没办法更新。&#xff08;YOASOBI的二开票还没抢到ToT&#xff0c;哭死&#xff0c;看看回滚…

get和post有什么区别

GET和POST是HTTP协议中两种常用的请求方法&#xff0c;它们在用途、参数传递方式、缓存处理、安全性等方面存在显著差异。 以下是对GET和POST区别的详细讲解&#xff0c;并给出示例演示。 一、GET和POST的区别 用途 GET&#xff1a;主要用于获取信息&#xff0c;即进行查询操…

Lua协同程序(线程)

1、 Lua 的协同程序&#xff08;coroutine&#xff09;简单介绍 Lua 的协同程序&#xff08;coroutine&#xff09;是一种轻量级的线程&#xff0c;允许你在多个任务之间进行协作式多任务处理。与操作系统线程不同&#xff0c;协同程序是由程序员显式控制的&#xff0c;不会自动…

流媒体学习

流媒体 特性流媒体流协议FLVMSE定义采用数据流方式在网络上进行播放的媒体格式用于传输流媒体数据的网络协议Flash Video&#xff0c;一种流媒体格式一项 W3C 规范&#xff0c;允许 JavaScript 为 <audio> 和 <video> 动态构造媒体源作用提供连续的音视频播放体验&…

【简博士统计学习方法】第1章:3. 统计学习方法的三要素

3. 统计学习方法的三要素 3.1 监督学习的三要素 3.1.1 模型 假设空间&#xff08;Hypothesis Space&#xff09;&#xff1a;所有可能的条件概率分布或决策函数&#xff0c;用 F \mathcal{F} F表示。 若定义为决策函数的集合&#xff1a; F { f ∣ Y f ( X ) } \mathcal{F…

Linux内核 -- RTC 驱动的注册方式

Linux 内核中 RTC 驱动的注册方式 在 Linux 内核中&#xff0c;RTC&#xff08;Real-Time Clock&#xff09;驱动的注册可以通过多种方式实现&#xff0c;以下整理了常见的注册方式及其注意事项。 1. 使用 devm_rtc_device_register 这是注册 RTC 驱动的最常用方法&#xff…

JavaEE初阶——计算机工作原理

一、什么是JavaEE JavaEE&#xff08;Java Platform&#xff0c;Enterprise Edition&#xff09;是sun公司&#xff08;2009年4月20日甲骨文将其收购&#xff09;推出的企业级应用程序版本。这个版本以前称为 J2EE。能够帮助我们开发和部署可移植、健壮、可伸缩且安全的服务器…

多目标优化算法——基于聚类的不规则Pareto前沿多目标优化自适应进化算法(CA-MOEA)

基于聚类的不规则Pareto前沿多目标优化自适应进化算法&#xff08;CA-MOEA&#xff09; 一、算法简介 简介&#xff1a; 现有的多目标进化算法&#xff08;moea&#xff09;在具有规则Pareto前沿且Pareto最优解在目标空间上连续分布的多目标优化问题&#xff08;MOPs&#xff…

短诗《腊八粥》

《腊八粥》现•佚名已买花生同煮粥&#xff0c;粥不似&#xff0c;少年稠也不复&#xff0c;少年仇亦不赴&#xff0c;少年愁终不负&#xff0c;少年筹 &#xff08;主编目前所有分类&#xff1a; 身&#xff0c;心&#xff0c;灵思 工作&#xff0c;生活 创作 剧 让世界更…

封装深拷贝方法

前言 在今年的四月份我写了一篇有关深拷贝的博客文章 我与深拷贝_radash 深拷贝-CSDN博客。在该文章中有一个令我感到遗憾的点就是我没有实现一个自己手写的深拷贝。如今我想弥补当初的遗憾&#xff0c;在这篇文章中详细的讲述一下如何手写一个深拷贝方法。 lodash中是如何实…

数据结构:树

数据结构中的树 树&#xff08;Tree&#xff09;是一种非线性数据结构&#xff0c;用于表示具有层次结构的数据。树结构由节点&#xff08;Node&#xff09;和边&#xff08;Edge&#xff09;组成&#xff0c;节点之间通过边连接&#xff0c;形成父子关系。树是一种抽象数据类…

【信息系统项目管理师】第15章:项目风险管理过程详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 一、规划风险管理1、输入2、工具与技术3、输出二、识别风险1、输入2、工具与技术3、输出三、实施定性风险分析1、输入2、工具与技术3、输出四、实施定量风险分析1、输入2、工具与技术3、输出五、规划风险应对1、…