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());
时间: 2025-01-05 20:36:08

PHP设计模式笔记的相关文章

php设计模式笔记:单例模式

意图: 保证一个类仅有一个实例,并且提供一个全局访问点 单例模式有三个特点: 1.一个类只有一个实例2.它必须自行创建这个实例3.必须自行向整个系统提供这个实例 主要实现: Singleton定义了一个instance操作,允许外部访问它的唯一实例,instance是一个类方法,负责创建它的唯一实例. singleton适用场景: 1.当类只能有一个实例而且外部可以从一个公共的访问点访问它.2.当这个唯一实例应该是通过子类化可扩展的.并且用户应该无需更改代码就能使用一个扩展的实例时. Singl

Asp.net设计模式笔记之一:理解设计模式

GOF设计模式著作中的23种设计模式可以分成三组:创建型(Creational),结构型(Structural),行为型(Behavioral).下面来做详细的剖析. 创建型 创建型模式处理对象构造和引用.他们将对象实例的实例化责任从客户代码中抽象出来,从而让代码保持松散耦合,将创建复杂对象的责任放在一个地方,这遵循了单一责任原则和分离关注点原则. 下面是“创建型”分组中的模式: 1.Abstract Factory(抽象工厂)模式:提供一个接口来创建一组相关的对象. 2.Factory Met

设计模式----看大话设计模式笔记(二)

9.原型模式(Prototype): 用原型实例指定创建对象的种类,并通过拷贝这些原型创建行的对象. UML图: 原型模式其实就是从一个对象创建另一个可定制的对象,并且不需要知道任何创建的细节. .NET 中实现ICloneable接口即可. 一般在初始化信息不发生变化的情况下,克隆是最好的办法,隐藏了对象创建的细节,又提高了性能. MemberwiseClone()方法,如果字段是值类型,对该字段进行逐位复制:如果是引用类型,复制引用但是不复制引用的对象,因此原始对象及产生的副本引用同一对象.

(CZ深入浅出Java基础)设计模式笔记

一.面向对象思想设计原则 1.单一职责原则 其实就是开发人员经常说的"高内聚,低耦合",也就是说,每个类应该只有一个职责,对外只能提供一种功能,而引起类变化的原因应该只有一个.在设计模式中,所有的设计模式都遵循这一原则. 2.开闭原则 核心思想是:一个对象对扩展开放,对修改关闭.其实开闭原则的意思就是:对类的改动是通过增加代码进行的,而不是修改现有代码.也就是说软件开发人员一旦写出了可以运行的代码,就不应该去改动它,而是要保证它能一直运行下去,如何能够做到这一点呢?这就需要借助于抽象和

[设计模式] .NET设计模式笔记 - 了解设计模式

今天在TerryLee的cnblog(http://terrylee.cnblogs.com)里看到了与设计模式相关的整套文章,初学设计模式看完每篇文章后做些笔记和摘抄. ●什么是设计模式,什么是架构? 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的:设计模式使代码编制真正工程化:设计模式是软件工程的基石脉络,如同大厦的

[设计模式] .NET设计模式笔记 - 有多少种设计模式

.NET下的23中设计模式. ※创建型模式篇 ●单件模式(Single Pattern) ●抽象工厂模式(Abstract Factory) ●建造者模式(Builder Pattern) ●工厂方法(Factory Method) ●原型模式(Protype Pattern) ※结构型模式篇 ●适配器模式(Adapter Pattern) ●桥接模式(Bridge Pattern) ●装饰模式(Decorator Pattern) ●组合模式(Composite Pattern) ●外观模式(

设计模式笔记(转)

本文转自:http://www.cnblogs.com/windlaughing/archive/2013/04/10/3013031.html 手头有一本设计模式,但是总是有闲事坚持不下去,转载了大神的笔记总结,下周坚持看完!!!!! 笔者所发表的设计模式系列的随笔一共包含15篇,归纳总结了<Head First 设计模式>一书中的内容.在这些随笔中,尽量用简洁.概括的语言说明每个模式的概念.特点.用法,并配以图片(类图.流程图)给读者一种直观.具体的印象.希望大家能有所收获. 1.策略模式

大话PHP设计模式笔记

针对PHP的设计模式进行总结记录. 顺带,我会在后面把我整理的一整套CSS3,PHP,MYSQL的开发的笔记打包放到百度云,有需要可以直接去百度云下载,这样以后你们开发就可以直接翻笔记不用百度搜那么麻烦了.  笔记链接:http://pan.baidu.com/s/1qYdQdKK 密码:pvj2   一.关于命名空间命名空间1.命名空间介绍2.命名空间使用 实例:test1.php文件代码: 1 2 3 4 5 6 7 <?php namespace Test1; function test(

php设计模式笔记--总结篇

一.引入  设计模式的一般定义不再说,只大概说一下我理解的设计模式,我理解的设计模式的主要目的是利用面向对象(类.接口等)特点,让代码更加易于扩展,易于重用,易于维护.这三个特点也就要求我们不要将太多功能积攒到一个类里面,而是分配到更多的类里面.所以,二十种乃至更多的设计模式主要是围绕上述四个目的进行设计的. php设计模式这一本书讲了19种设计模式,但其实有大部分设计模式思想上或者设计上是一样的思维与形式,我将在下面进行归类和总结,以便于大家更好地理解这本书,但大家最好看一下这本书,里面的使用

Asp.net设计模式笔记之二:应用程序分离与关注点分离

本次笔记主要涉及的内容如下: 1.将智能UI(SmartUI)反模式重构成分层方式的示例代码 2.分层设计与传统的Asp.net WebForm模型(代码后植)相比具有的优势 3.逻辑分层概念以及分离应用程序关注点 4.企业级Asp.net应用程序中各个不同层的责任 一.智能UI反模式 asp.net WebForm模型使得我们能够随意将控件拖放到设计页面上,然后进行代码书写.而其本身则使用代码后植技术,使得后台代码和前台代码分离开.后台代码包含了应用程序的所有事件处理,数据访问以及业务逻辑等,