Java设计模式-模板方法模式(14)

简介: Java设计模式-模板方法模式(14)

行为型模式
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。

今天开始我们讲的是行为型模式中的模板方法模式。老规矩,讲解之前再次熟悉下行为型模式包含:模板方法模式、策略模式、命令模式、职责链模式、状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式。共11种设计模式。

模板方法模式(Template Method)

定义

定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。

解决问题

对某些已确定通用规范进行统一管理,不确定部分交由子类具体实现,但整体行为规范不变。

实现

定义通用规范方法,对于不确定部分设计为抽象方法,由子类进行完成。

结构

主要角色:

抽象类(Abstract Class):提供一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。这些方法的定义如下:

(1)模板方法:定义了算法的骨架,按某种规范调用其包含的基本方法。

(2)基本方法:是整个算法中的部分逻辑。由以下几种类型:

         抽象方法:在抽象类中申明,由具体子类实现。

        具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。

         钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。

具体子类(Concrete Class):实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤。

应用场景:

算法的整体步骤很固定,但其中个别部分易变时,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。

当多个子类存在公共的行为时,可以将其提取出来并集中到一个公共父类中以避免代码重复。首先,要识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。

当需要控制子类的扩展时,模板方法只在特定点调用钩子操作,这样就只允许在这些点进行扩展。

注意:

模板方法一般用final修饰,不许子类修改其行为逻辑。

具体方法一般用private修饰,不许子类重写,但不是必须。

钩子方法可以没有,具体依据设计实现。

优点:

它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。

它在父类中提取了公共的部分代码,便于代码复用。

部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。

缺点:

对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。

父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。

代码实现:披萨接单,制作。

//抽象类 MakeTemplate
public abstract class MakeTemplate {
protected PizzaOrder order;

//具体方法:打印订单
private void orderPrint() {
    System.out.println("-------------订单信息-----------------");
    System.out.println("name: " + order.getName());
    System.out.println("name: " + order.getSize());
    System.out.println("name: " + order.isPepper());
    System.out.println("");
}

//具体方法:制作开始打印
private void startMake() {
    System.out.println("-------------开始制作-----------------");

}

//具体方法:送入烤箱
private void putOven() {
    System.out.println("放入烤箱....... ");
}
//具体方法:结束打印
private void endMake() {
    System.out.println("-------------制作完成-----------------");
    System.out.println("");
}

//抽象方法:具体制作
protected abstract void doMake();


//具体方法:控制时间(子类可重写)
protected void selectTime() {
    System.out.println("默认 烘烤 20分钟......");
}

//模板方法:主方法
public final void make() {
orderPrint();
startMake();
doMake();
if (isPepperMake()) {
System.out.println("放辣椒......");
}
putOven();
selectTime();
endMake();
}

//钩子方法:
protected boolean isPepperMake() {
    return true;
}

}

//具体子类:PizzaMaker
@Data
public class PizzaMaker extends MakeTemplate {

PizzaMaker() {
}

PizzaMaker(PizzaOrder order) {
    this.order = order;
}

@Override
protected void doMake() {
    System.out.println("选择面点......");
    System.out.println("放入规定尺寸模具......");
    System.out.println("加入辅料......");
    System.out.println("进行修饰......");
}

@Override
protected void selectTime() {
    System.out.println("自定义 35分钟 ......");
}

@Override
protected boolean isPepperMake() {
    return order.isPepper();
}

}

​​​​​
//订单信息
@Data
public class PizzaOrder {
private double size;
private String name;
private boolean isPepper;

public void setPepper(boolean pepper) {
    isPepper = pepper;
}

}
//模拟客户端
public class ClientDemo {
public static void main(String[] args) {
PizzaOrder order = new PizzaOrder();
order.setName("甜甜圈披萨");
order.setSize(9.0);
order.setPepper(false);

    MakeTemplate maker = new PizzaMaker(order);
    maker.make();

    System.out.println("---------------订单2------------------");


    PizzaOrder order2 = new PizzaOrder();
    order2.setName("青椒圈披萨");
    order2.setSize(11.0);
    order2.setPepper(true);
    MakeTemplate maker2 = new PizzaMaker(order2);
    maker2.make();
}

}

扩展

在模板方法模式中,基本方法包含:抽象方法、具体方法和钩子方法,正确使用“钩子方法”可以使得子类控制父类的行为。

好了,关于模板方法模式的说明,馆长就先讲到这里。谢谢各位看官!

23 种设计模式不是孤立存在的,很多模式之间存在一定的关联关系,在大的系统开发中常常同时使用多种设计模式,或者模式与模式之间的组合进行生成更加强大的程序功能。

相关文章
|
8月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
1036 157
|
8月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
861 2
|
10月前
|
设计模式 缓存 Java
Java设计模式(二):观察者模式与装饰器模式
本文深入讲解观察者模式与装饰器模式的核心概念及实现方式,涵盖从基础理论到实战应用的全面内容。观察者模式实现对象间松耦合通信,适用于事件通知机制;装饰器模式通过组合方式动态扩展对象功能,避免子类爆炸。文章通过Java示例展示两者在GUI、IO流、Web中间件等场景的应用,并提供常见陷阱与面试高频问题解析,助你写出灵活、可维护的代码。
|
8月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
2254 35
|
8月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
618 8
|
设计模式 缓存 安全
【高薪程序员必看】万字长文拆解Java并发编程!(8):设计模式-享元模式设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的经典对象复用设计模式-享元模式,废话不多说让我们直接开始。
262 0
|
10月前
|
设计模式 安全 Java
Java设计模式(一):单例模式与工厂模式
本文详解单例模式与工厂模式的核心实现及应用,涵盖饿汉式、懒汉式、双重检查锁、工厂方法、抽象工厂等设计模式,并结合数据库连接池与支付系统实战案例,助你掌握设计模式精髓,提升代码专业性与可维护性。
|
10月前
|
设计模式 XML 安全
Java枚举(Enum)与设计模式应用
Java枚举不仅是类型安全的常量,还具备面向对象能力,可添加属性与方法,实现接口。通过枚举能优雅实现单例、策略、状态等设计模式,具备线程安全、序列化安全等特性,是编写高效、安全代码的利器。
|
设计模式 数据采集 算法
【设计模式】【行为型模式】模板方法模式(Template Method)
一、入门 1.1、什么是模板方法模式? 模板模式(Template Method Pattern)是一种行为设计模式,它定义了一个算法的框架,并允许子类在不改变算法结构的情况下重新定义算法的某些步骤。
373 13
|
设计模式 SQL 算法
「全网最细 + 实战源码案例」设计模式——模板方法模式
模板方法模式是一种行为型设计模式,定义了算法的骨架并在父类中实现不变部分,将可变部分延迟到子类实现。通过这种方式,它避免了代码重复,提高了复用性和扩展性。具体步骤由抽象类定义,子类实现特定逻辑。适用于框架设计、工作流和相似算法结构的场景。优点包括代码复用和符合开闭原则,缺点是可能违反里氏替换原则且灵活性较低。
485 7
「全网最细 + 实战源码案例」设计模式——模板方法模式