工厂方法
<?php /** * 工厂方法 * * @author jinpeng * @date 2022/10/19 */ interface DB { function conn(); } interface Factory { function createDB(); } class MysqlDb implements DB { function conn() { echo "连接了MySQL"; } } class SqliteDb implements DB { public function conn() { echo "连接了sqlite"; } } // 新增oracle数据库 class OracleDb implements DB { public function conn() { echo "连接了oracle"; } } class MysqlFactory implements Factory { function createDB() { return new MysqlDb(); } } class SqliteFactory implements Factory { function createDB() { return new SqliteDb(); } } // 新增oracle工厂 class OracleFactory implements Factory { public function createDB() { return new OracleDb(); } } //=========客户端========== //符合开闭原则,只新增,不修改。 $fact = new MysqlFactory(); $mysqlDB = $fact->createDB(); $mysqlDB->conn(); echo "<br/>"; $fact = new SqliteFactory(); $SqliteDB = $fact->createDB(); $SqliteDB->conn(); echo "<br/>"; $fact = new OracleFactory(); $OracleDB = $fact->createDB(); $OracleDB->conn();
单例模式
<?php /** * 单例 * * @author jinpeng * @date 2022/10/20 */ class Model { protected static $ins = null; // 禁止继承修改 final protected function __contract() { } // 禁止克隆 protected function __clone() { throw new Exception("error clone"); } public static function getIns() { if (self::$ins === null) { self::$ins = new self(); } return self::$ins; } } $a = Model::getIns(); $b = Model::getIns(); if ($a === $b) { echo '是一个对象'; } else { echo '不是一个对象'; }
观察者模式
<?php /** * 观察者 * * @author jinpeng * @date 2022/10/20 */ class User implements SplSubject { public $lognum; public $hobby; protected $observers = null; public function __construct($hobby) { $this->lognum = rand(1, 10); $this->hobby = $hobby; $this->observers = new SplObjectStorage(); } public function login() { // 验证通过 // 通知后续环节 $this->notify(); } public function notify() { $this->observers->rewind(); while ($this->observers->valid()) { //获取当前指针位置的对象 $observers = $this->observers->current(); $observers->update($this); //存储空间指针下移 $this->observers->next(); } } public function attach (SplObserver $observer) { $this->observers->attach($observer); } public function detach (SplObserver $observer) { $this->observers->detach($observer); } } class security implements SplObserver { public function update(SplSubject $subject) { if ($subject->lognum < 3) { echo '这是第' . $subject->lognum . '登录, 安全登录'; echo "<br/>"; } else { echo '这是第' . $subject->lognum . '登录, 登录异常'; echo "<br/>"; } } } class hobby implements SPLObserver{ public function update(SplSubject $subject) { if ($subject->hobby == 'study') { echo '好好学习,天天向上。'; echo "<br/>"; } else if ($subject->hobby == 'sports') { echo '参加篮球比赛'; echo "<br/>"; } } } $user = new User('sports'); $user->attach(new security()); $user->attach(new hobby()); $user->login();
责任链模式
<?php /** * 责任链 * * @author jinpeng * @date 2022/10/20 */ interface Approval { public function pass($level); public function reject($level); } class ZuZhang implements Approval { protected $top = 'ZhuGuan'; protected $level = 1; public function pass($level) { if ($this->level >= $level) { echo "组长审批。"; } else { $top = new $this->top; $top->pass($level); } } public function reject($level) { // TODO: Implement reject() method. } } class ZhuGuan implements Approval { protected $top = 'ZongJian'; protected $level = 2; public function pass($level) { if ($this->level >= $level) { echo "主管审批。"; } else { $top = new $this->top; $top->pass($level); } } public function reject($level) { // TODO: Implement reject() method. } } class ZongJian implements Approval { protected $top = ''; protected $level = 3; public function pass($level) { echo "总监都能审批。"; } public function reject($level) { // TODO: Implement reject() method. } } $c = new ZuZhang(); $c->pass(4);
策略模式
<?php /** * 策略 * * @author jinpeng * @date 2022/10/20 */ interface Park { public function attr(); } class ParkQingLongHu implements Park { public function attr() { echo "青龙湖公园,地处北京房山区"; } } class ParkZhongShan implements Park { public function attr() { echo "中山公园,地处天安门广场旁"; } } class ParkShouGang implements Park { public function attr() { echo "首钢公园,地处石景山区"; } } class VirtualPark{ protected $type; protected $park; public function __construct($type) { $park = "Park" . $type; $this->park = new $park(); } public function attr() { $this->park->attr(); } } $v = new VirtualPark('QingLongHu'); $v->attr();
装饰模式
<?php /** * 装饰 * * @author jinpeng * @date 2022/10/20 */ // 文章编辑装饰功能 class BaseArt{ protected $content; protected $art; public function __construct($content) { $this->content = $content; } public function edit() { return $this->content; } } // 小编进行操作 class BianArt extends BaseArt{ public function __construct(BaseArt $art) { $this->art = $art; $this->edit(); } public function edit() { return $this->content = $this->art->edit() . "小编进行了编辑操作"; } } // SEO人员关键词优化 class SEOArt extends BaseArt{ public function __construct(BaseArt $art) { $this->art = $art; $this->edit(); } public function edit() { return $this->content = $this->art->edit() . "EEO进行了关键词操作"; } } $b = new SEOArt(new BianArt(new BaseArt('天天向上'))); echo $b->edit();
适配器模式
<?php /** * 适配器 * * @author jinpeng * @date 2022/10/20 */ class Weather{ public function getInfo () { $data = ['tianqi' => '晴朗', 'wendu' => 25]; $ret = serialize($data); return $ret; } } class AdapterWeather extends Weather { public function getInfo() { $parentData = parent::getInfo(); return json_encode(unserialize($parentData)); } } // 针对不同场景 处理不同情况,符合开闭原则,只新增不修改 $w = new Weather(); echo $w->getInfo(); $w = new AdapterWeather(); echo $w->getInfo();
桥接模式
<?php /** * 桥接 * * @author jinpeng * @date 2022/10/20 */ abstract class Info { protected $send = null; public function __construct($send) { $this->send = $send; } abstract public function msg ($content); public function send($to, $content) { $content = $this->msg($content); $this->send->send($to, $content); } } class Sms{ public function send($to, $content) { echo "短信发送给 {$to} : {$content}"; } } class Email{ public function send($to, $content) { echo "Email发送 {$to} : {$content}"; } } class App{ public function send($to, $content) { echo "App发送 {$to} : {$content}"; } } // 三种消息等级 class CommonInfo extends Info { public function msg($content) { return '普通:' . $content; } } class UrgentInfo extends Info { public function msg($content) { return '加急:' . $content; } } class DangerInfo extends Info { public function msg($content) { return '危险:' . $content; } } // 普通消息 $common = new CommonInfo(new App()); $common->send('小明', '起床吃饭了'); echo "<br/>"; // 加急消息 $Urgent = new UrgentInfo(new App()); $Urgent->send('小明', '起火了'); echo "<br/>"; // 危险消息 $Danger = new DangerInfo(new App()); $Danger->send('小明', '注意危险');