在日常开放中,经常会用到一些设计模式,进行我们代码的优化处理,一个很好的设计思想

1) 工厂模式

  在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象

/**
* 定义数据库接口
*/
interface DB {
// 连接数据库
public function conn();
} /**
* 工厂接口
*/
interface Factory{
// 创建数据库接口
function createDB();
} /**
* 实现DB接口的mysql类
*/
class mysqlDB implements DB{
public function conn(){
echo '连接到mysql数据库';
}
} /**
* 实现DB接口的sqlite类
*/
class sqLiteDB implements DB{
public function conn(){
echo '连接到了sqlite数据库';
}
} /**
* 创建对应的数据库对象工厂类
*/
class mysqlFactory implements Factory{
public function createDB(){
return new mysqlDB();
}
} /**
* 创建对应的数据库对象工厂类
*/
class sqliteFactory implements Factory{
public function createDB(){
return new sqLiteDB();
}
} ////////////////////
// 假设新增MongoDB数据库 //
//////////////////// // 1:要新增mongoDB()
/**
* 实现DB接口的mongo类
*/
class mongoDB implements DB{
public function conn(){
echo '连接到了mongodb数据库';
}
}
// 2:新增对应的工厂方法
class mongoFactory implements Factory{
public function createDB(){
return new mongoDB();
}
} // 测试
$mysqlfactory=new mysqlFactory();
$mysqldb=$mysqlfactory->createDB();
$mysqldb->conn(); $sqlitefactory=new sqliteFactory();
$sqlitedb=$sqlitefactory->createDB();
$sqlitedb->conn(); $mongofactory=new mongoFactory();
$mongodb=$mongofactory->createDB();
$mongodb->conn();

这样就不违反了开闭规则了,不修改已有的代码,直接添加新的代码,提高了程序的扩展性。

2)单例模式

  可以保证系统中一个类只有一个实例。即一个类只有一个对象实例

class sigle{
// 保存唯一对象
private static $selfObj=null;
// 目的:封锁外部new操作
private function __construct(){}
// 封锁外部clone
private function __clone(){} public static function getObj(){
if(self::$selfObj===null){
self::$selfObj=new self();
}
return self::$selfObj;
}
} $q=sigle::getObj();
$w=sigle::getObj();
var_dump($q==$w);

3)观察者模式

// php5中提供SplObserver与被观察者SplSubject的接口

///////////////////////////////
// 定义被观察者,实现SplSubject被观察者对象 //
///////////////////////////////
class User implements SplSubject{
// 登陆次数
public $loginNum;
// 用户爱好
public $hobby;
// 用户名字
public $name; public function __construct($name,$hobby=''){
$this->loginNum=rand(,);
$this->hobby=$hobby;
$this->name=$name;
// 用来保存观察者的对象
$this->observers=new SplObjectStorage();
} // 用户登录入口
public function login(){
echo '登录成功后通知:';
$this->notify();
} // 添加观察者
public function attach(SplObserver $observer){
$this->observers->attach($observer);
} // 删除观察者
public function detach(SplObserver $observer){
$this->observers->detach($observer);
} /**
* 循环遍历观察者发送通知
*/
public function notify(){
// 指针指向头部
$this->observers->rewind();
while ($this->observers->valid()) {
// 当前观察者
$observer=$this->observers->current();
// var_dump($observer);
// 传递当前用户
$observer->update($this);
$this->observers->next();
}
}
} ///////////////
// 定义安全验证观察者 //
///////////////
class Secrity implements SplObserver{
/**
* 本观察者通知的具体方法
* @param SplSubject $subject [被观察者user]
*/
public function update(SplSubject $subject){
if($subject->loginNum<=){
echo $subject->name.',这是第'.$subject->loginNum.'登录.';
}else{
echo $subject->name.',这是第'.$subject->loginNum.'登录,登录次数过多.';
}
}
} ///////////////
// 定义广告推荐观察者 //
///////////////
class Commend implements SplObserver{
public function update(SplSubject $subject){
if($subject->hobby=='car'){
echo '给你推荐汽车广告'.PHP_EOL;
}else if($subject->hobby=='php'){
echo '推荐php培训广告'.PHP_EOL;
}else{
echo '好好学习,天天向上'.PHP_EOL;
}
}
} // 测试
$ming=new User('小明','php');
// 添加观察者
$secrity=new Secrity();
$ming->attach($secrity);
$commend=new Commend();
$ming->attach($commend);
$ming->login(); echo '------------------------------------------------------'.PHP_EOL; $hong=new User('小红');
// 添加观察者
$secrity=new Secrity();
$hong->attach($secrity);
$commend=new Commend();
$hong->attach($commend);
// 删除广告推荐
$hong->detach($commend);
$hong->login();

4)责任链模式

// 领班
class Foreman{
// 自己的等级
private $level=;
// 上级
protected $superior='Director';
public function process($level){
if($this->level>=$level){
// 自己能处理问题的级别大于等于当前事情级别,就自己处理
echo '领班处理'.PHP_EOL;
}else{
(new $this->superior)->process($level);
}
}
} // 主管
class Director{
// 自己的等级
private $level=;
// 上级
protected $superior='Manager';
public function process($level){
if($this->level>=$level){
echo '主管处理'.PHP_EOL;
}else{
(new $this->superior)->process($level);
}
}
} // 经理
class Manager{
// 自己的等级
private $level=;
// 上级
protected $superior='TopManager';
public function process($level){
if($this->level>=$level){
echo '经理处理'.PHP_EOL;
}else{
(new $this->superior)->process($level);
}
}
} // 总经理
class TopManager{
// 自己的等级
private $level=;
// 上级
protected $superior='President';
public function process($level){
if($this->level>=$level){
echo '总经理处理'.PHP_EOL;
}else{
(new $this->superior)->process($level);
}
}
} // 董事长
class President{
// 自己的等级
private $level=;
public function process($level){
echo '董事长处理'.PHP_EOL;
}
} // 责任链模式处理问题
$level=rand(,);
print('问题级别:'.$level);
$foreman=new Foreman();
$foreman->process($level);

5)策略模式

// 计算的接口
interface Calc{
public function process($num1,$num2);
} // 加法计算
class AddCalc implements Calc{
public function process($num1,$num2){
return $num1+$num2;
}
} // 减法计算
class SubtractCalc implements Calc{
public function process($num1,$num2){
return $num1-$num2;
}
} // 乘法计算
class MultiplyCalc implements Calc{
public function process($num1,$num2){
return $num1*$num2;
}
} // 除法计算
class DivideCalc implements Calc{
public function process($num1,$num2){
return $num1/$num2;
}
} // 计算器类
class Calculator{
// 保存计算类
private $calc=null;
/**
* @param [string] $operator [计算器运算方法]
*/
public function __construct($operator){
$operCalc=$operator.'Calc';
$this->calc=new $operCalc();
} // 计算
public function calc($num1,$num2){
return $this->calc->process($num1,$num2);
}
} $operators=array('Add','Subtract','Divide','Multiply');
$oper=$operators[rand(,)];
$calculator=new Calculator($oper);
$res=$calculator->calc(,);
echo '100 '.$oper.' 2 res:'.$res;

6)装饰器模式

// 装饰器模式做文章修饰功能

// 基本的文章类
class BaseArticle{
// 文章内容
protected $text;
// 文章对象
protected $artObj=null; public function __construct($text){
$this->text=$text;
}
public function decorator(){
return $this->text;
}
} // 添加文章摘要,继承基础文章
class SummaryArticle extends BaseArticle{
// 传递一个文章对象
public function __construct(BaseArticle $artObj){
$this->artObj=$artObj;
$this->decorator();
} public function decorator(){
return $this->text='【加了摘要】'.$this->artObj->text;
}
} // 添加文章写作时间,继承基础文章
class TimeArticle extends BaseArticle{
public function __construct(BaseArticle $artObj){
$this->artObj=$artObj;
$this->decorator();
} public function decorator(){
return $this->text=$this->artObj->text.'【时间:'.date('Y-m-d H:i:s').'】';
}
} $ba=new BaseArticle('文章主体-文章主体-文章主体-文章主体。');
$sa=new SummaryArticle($ba);
$ta=new TimeArticle($sa);
echo $ba->decorator().PHP_EOL;
echo $sa->decorator().PHP_EOL;
echo $ta->decorator().PHP_EOL;

7)适配器模式

// 假设天气接口
class Weather{
public static function show(){
$today=array(
"city"=>"北京",
"cityid"=>"",
"temp1"=>"24℃",
"temp2"=>"11℃",
"weather"=>"雷阵雨转多云"
);
// 将数据序列化,只能是php才能反序列化操作
/*a:5:{s:4:"city";s:6:"北京";s:6:"cityid";s:9:"101010100";s:5:"temp1";s:5:"24℃";s:5:"temp2";s:5:"11℃";s:7:"weather";s:18:"雷阵雨转多云";}城市:北京*/
return serialize($today);
}
} /**
* 适配器将php序列化后的数据反序列化后转化成json格式,这样其他语言就能处理了
*/
class AdapterWeather extends Weather{
public static function show(){
return json_encode(unserialize(parent::show()));
}
} // php客户端调用
print(Weather::show());
$weather=unserialize(Weather::show());
echo '城市:'.$weather['city'].PHP_EOL;
echo '城市ID:'.$weather['city'].PHP_EOL;
echo '最高温:'.$weather['temp1'].PHP_EOL;
echo '最低温:'.$weather['temp2'].PHP_EOL;
echo '天气:'.$weather['weather'].PHP_EOL; echo '--------------以下假设是python通过适配器获取天气数据----------'.PHP_EOL;
// 假设python处理天气,通过适配器获取天气数据
$weather=json_decode(AdapterWeather::show(),true);
echo '城市:'.$weather['city'].PHP_EOL;
echo '城市ID:'.$weather['city'].PHP_EOL;
echo '最高温:'.$weather['temp1'].PHP_EOL;
echo '最低温:'.$weather['temp2'].PHP_EOL;
echo '天气:'.$weather['weather'].PHP_EOL;

8)桥接模式

// 抽象消息接口
abstract class Message{
// 发送器
protected $sender;
public function __construct($sender){
$this->sender=$sender;
}
// 发送消息
public function send($to,$msg){
$msg=$this->msg($msg);
// 通过发送器发送消息
$this->sender->send($to,$msg);
}
} // 普通消息类型
class NormalMessage extends Message{
public function msg($msg){
return '【普通】'.$msg;
}
} // 警告消息类型
class WarningMessage extends Message{
public function msg($msg){
return '【警告】'.$msg;
}
} // 危险消息类型
class DangerMessage extends Message{
public function msg($msg){
return '【危险】'.$msg;
}
} // 发送站内消息发送器
class SiteMessageSender{
public function send($to,$msg){
echo '给"'.$to.'"发送站内消息: '.$msg.PHP_EOL;
}
} // 发送email消息发送器
class EmailMessageSender{
public function send($to,$msg){
echo '给"'.$to.'"发送Email消息: '.$msg.PHP_EOL;
}
} // 发送短信消息发送器
class SMSMessageSender{
public function send($to,$msg){
echo '给"'.$to.'"发送短信消息: '.$msg.PHP_EOL;
}
} // 总共有9种组合方式,但是仅仅需要6个类 $normal_msg=new NormalMessage(new SiteMessageSender());
$normal_msg->send('小红','normal信息信息信息');
$normal_msg=new NormalMessage(new EmailMessageSender());
$normal_msg->send('小红','normal信息信息信息');
$normal_msg=new NormalMessage(new SMSMessageSender());
$normal_msg->send('小红','normal信息信息信息'); $warning_msg=new WarningMessage(new SiteMessageSender());
$warning_msg->send('小绿','warning信息信息信息');
$warning_msg=new WarningMessage(new EmailMessageSender());
$warning_msg->send('小绿','warning信息信息信息');
$warning_msg=new WarningMessage(new SMSMessageSender());
$warning_msg->send('小绿','warning信息信息信息'); $danger_msg=new DangerMessage(new SiteMessageSender());
$danger_msg->send('小花','danger信息信息信息');
$danger_msg=new DangerMessage(new EmailMessageSender());
$danger_msg->send('小花','danger信息信息信息');
$danger_msg=new DangerMessage(new SMSMessageSender());
$danger_msg->send('小花','danger信息信息信息');

PHP之常用设计模式的更多相关文章

  1. Android常用设计模式(二)

    Android常用设计模式之观察者模式 观察者设计模式在Android应用中会经常用到,模式原理类似于这样的场景: 用户订报纸,然后在报社登记,报社来统计用户(添加用户),用户也可以取消订阅,报社删除 ...

  2. 代码重构 & 常用设计模式

    代码重构 重构目的 相同的代码最好只出现一次 主次方法 主方法 只包含实现完整逻辑的子方法 思维清楚,便于阅读 次方法 实现具体逻辑功能 测试通过后,后续几乎不用维护 重构的步骤 1  新建一个方法 ...

  3. IOS开发常用设计模式

    IOS开发常用设计模式 说起设计模式,感觉自己把握不了笔头,所以单拿出iOS开发中的几种常用设计模式谈一下. 单例模式(Singleton) 概念:整个应用或系统只能有该类的一个实例 在iOS开发我们 ...

  4. python之路,Day24 常用设计模式学习

    python之路,Day24 常用设计模式学习   本节内容 设计模式介绍 设计模式分类 设计模式6大原则 1.设计模式介绍 设计模式(Design Patterns) --可复用面向对象软件的基础 ...

  5. java常用设计模式总览

    一.java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组 ...

  6. javaEE Design Patter(1)初步了解23种常用设计模式

    设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. ...

  7. PHP 进阶篇:面向对象的设计原则,自动加载类,类型提示,traits,命名空间,spl的使用,反射的使用,php常用设计模式 (麦子学员 第三阶段)

    以下是进阶篇的内容:面向对象的设计原则,自动加载类,类型提示,traits,命名空间,spl的使用,反射的使用,php常用设计模式 ================================== ...

  8. C++源码实现:21种常用设计模式

    C++源码实现:21种常用设计模式一直以来在设计模式的学习中,都是出现java的源码,这对学习C++的极度不友好.本工程是基于C++实现21种常用的设计模式,里面包含了实例代码和示例.编写的时候在学习 ...

  9. 23种常用设计模式的UML类图

    23种常用设计模式的UML类图 本文UML类图参考<Head First 设计模式>(源码)与<设计模式:可复用面向对象软件的基础>(源码)两书中介绍的设计模式与UML图. 整 ...

  10. 7 种 Javascript 常用设计模式学习笔记

    7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...

随机推荐

  1. 删除排序链表中的重复元素的golang实现

    给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 输入: ->-> 输出: -> 输入: ->->->-> 输出: ->-> 我们先 ...

  2. 03.Python网络爬虫第一弹《Python网络爬虫相关基础概念》

    爬虫介绍 引入 之前在授课过程中,好多同学都问过我这样的一个问题:为什么要学习爬虫,学习爬虫能够为我们以后的发展带来那些好处?其实学习爬虫的原因和为我们以后发展带来的好处都是显而易见的,无论是从实际的 ...

  3. Python 进程管理工具 Supervisor 使用教程

    Supervisor 是基于 Python 的进程管理工具,只能运行在 Unix-Like 的系统上,也就是无法运行在 Windows 上.Supervisor 官方版目前只能运行在 Python 2 ...

  4. 如何用Ant Design Pro框架做项目省力

    1.熟悉React所有语法,以及redux.redux-saga.dva.一类的库的能力 2.灵活运用该框架提供的基础UI组件,想方设法利用现有的UI组件进行组合,尽可能减少工作量

  5. ImportError: cannot import name 'Process' from 'multiprocessing'

    from multiprocessing import Process import os def run_proc(name): print 'Run child process %s (%s).. ...

  6. python六十四课——高阶函数练习题(三)

    案例五:求两个列表元素的和,返回新列表lt1 = [1,2,3,4]lt2 = [5,6]效果:[6,8,10,12] lt1=[1,2,3,4] lt2=[5,6] print(list(map(l ...

  7. Linux:Day11(上) ifcfg命令

    将Linux主机接入到网络中: 配置方式: 静态指定: ifcfg:ifconfig,route,netstat ip:object{link,addr,route},ss,tc 配置文件:syste ...

  8. npm run dev 在Linux上持久运行

    关于node.js应用程序如何持久运行,我在node.js服务端程序在Linux上持久运行用过. 这次主要是针对是一个vue.js应用程序. vue.js应用程序通常运行命令是npm run dev. ...

  9. Debian 8.9 搭建wordpress个人博客

    想自己搭个博客玩玩,就搭建了此博客,过程可谓艰辛啊! 先在阿里云买了个  轻量应用服务器 1个月10块钱,好贵.... 用 windows sever 下载不了phpstudy,也不知道怎么回事... ...

  10. P4550 收集邮票-洛谷luogu

    传送门 题目描述 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由于凡凡也很喜欢 ...