首页 > 其他分享 >模板模式:一种体现多态的设计模式

模板模式:一种体现多态的设计模式

时间:2023-05-30 12:07:34浏览次数:32  
标签:name 子类 void 多态 设计模式 方法 public 模板

0x01:模板模式

模板模式(Template),又叫模板方法模式(Template Method),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需重写方法实现,但调用将以抽象类中定义的方式进行。模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤。UML类图如下:

模板模式:一种体现多态的设计模式_抽象类

 主要包含如下角色:

  • AbstractClass(抽象模板类):在抽象类中定义了一系列基本操作,这些基本操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。同时,在抽象类中实现了一个模板方法(Template Method),用于定义一个算法的框架,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。
  • ConcreteCalss(具体模板子类):它是抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。

抽象模板类:定义一个模板方法来组合sing()和dance()两个方法形成一个算法,然后让子类重定义这两个方法。

public abstract class AbstractClass {

    public abstract void sing(String name);

    public abstract void dance(String name);

    public void templateMethd(String name) {
        sing(name);
        dance(name);
    }

}

具体模板类:这里定义两个具体模板类,ConcreteClassLiMing及ConcreteClassLiuDeHua来进行测试,继承抽象模板类,实现具体方法。

public class ConcreteClassLiMing extends AbstractClass {

    @Override
    public void sing(String name) {
        System.out.println(name + "在唱歌");
    }

    @Override
    public void dance(String name) {
        System.out.println(name + "在跳舞");
    }

}

public class ConcreteClassLiuDeHua extends AbstractClass {

    @Override
    public void sing(String name) {
        System.out.println(name + "在唱歌");
    }

    @Override
    public void dance(String name) {
        System.out.println(name + "在跳舞");
    }

}

Client客户端:

public class Client {

    public static void main(String[] args) {
        AbstractClass abstractClass = null;

        abstractClass = new ConcreteClassLiMing();
        abstractClass.templateMethd("黎明");

        abstractClass = new ConcreteClassLiuDeHua();
        abstractClass.templateMethd("刘德华");
    }

}

通过以上代码就实现了一个简单的模板模式,模板模式的优点:封装不变部分,扩展可变部分。提取公共代码,便于维护。行为由父类控制,子类实现;缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

0x02:JDK中的模板模式

如果有了解过java.util.concurrent.locks包的AbstractQueuedSynchronizer类(简称AQS),就会发现AbstractQueuedSynchronizer类(同步器)是一个非常经典的模板模式。如果需要自定义同步器,一般方法是:继承AQS,并重写指定方法(无非是按照自己定义的规则对state的获取与释放);将AQS组合在自定义同步组件的实现中,并调用模板方法,而这些模板方法会调用重写的方法。

//该线程是否正在独占资源。只有用到condition才需要去实现它。
isHeldExclusively();
//独占方式。尝试获取资源,成功则返回true,失败则返回false。
tryAcquire(int);
//独占方式。尝试释放资源,成功则返回true,失败则返回false。
tryRelease(int);
共享方式。尝试获取资源。负数表示失败;0表示成功,但没有剩余可用资源;正数表示成功,且有剩余资源。
tryAcquireShared(int);
共享方式。尝试释放资源,成功则返回true,失败则返回false。
tryReleaseShared(int);

默认情况下,以上这些方法都抛出 UnsupportedOperationException。这些方法的实现必须是内部线程安全的,并且通常应该简短而不是阻塞。AQS类中的其他方法都是final ,所以无法被其他类使用,只有这几个方法可以被其他类使用。

0x03:Spring中的模板模式

Spring作为一个特优秀的框架,底层大量使用模板模式。以Spring的事务管理器来讲下Spring中的模板模式。

AbstractPlatformTransactionManager是Spring中的模板抽象类,它的继承关系图如下:

模板模式:一种体现多态的设计模式_抽象类_02

实现了PlatformTransactionManager接口,重载了接口中的方法。

  • 模板方法:事务管理器中抽象类中的模板方法不止一个,比如以下两个方法
//提交事务
public final void commit()

//获取TransactionStatus
public final TransactionStatus getTransaction()

这两个方法都对于自己要实现的逻辑搭建了一个骨架,主要的功能是由抽象方法完成,由子类来完成。

  • 抽象方法事务管理器抽象类中的抽象方法定义了多个,分别用于处理不同的业务逻辑,由子类实现其中具体的逻辑。
//提交事务
protected abstract void doCommit(DefaultTransactionStatus status);

//回滚事务
protected abstract void doRollback(DefaultTransactionStatus status);

//开始事务
protected abstract void doBegin(Object transaction, TransactionDefinition definition)

//获取当前的事务对象
protected abstract Object doGetTransaction()

抽象方法的定义便于子类去扩展,在保证算法逻辑不变的情况下,子类能够定制自己的实现。

  • 具体子类:其中有DataSourceTransactionManager、JtaTransactionManager、RabbitTransactionManager等,类继承关系如下:

模板模式:一种体现多态的设计模式_java_03

另外还有JdbcTemplate、JpaTemplate等使用了模板模式。其他需要大家慢慢去发现,去学习~~~

书山有路勤为径,学海无涯苦作舟!

Java乐园

模板模式:一种体现多态的设计模式_java_04

模板模式:一种体现多态的设计模式_多态_05

标签:name,子类,void,多态,设计模式,方法,public,模板
From: https://blog.51cto.com/u_13538361/6377678

相关文章

  • 面相对象设计模式目录
    写了个具体模式代码实现示例(c#):https://gitee.com/idasheng/DesignPattenDemo更新于:2023.5.30......
  • 2.2. 继承与多态
    继承和多态是面向对象编程的两个重要概念,它们使得我们可以创建更加通用、可扩展的代码。2.2.1.继承继承是一种创建新类的方式,新类(子类)从现有类(父类)继承属性和方法。子类可以重写或扩展父类的功能。要创建一个子类,可以使用 extends 关键字:classSubClassNameextendsParent......
  • Java中的多态性
    多态性是面向对象编程的一项核心概念之一,它允许程序员使用不同的方式来处理不同的对象类型,而不必知道实际对象类型。在Java中,多态性可以通过继承和接口来实现。继承的多态性在Java中,多态性可以通过继承来实现。子类可以继承父类的方法和属性,并且还可以覆盖它们,使得它们在子类中......
  • Wpf基础入门——模板和样式(Template&Style)
    本篇文章学习于:刘铁猛老师《深入浅出WPF》什么是模板?在WPF中,通过引入模板(Template)微软将数据和算法的“内容”与“形式”解耦了。WPF中的Template分为两大类:ControlTemplate是算法内容的表现形式,一个控件怎样组织其内部结构才能让它更符合业务逻辑、让用户操作起来更舒服就......
  • Factory Method Pattern 工厂方法模式简介与 C# 示例【创建型】【设计模式来了】
    〇、简介1、什么是工厂方法模式?一句话解释:  实体类和工厂类均为单独实现,不影响已实现的类,方便扩展。工厂方法模式(FactoryMethodPattern)是一种创建型模式,它允许客户端通过工厂方法来创建对象,而不是直接使用构造函数。这样可以让客户端代码更加灵活,同时保持实现的独立性。工......
  • 面向对象设计领域中的参数多态,包含多态,过载多态和强制多态
    参数多态参数多态是指在面向对象编程中,方法的参数可以接受不同类型的对象,并根据实际传递的对象类型来执行不同的操作。它是多态的一种应用形式,通过参数的多态性,可以实现灵活的代码设计和重用。使用场景:当方法需要操作的对象类型不确定时,可以使用多态来接受不同类型的对象,减少......
  • super()在 Django 模板视图中使用
    Django模板视图用于呈现HTML模板并将数据传递给它们以供显示。super()您可以在Django模板视图中使用,轻松地从父模板视图继承属性和方法,并根据需要自定义或扩展它们。Django模板视图的一种常见用法super()是在get_context_data方法中,该方法用于将数据传递给模板以进行渲染。......
  • 关于模板方法设计:抽象类
       ......
  • 微信小程序 - WXML 模板语法
    【黑马程序员前端微信小程序开发教程,微信小程序从基础到发布全流程_企业级商城实战(含uni-app项目多端部署)】https://www.bilibili.com/video/BV1834y1676P/?p=19&share_source=copy_web&vd_source=03c1dc52eeb3747825ecad0412c18ab1真的讲的很细致WXML模板语法数据绑定1.......
  • 过滤器链及责任链设计模式
    过滤器链:在JavaWeb应用中,多个过滤器的执行顺序是有规定的,称之为过滤器链。按照过滤器链的规定,多个过滤器会按照它们在web.xml文件中配置的先后顺序依次执行。具体来说,假设一个请求需要经过三个过滤器,分别为Filter1、Filter2和Filter3,那么它们的执行顺序为:客户端发送请......