php设计模式学习(单例模式和观察者模式)

1、单例模式

前几天跟一个朋友讨论的时候,朋友提了一个问题,为什么所有类不都用单例模式,都用单例模式真的是最好的吗?

php中不管是new出来的对象还是静态变量,只对本次请求有效,当一次请求结束的时候,所有的对象和变量都会被销毁。

当一个对象每次请求只用一次的时候,单例模式和直接new没什么区别吧。

另一点,当一个对象涉及较多的属性修改或设置,又需要多次使用,很多时候可能我们更希望每次都进行初始化,而不是直接使用一个不知道被做了哪些操作的对象

综上,个人认为,单例模式更适用于一次请求需要多次使用,且不涉及过多属性修改的对象。

2、观察者模式

观察者模式适用于某一个状态发生变化时,其他几处需要针对此变化做出不同的反应。符合接口隔离原则,实现了对象之间的松散耦合。

php SPL中已经提供了SplSubject和SqlOberver接口,分别编写被观察者类和观察者类实现这两个接口即可。

下边是一个demo:

class Subject implements SplSubject
    {
        private $observers;  

        public function attach(SplObserver $observer)
        {
            if (!in_array($observer, $this->observers)) {
                $this->observers[] = $observer;
            }
        }  

        public function detach(SplObserver $observer)
        {
            if (false != ($index = array_search($observer, $this->observers))) {
                unset($this->observers[$index]);
            }
        }  

        private function notify()
        {
            foreach ($this->observers as $observer) {
                $observer->update($this);
            }
        }
        public function setCount($count)
        {
            echo "数据量加" . $count;
        }
        public function setIntegral($integral)
        {
             echo "积分量加" . $integral;
        }  

    }  

    class Observer1 implements SplObserver
    {
        public function update($subject)
        {
            $subject-> setCount(1);
        }
    }
    class Observer2 implements SplObserver
    {
        public function update($subject)
        {
            $subject-> setIntegral(10);
        }
    }  

    class Client
    {
        public  function test()
        {
            $subject = new Subject();
            $subject->attach(new Observer1());
            $subject->attach(new Observer2());
            $subject->notify();//输出:数据量加1 积分量加10
        }
    }

观察者模式更适用于一个主体需要动态旳增加属性或其他相关项的情景,例如一个swich操作,当这个switch需要频繁的增加种类,而你又不想对原有代码造成影响时,可以考虑观察者模式(一个不恰当的例子)。又如当主体变化时,你希望跟主体相关的对象都相应的做出变化时,可以用观察者模式

事件更像是观察者模式的反向:多个地方的不同操作需要触发同一个操作事件,事件是埋多个点,触发一个点。而观察者是埋一个点,触发多点变化。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-26 22:15:03

php设计模式学习(单例模式和观察者模式)的相关文章

java设计模式学习 ----- 单例模式(Singleton)

单例模式(Singleton) 单例对象(Singleton)是一种经常使用的设计模式. 在Java应用中,单例对象能保证在一个JVM中,该对象仅仅有一个实例存在.单例模式也分三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有几个长处: 1.某些类创建比較频繁,对于一些大型的对象,这是一笔非常大的系统开销. 2.省去了new操作符,减少了系统内存的使用频率,减轻GC压力. 3.有些类如交易所的核心交易引擎.控制着交易流程,假设该类能够创建多个的话,系统全然乱了.(比方一个军队出现了多个司令员

(@WhiteTaken)设计模式学习——单例模式

单例模式,个人理解就是,使用了这个模式,可以保证一个类只生成唯一的实例对象.就是在整个程序中,这个类只存在一个实例对象. GoF对单例模式的定义:保证一个类,只有一个实例存在,同时提供能对该实例加以访问的全局访问方法. 客户端的代码用来测试,获取到的实例只有一个.直接上代码. 1 public class MainClass { 2 public static void main(String[] args) { 3 Person person1=Person.getPerson();//获取P

Java设计模式学习笔记(观察者模式)

观察者模式说起来很简单,就是一个订报纸的模式.但是实际上这部分我觉得还是很有意思的,<Head First设计模式>里还有一些还没看完,也是因为理解的不够深吧. 观察者模式会包含两个组件:观察者和主题. 这段代码是主题的接口: package obeserver; public interface Subject { public void registerObserver(Observer observer); public void removeObserver(Observer obse

设计模式学习笔记之观察者模式

观察者模式 定义了对象之间的一对多依赖,这样一来,当一个对象状态改变时,它的所有依赖者都会收到通知并自动更新. 观察者模式中,分为推和拉两种模式. 推模式,即主题对象向观察者对象推送状态值,不管观察者对象是否需要,并且推送全部数据或者部分数据. 拉模式,即主题对象通知观察者对象状态值已改变,观察者根据自己需要决定是否主动到主体对象中获取详细信息. 两种模式的比较 1.推模型是假定主题对象知道观察者需要的数据:而拉模型是主题对象不知道观察者具体需要什么数据,没有办法的情况下,干脆把自身传递给观察者

设计模式学习二之观察者模式1

观察者模式可谓是我们用的最多的模式之一了,如果开发过界面程序的话,各种监听事件,setOnClickListener(),设置点击的监听事件,这里就是一个观察者模式的应用了.观察者模式是什么呢?是一个一对多得依赖,一个主题,多个订阅者,就像报纸在报社和读者间的关系一样,读者通过给报社交钱告诉报社我需要你得报纸,报社分发报纸的时候,对所有交钱了得读者一一派发报纸. 怎么实现呢?考虑接口的应用,以及List容器的使用等. 主题接口,相当于报社 package com.csshu; 主题接口,具有注册

js设计模式学习 --- 单例模式1

什么单例模式 定义: 保证一个类仅有一个实例,并提供一个访问它的全局访问. 单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池.全局缓存.浏览器中的window 对象等.在JavaScript 开发中,单例模式的用途同样非常广泛.试想一下,当我们单击登录按钮的时候,页面中会出现一个登录浮窗,而这个登录浮窗是唯一的,无论单击多少次登录按钮,这个浮窗都只会被创建一次,那么这个登录浮窗就适合用单例模式来创建. 实现单例模式 <script type="text/javascrip

javascript设计模式学习——单例模式

单例模式:又被称为单体模式,是只允许实例化一次的对象类. 运用: 1.用一个对象来规划一个命名空间(如:JQuery库,单例模式就为它提供了一个命名空间),井井有条地管理对象上的属性与方法. 2.通过单例模式来管理代码库的各个模块 模块化的概念由来已久,并且在JS中也有很长久的使用历史.通常我们在编写代码时,会将复杂的问题根据实际情况进行合理的拆分,让代码更具备可读性与可维护性.因此一个模块可以理解为整体的一部分.而且随着JS应用复杂度的提高,模块化的应用也变成了必须. 在之前的JS中,没有专门

设计模式学习-单例模式

定义:确保某一个类只有一个实例,而且自行实例化向整个系统提供整个实例 使用场景: 要求生产唯一序号的环境 在整个项目中需要一个共享访问点或共享数据,例如程序计数器 创建一个对象需要消耗的资源过多 需要定义大量的静态常量或静态方法的环境 实例: package cn.lonecloud.singleton; /** * @author lonecloud * @version v1.0 * @date 下午3:44 2018/3/16 */ public class DemoSingleton {

常见的设计模式:单例模式、工厂模式、观察者模式、装饰模式与适配器模式

常见的设计模式:单例模式.工厂模式.观察者模式.装饰模式与适配器模式 这里可以阅读Terry Lee的设计模式系列来理解学习一下 1.4.1 单例模式 .NET设计模式(2):单件模式(Singleton Pattern)  http://terrylee.cnblogs.com/archive/2005/12/09/293509.html 1.4.2 抽象工厂模式 .NET设计模式(3):抽象工厂模式(Abstract Factory) http://terrylee.cnblogs.com/

java/android 设计模式学习笔记(2)---观察者模式

这篇来讲一下观察者模式,观察者模式在实际项目中使用的也是非常频繁的,它最常用的地方是GUI系统.订阅--发布系统等.因为这个模式的一个重要作用就是解耦,使得它们之间的依赖性更小,甚至做到毫无依赖.以GUI系统来说,应用的UI具有易变性,尤其是前期随着业务的改变或者产品的需求修改,应用界面也经常性变化,但是业务逻辑基本变化不大,此时,GUI系统需要一套机制来应对这种情况,使得UI层与具体的业务逻辑解耦,观察者模式此时就派上用场了. PS:对技术感兴趣的同鞋加群544645972一起交流. 设计模式