PHP设计模式笔记
一、工厂模式:减少new的使用,定义一个类,专门用来创建其它对象
例:
class A{
static function create(){
return new DB();
}
}
$db = A::create();
二、单例模式:确保一个类只有一个实例
使用场景:缓存、日志对象、数据库操作只有一个实例。
缺点:
1. 难于调试
2. 隐藏的依赖关系
例:
class A {
//静态变量保存全局实例
private static $_init = null;
//私有构造函数,防止外部实例化对象
private function __construct(){
}
//私有克隆函数,防止外部克隆对象
private function __clone(){
}
//静态方法,单例统一访问入口
public static function getInit(){
if (!isset(self::$_init)){
self::$_init = new self();
}
return self::$_init;
}
public function test(){
echo '调用方法成功';
}
}
$a = A::getInit();
$a->test();
三、策略模式:把特定行为封装成类,适应特定的环境
使用场景:电商男装女装
例:
//抽象策略接口
interface A{
public function show();
}
//用于客户端是IE时调用的类(环境角色)
class IE implements A {
public function show(){
return 'ie';
}
}
//用于客户端不是firefox时调用的类(环境角色)
class FF implements A {
public function show(){
return 'firefox';
}
}
//具体策略角色
class U {
public function index($obj){
echo $obj->show();
}
} $user = new U();
$user->index(new FF);
四、观察者模式:当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新
使用场景:事件系统
缺点:性能降低
例:
//定义观察者接口
interface Looker {
public function news($user);//定义接收通知的方法
}
//定义被观察事件的接口
interface Event {
public function add($obj);//定义被观察事件的方法
public function notify($user);//定义通知所有观察者的方法
}
//被观察事件
class E1 implements Event {
protected $obj = array(); public function add($obj){//被观察事件
$this->obj[] = $obj;
} public function notify($user){//通知所有观察者
foreach($this->obj as $o){
$o->news($user);
}
}
}
//观察者
class L1 implements Looker {
public function news($user){//接收通知
echo $user.'有新动态<br>';
}
}
$event1 = new E1;
$event1->add(new L1);
$event1->notify('小明');
$event1->notify('小红');
$event1->notify('小李');
五、适配器模式:把各种不同的类封装成同一接口
使用场景:数据库mysql,mysqli。缓存memcache,redis,file。可以用适配器模式统一成一致
六、装饰者模式:可以动态的添加修改类的功能
例:
abstract class Beverage{
public $_name;
abstract public function Cost();
}
//被装饰者类
class Coffee extends Beverage{
public function __construct(){
$this->_name = 'Coffee';
}
public function Cost(){
return 1.00;
}
}
// 以下三个类是装饰者相关类
class CondimentDecorator extends Beverage{
public function __construct(){
$this->_name = 'Condiment';
}
public function Cost(){
return 0.1;
}
}
//2.加点牛奶
class Milk extends CondimentDecorator{
public $_beverage;
public function __construct($beverage){
$this->_name = 'Milk';
if($beverage instanceof Beverage){
$this->_beverage = $beverage;
}else{
die('Failure');
}
}
public function Cost(){
return $this->_beverage->Cost() + 0.2;
}
}
//3.加点糖
class Sugar extends CondimentDecorator{
public $_beverage;
public function __construct($beverage){
$this->_name = 'Sugar';
if($beverage instanceof Beverage){
$this->_beverage = $beverage;
}else{
exit('Failure');
}
}
public function Cost(){
return $this->_beverage->Cost() + 0.2;
}
}
//1.拿杯咖啡
$coffee = new Coffee();
//2.加点牛奶
$coffee = new Milk($coffee);
//3.加点糖
$coffee = new Sugar($coffee);
printf("Coffee Total:%0.2f元\n",$coffee->Cost());
PHP设计模式笔记的更多相关文章
- php设计模式笔记:单例模式
php设计模式笔记:单例模式 意图: 保证一个类仅有一个实例,并且提供一个全局访问点 单例模式有三个特点: 1.一个类只有一个实例2.它必须自行创建这个实例3.必须自行向整个系统提供这个实例 主要实现 ...
- Asp.net设计模式笔记之二:应用程序分离与关注点分离
本次笔记主要涉及的内容如下: 1.将智能UI(SmartUI)反模式重构成分层方式的示例代码 2.分层设计与传统的Asp.net WebForm模型(代码后植)相比具有的优势 3.逻辑分层概念以及分离 ...
- [设计模式] .NET设计模式笔记 - 了解设计模式
今天在TerryLee的cnblog(http://terrylee.cnblogs.com)里看到了与设计模式相关的整套文章,初学设计模式看完每篇文章后做些笔记和摘抄. ●什么是设计模式,什么是架构 ...
- php设计模式笔记--总结篇
一.引入 设计模式的一般定义不再说,只大概说一下我理解的设计模式,我理解的设计模式的主要目的是利用面向对象(类.接口等)特点,让代码更加易于扩展,易于重用,易于维护.这三个特点也就要求我们不要将太多 ...
- grasp设计模式笔记回顾
根据讲师所讲做了一下笔记以便自己能方便学习: ------------------------------------------grasp设计模式: grasp(general responsibi ...
- <大话设计模式>笔记
读完了<大话设计模式>这本书,收获很多,对程序设计有了很多新的理解.将每章模式的大概要点做了些笔记以备查阅,一些设计模式书读完也对其了解得不是很透彻,需要以后在实践中来不断地加深理解吧.读 ...
- Javascript设计模式笔记
Javascript是越来越厉害了,一统前后端开发.于是最近把设计模式又看了一遍,顺便做了个笔记,以方便自己和他人共同学习. 笔记连载详见:http://www.meteorcn.net/wordpr ...
- 设计模式笔记(一):Singleton 设计模式
今天开始学习设计模式,借此机会学习并整理学习笔记. 设计模式是一门不区分语言的课程,什么样的编程语言都可以用到设计模式.如果说java语法规则比作武功招式的话,那么设计模式就是心法. 设计模式共有23 ...
- 大话PHP设计模式笔记
针对PHP的设计模式进行总结记录. 顺带,我会在后面把我整理的一整套CSS3,PHP,MYSQL的开发的笔记打包放到百度云,有需要可以直接去百度云下载,这样以后你们开发就可以直接翻笔记不用百度搜那么麻 ...
- iOS设计模式笔记
设计模式 所谓设计模式,就是经过无数程序员的努力,在很多代码的基础上抽取出来的"模式" 一种设计模式,通常用来解决一种问题 MVC体系架构 也是一个设计模式,主要解决:界面(V), ...
随机推荐
- Greenplum安装
最近需要安装Greenplum测试一些东西,在安装过程中出现了许多问题,所以在这里将安装过程整理一下,主要参考<Greenplum企业应用实践>和http://jxzhfei.blog.5 ...
- 一个快速排序(分类)及使用类似思想实现选择问题[c++实现]
一.快速排序(快速分类)算法: 问题描述:给定线性集中n个元素和一个整数k,1<=k<=n,要求找出这n个元素中第k小的元素. 思想:选取数组A中的某个元素 t=A[s],然后将其他元素重 ...
- spark scala学习笔记
搞清楚几个概念: 闭包 柯里化 搭建了intellij idea 的scala 开发环境
- 斯考特·杨(Scott Young)快速学习方法
上午在网上看到了斯考特·杨(Scott Young)的快速学习方法,感觉很受鼓舞. 现在已经读研究生了,可是发现自己自从上大学以来到现在,发现自己的学习方法有很大的问题. 我是个特别喜欢读书的人,在大 ...
- python列表副本
a=[1,2,3] b=[4,5,6] a=a+b #创建含a和b的副本的新列表 a [1, 2, 3, 4, 5, 6] b [4, 5, 6] c=a+b #创建含a和b的副本的新列表c [1, ...
- Mysql 表分区
是否支持分区:mysql> show variables like '%partition%';+-----------------------+-------+| Variable_name ...
- bfs判断连通图(无向)
在图论中,连通图基于连通的概念.在一个无向图 G 中,若从顶点vi到顶点vj有路径相连(当然从vj到vi也一定有路径),则称vi和vj是连通的.如果 G 是有向图,那么连接vi和vj的路径中所有的边都 ...
- 【实战Java高并发程序设计 5】让普通变量也享受原子操作
[实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...
- windows和linux中搭建python集成开发环境IDE——如何设置多个python环境
本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...
- SSH学习笔记
Struts2登录模块处理流程: 浏览器发送请求http://localhost/appname/login.action,到web应用服务器: 容器接收到该请求,根据web.xml的配置,服务器将请 ...