首页 > 其他分享 >行为型设计模式-模板方法 Template Method

行为型设计模式-模板方法 Template Method

时间:2023-09-07 13:33:21浏览次数:45  
标签:function says void echo protected Template 设计模式 Method AbstractClass

简介

父类抽象类定义大的处理流程,部分细节做成抽象方法,留给子类去实现。

如Java的JUnit中, setUp tearDown方法都是留给具体的测试用例来写,Servlet中service处理了一个请求的大部分工作,留下doGet和doPost给业务自定义处理。

另外callback一般分两种方式:同步回调、异步回调,其中同步回调类似于模板方法模式,异步回调类似于观察者模式。

模板方法要基于继承,而回调更类似组合,

角色

  • 抽象模板类

    定义大的处理流程,留出部分方法给具体类实现

  • 具体模板类

    实现具体的处理逻辑

类图

如图,ConcreteClass实现了一些具体逻辑

类图

代码


abstract class AbstractClass
{
    final public function templateMethod(): void
    {
        $this->baseOperation1();
        $this->requiredOperations1();
        $this->baseOperation2();
        $this->hook1();
        $this->requiredOperation2();
        $this->baseOperation3();
        $this->hook2();
    }

    protected function baseOperation1(): void
    {
        echo "AbstractClass says: I am doing the bulk of the work\n";
    }

    protected function baseOperation2(): void
    {
        echo "AbstractClass says: But I let subclasses override some operations\n";
    }

    protected function baseOperation3(): void
    {
        echo "AbstractClass says: But I am doing the bulk of the work anyway\n";
    }

    abstract protected function requiredOperations1(): void;

    abstract protected function requiredOperation2(): void;

    protected function hook1(): void { }

    protected function hook2(): void { }
}

class ConcreteClass1 extends AbstractClass
{
    protected function requiredOperations1(): void
    {
        echo "ConcreteClass1 says: Implemented Operation1\n";
    }

    protected function requiredOperation2(): void
    {
        echo "ConcreteClass1 says: Implemented Operation2\n";
    }
}

class ConcreteClass2 extends AbstractClass
{
    protected function requiredOperations1(): void
    {
        echo "ConcreteClass2 says: Implemented Operation1\n";
    }

    protected function requiredOperation2(): void
    {
        echo "ConcreteClass2 says: Implemented Operation2\n";
    }

    protected function hook1(): void
    {
        echo "ConcreteClass2 says: Overridden Hook1\n";
    }
}

function clientCode(AbstractClass $class)
{
    $class->templateMethod();
}

echo "Same client code can work with different subclasses:\n";
clientCode(new ConcreteClass1());

echo "Same client code can work with different subclasses:\n";
clientCode(new ConcreteClass2());

output:

Same client code can work with different subclasses:
AbstractClass says: I am doing the bulk of the work
ConcreteClass1 says: Implemented Operation1
AbstractClass says: But I let subclasses override some operations
ConcreteClass1 says: Implemented Operation2
AbstractClass says: But I am doing the bulk of the work anyway
Same client code can work with different subclasses:
AbstractClass says: I am doing the bulk of the work
ConcreteClass2 says: Implemented Operation1
AbstractClass says: But I let subclasses override some operations
ConcreteClass2 says: Overridden Hook1
ConcreteClass2 says: Implemented Operation2
AbstractClass says: But I am doing the bulk of the work anyway

本文由mdnice多平台发布

标签:function,says,void,echo,protected,Template,设计模式,Method,AbstractClass
From: https://www.cnblogs.com/caipi/p/17684615.html

相关文章

  • 设计模式——建造者模式
    建造者模式简介1.建造者模式适用于一个具有较多的零件的复杂产品的创建过程,由于需求的变化,组成这个复杂产品的各个零件经常猛烈变化,但是他们的组合方式却相对稳定。他可以使你分步骤创建复杂的对象。建造者模式解决的问题一般当我们遇到一个非常复杂的对象的时候,这个对象里面有......
  • Java设计模式-懒汉模式
    懒汉模式(LazyInitialization)是一种创建型设计模式,它用于在需要时才创建对象。这种模式的主要优点是节省资源,因为它只在真正需要对象时才创建实例。在Java中,懒汉模式可以通过使用静态内部类实现。以下是一个简单的Java懒汉模式示例:publicclassLazySingleton{//创建一个静......
  • 设计模式-建造者模式
    建造者模式是一种创建型的设计模式,将一个对象的创建过程拆分成一个个小的部分,每次决定其中的一个细节,构建出一个复杂对象对象的创建过程被拉长分散,可能会经历一系列的复杂决策,最终才会形成我们需要的对象对象拥有多个参数,或者拥有包含多个参数的构造函数,通过建造......
  • 结构型设计模式-组合(对象树) Composite
    简介组合模式又叫对象树,将对象按照树形结构串起来,呈现出局部和整体相同的特性。树中每个节点都由两部分组成,首先节点有自己的业务数据,其次节点内可以含有子节点集合。比如盒子中可以放物品,也可以放其他小盒子,小盒子里又可以放物品和其他更小的盒子。当计算盒子的物品价格时,只......
  • 结构型设计模式-桥接(模块化) Bridge
    简介桥接模式可将一系列紧密相关的、水平等级的类,转变为组合关系,形成垂直等级关系。如抽象类Color、Shape,分别有RedColor、BlueColor、CircleShape、SquareShape的实现类,那么想创建红色方形,则可以将Shape类中持有Color引用,动态向Shape中注入Color实现即可。否则分别......
  • 结构型设计模式-适配器 Adapter
    结构型设计模式-适配器Adapterdate:April13,2021slug:design-pattern-adapterstatus:Publishedtags:设计模式type:Page简介适配器模式是一种结构型设计模式,它能使接口不兼容的对象能够相互合作角色Client接口/Target目标接口用户使用的接口Adaptee被......
  • 创建型设计模式-原型 Prototype
    简介原型模式支持按照一个对象为模板,创建出另一个一模一样的对象。简单说就是把A对象的属性,都赋值到B上,注意必须是深拷贝,即clone后的AB关联的对象是不同的对象。角色抽象原型类定义clone方法具体实现类实现clone方法类图代码classPrototype{p......
  • 创建型设计模式-单例 Singleton
    简介全局共用一个对象,好处是对象只实例化一次,减少资源占用角色单例类返回本类的唯一一个实例代码classSingleton{privatestatic$instances=[];protectedfunction__construct(){}protectedfunction__clone(){}publicfunction__wa......
  • 学习笔记-设计模式-创建型模式-工厂模式
    工厂模式工厂模式是一种创建者设计模式,细分之下可以分成三类简单工厂模式,工厂方法模式和抽象工厂模式。简单工厂模式最简单的工厂模式,它采用静态方法的方式来决定应该应该生产什么商品。publicclassStoreFactory{publicstaticICommoditygetCommodityService(Integ......
  • Template Pattern —— Behavioral Class
    HookMethod钩子方法(HookMethod)之所以被称为“钩子”,是因为它在算法或流程中提供了一个“钩子”,允许子类在特定的点上“钩入”自己的实现逻辑,从而影响算法的行为或流程的执行。它类似于一个挂钩、锚点,所以叫Hookmethod,它允许子类插入自定义的代码来改变或扩展算法的功能。T......