开发中适当的使用设计模式,可以让项目有更易扩展,易维护、低耦合,代码简洁等

单例模式

<?php

/**
* 单例模式:使类在全局范围内只允许创建一个对象,常用于数据库连接等
*/ class Singleton
{
// 必须用private修饰,防止被外部访问
private static $_instance = null; private function __construct()
{
// 必须用private修饰,防止被实例化
} private function __clone()
{
// 必须用private修饰 防止被克隆
} public static function getInstance()
{
if (empty(self::$_instance)) {
self::$_instance = new self();
} return self::$_instance;
} public function show()
{
echo '单例模式';
}
} $single = Singleton::getInstance(); $single->show();
// 单例模式

工厂模式

<?php

/**
* 工厂模式:统一了调用对象的方式,不必要在代码需要的地方 new 一个对象
* 避免当改变某个类的名字或者方法之后,在调用这个类的所有的代码中都修改它的名字或者参数。
* 当一个类的名称修改后,只需要在工厂方法里修改对应的名称即可。
*/ class Database
{
public function connect()
{
echo '数据库连接成功';
}
} class Cache
{
public function connect()
{
echo '缓存开启成功';
}
} // 工厂模式
class Factory
{
public static function getDatabase()
{
// 当Database类名称修改后,只需要需改此处代码
return new Database();
} public static function getCache()
{
// 当Cache类名称修改后,只需要需改此处代码
return new Cache();
}
} Factory::getDatabase()->connect();
// 数据库连接成功 Factory::getCache()->connect();
// 缓存开启成功

注册模式

<?php

/**
* 注册模式:解决全局共享对象问题
* 将已经创建好的对象,挂到全局可以使用的数组上,在需要使用的时候,直接从该数组上获取即可,无需重新实例化
* tp5 框架中已体现
*/ class Register
{
// 存储对象
private static $_objects = []; // 设置对象
public static function set($name, $object)
{
self::$_objects[$name] = $object;
} // 获取对象
public static function get($name)
{
return isset(self::$_objects[$name]) ? self::$_objects[$name] : null;
} // 删除对象
public static function delete($name)
{
unset(self::$_objects[$name]);
}
} $object = new Stdclass(); // 存储对象
Register::set('stdClass', $object); // 获取对象
$object = Register::get('stdClass'); // $object->func() 调用对象方法

观察者模式

<?php

/**
* 观察者模式:当一个对象状态发生变化时,依赖它的对象全部会收到通知,并自动更新。
* 当一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理的逻辑。
* 当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件的主体代码。
* 观察者模式实现了低耦合,非侵入式的通知与更新机制
*/ // 观察者
interface Observer
{
public function update();
} class Message implements Observer
{
public function update()
{
// todo push message to user
echo '给用户推送消息通知'. PHP_EOL;
}
} class Sms implements Observer
{
public function update()
{
// todo push sms to user
echo '给用户发送短信通知' . PHP_EOL;
}
} // 生产者
class OrderHandle
{
private $_observers = []; /**
* 添加观察者
* @param Observer $observer
*/
public function setObserver(Observer $observer)
{
$this->_observers[] = $observer;
} public function start()
{
echo '订单处理开始' . PHP_EOL;
} public function complete()
{
$this->notify();
echo '订单处理完成' . PHP_EOL;
} /**
* 通知消费者
*/
private function notify()
{
foreach ($this->_observers as $observer) {
$observer->update();
}
}
} $orderHandle = new OrderHandle(); $orderHandle->setObserver(new Message());
$orderHandle->setObserver(new Sms()); $orderHandle->start();
$orderHandle->complete();
// 订单处理开始
// 给用户推送消息通知
// 给用户发送短信通知
// 订单处理完成

策略模式

<?php

/**
* 策略模式:将一组特定的行为和算法封装成类,以适应某些特定的上下文环境
* 应用:社区中,根据用户性别,在广告位中展示不同的广告,男性、女性。
*/ interface Strategy
{
public function showAd();
} // 男性策略
class MaleStrategy implements Strategy
{
public function showAd()
{
echo 'T恤,衬衫,运动裤';
}
} // 女性策略
class FemaleStrategy implements Strategy
{
public function showAd()
{
echo '马甲,牛仔,连衣裙';
}
} // 用户信息
class User
{
private $_strategy; public function setStrategy(Strategy $strategy)
{
$this->_strategy = $strategy;
} public function showAd()
{
$this->_strategy->showAd();
}
} $gender = isset($_GET['gender']) ? $_GET['gender'] : 'male';
$user = new User(); if ($gender === 'female') {
$strategy = new FemaleStrategy();
} else {
$strategy = new MaleStrategy();
} $user->setStrategy($strategy);
$user->showAd();
// T恤,衬衫,运动裤

适配器模式

<?php

/**
* 适配器模式:将作用相同的不同类的不同方法封装成统一的API,对外只提供这一份api,而不管内部实现
* 数据库操作有MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致,使不同的数据库操作,统一成一致的API
* 类似的还有Cache适配器,可以将memcache,redis,file,apc等不同的缓存函数,统一成一致的API
*/ interface IDatabase
{
public function connect($host, $user, $password, $database);
public function query();
} // 自定义mysqli 避免与系统冲突
class IMysqli implements IDatabase
{
protected $_connect = null; // 数据库链接
public function connect($host, $user, $password, $database)
{
$mysqli = new mysqli($host, $user, $password, $database); if ($mysqli->connect_error) {
die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
} $this->_connect = $mysqli;
} public function query()
{
$this->_connect->query("delete from user WHERE id = 2");
}
} // 自定义pdo 避免与系统冲突
class IPdo implements IDatabase
{
protected $_connect = null; // 数据库链接
public function connect($host, $user, $password, $database)
{
$dsn = "mysql:host={$host};dbname={$database}"; try {
$pdo = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
die('Connection Error: ' . $e->getMessage());
} $this->_connect = $pdo;
} public function query()
{
$this->_connect->exec("delete from user WHERE id = 1");
}
} // 数据库对外提供连接的类
class Db
{
protected $_connect = null; public function connect($connectType)
{
if ($connectType === 'mysqli') {
$this->_connect = new IMysqli();
} else if ($connectType === 'pdo') {
$this->_connect = new IPdo();
} return $this->_connect;
}
} // 系统配置采用哪种连接方式
$databaseType = 'pdo';
$db = (new Db())->connect($databaseType); $db->connect('127.0.0.1', 'root', '123456', 'database'); // 统一查询方法,不需要关心它内部是用query实现,还是用exec 实现
$db->query();

装饰器模式

<?php

/**
* 装饰器模式:实现对类的动态添加或修改类功能
* 如果要在一个类中修改并添加额外的功能,通常需要一个子类来继承并重写类的方法
* 使用装饰器模式,仅需要在运行时添加一个装饰器对象即可实现,可以实现最大额灵活性。
*/ interface Decorator
{
// 穿着
public function wear();
} class Clothes implements Decorator
{
public function wear()
{
echo '身穿牛仔配T恤';
}
} class Shoe implements Decorator
{
public function wear()
{
echo '脚踏詹15';
}
} class Hat implements Decorator
{
public function wear()
{
echo '头戴New York';
}
} // 被装饰类
class Person
{
protected $_decorator = []; public function setDecorator(Decorator $decorator)
{
$this->_decorator[] = $decorator;
} public function display()
{
echo '我的行头:'; foreach ($this->_decorator as $decorator) {
$decorator->wear();
} echo '他们都说土';
}
} $person = new Person(); // 装饰衣服、鞋子、帽子,而不需要对person类进行重写,灵活搭配
$person->setDecorator(new Clothes());
$person->setDecorator(new Shoe());
$person->setDecorator(new Hat()); $person->display();
// 我的行头:
// 身穿牛仔配T恤
// 脚踏詹15
// 头戴New York
// 他们都说土

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. Navicat Premium 常用功能讲解

    https://www.linuxidc.com/Linux/2016-04/130159.htm Navicat Premium 常用功能讲解 1.快捷键 1.1. F8 快速回到当前对象列表 1. ...

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

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

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

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

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

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

随机推荐

  1. .net基础学java系列(一)视野

    本文目的在于扩展你我视野,求各位大神帮忙补充下表格中的内容,特别是Java的相关内容. 下面的文字纯是为了凑足150个字. 本人作为一名普通的.net程序员,也快混了十年了.在.net方面的知识面较广 ...

  2. [NOI2018]你的名字

    题解: 前68分非常简单 建立SAM 另一个串在上面跑,然后求一个树链的并 我们会发现暴力就是min(l^2,n)的 所以复杂度最多是nsqrt(n)的 当然我们也可以nlogn维护 把所有点按照df ...

  3. Django DetailView 多重继承 关系整理

    0.参考 https://docs.djangoproject.com/en/2.1/topics/class-based-views/mixins/ 1.版本信息 In [157]: import ...

  4. 微服务框架——SpringCloud

    1.SpringCloud微服务框架 a.概念:SpringCloud是基于SpringBoot的微服务框架 b.五大神兽:Eureka(服务发现).Ribbon(客服端负载均衡).Hystrix(断 ...

  5. Metasploit运行环境内存不要低于2GB

    Metasploit运行环境内存不要低于2GB  Metasploit启用的时候,会占用大量的内存.如果所在系统剩余内存不足(非磁盘剩余空间),会直接导致运行出错.这种情况特别容易发生在虚拟机Kali ...

  6. 光纤网卡与HBA卡区别

    1.简介 光纤网卡 ,指的是光纤以太网适配器,简称光纤网卡,学名Fiber Ethernet Adapter.传输输的是以太网通信协议,一般通过光纤线缆与光纤以太网交换机连接.按传输速率可以分为100 ...

  7. java中的反射整理

    1,什么是反射 反射机制是java语言提供的一种基础功能,它能够赋予成语在运行时进行自省的能力.通过反射我们可以直接操作类或者对象,例如:可以通过反射去获取某个对象的类的定义,属性,方法,还可以修改类 ...

  8. 简繁体转化处理 opencc 安装【centos 7】

    代码 #准备工作 yum install cmake yum install git #下载代码 git clone https://github.com/BYVoid/OpenCC #安装文档生成 ...

  9. xlrd模块

    import xlrdbook = xlrd.open_workbook('app_student.xls')sheet = book.sheet_by_index(0)# sheet2 = book ...

  10. esxi 精简置备只增不减问题解决方法(转)

    esxi 精简置备只增不减问题解决方法 众所周知Thin Provisioning模式下的虚拟机磁盘的空间会随需增长,可以很大程度上帮助我们节约空间,可是,凡增长过后的空间,即使清除了导致增长的文件后 ...