设计模式之模板模式和观察者模式

一、模板模式

其实在我们日常的编程中有意识或者无意识得都可能使用了该模式。它的基本思想就是在基类中,我们定义一些抽象方法,这些方法都是需要具体的子类中实现,然后定义一个方法,该方法中定义了一个算法的骨架或者整体流程。它的好处就是在整体逻辑不变的情况下,只需要改变子类的具体抽象方法的实现就可以实现不同的功能。

现在拿一个例子简单说明:

abstract class BaseFinanceExcel
{
    
    public function createDataFile()
    {
        $this->createExcel("",true);
        $this->upload2COS();
    }

    abstract public function createExcel($order_type,$console);
    abstract public function upload2COS();


}

上面定义了两个抽象方法 createExcel(创建excel表),upload2COS(上传至COS),并定义了一个createDataFile,该方法中定义一个基本执行过程,创建excel并上传。这就实现了一个基本的模板模式。

在不同的子类中,实现自己的方法后,可以直接调用骨架方法createDataFile。

二、观察者模式

它建立了对象和对象之间的依赖关系,一个对象发生变化,要通知其他对象,其他对象并对其作出一些响应。它定义了对象间的一对多的关系,且当被观察对象发生变化,其他对象皆得到并作出响应。

网上有的人把观察者模式也叫做发布订阅模式,也有的人用了很多篇幅说他俩是有区别的。

其实,我觉得这两种说法都没有错。在本质上,发布订阅也是当一个对象发生变化,另外其他观察对象会得到通知,并作出变化。也就是说,在基本思想上,说他俩是一样的完全没有错。

此外,说他俩不同,主要是具体实现上不同的。在基本的观察者模式中,观察对象是完全可以感知到被观察对象的,也就是说两者之间是耦合的。这个在springboot的事件机制中就实现了,可以看看。

然而在发布-订阅模式中,订阅者和发布者之间是解耦的,他们之间会通过一个消息中间件来通信。这个在我们的工作中应该是最最常见的了吧。订阅者和发布者之间本质上没有任何的关系,彼此之间不需要知道对方是谁。

所以,说发布-订阅模式和观察者模式有区别也没错。

--------EOF---------
微信分享/微信扫码阅读