工厂方法
<?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('小明', '注意危险');