模板方法模式和命令模式

文章目录

模板方法模式

1.引出模板模式

1.豆浆制作问题
2.基本介绍
3.原理类图

2.豆浆制作代码实现

1.类图
2.SoyaMilk.java 豆浆的抽象类
java 复制代码
package com.sun;

/**
 * Description: 模板类
 * @Author sun
 * @Create 2024/6/10 19:11
 * @Version 1.0
 */
public abstract class SoyaMilk {

    // 模板方法写成final,不被子类覆盖
    final void make() {
        // 定义步骤
        // 交给子类去挑选材料
        select();

        // 添加材料和打碎豆子
        add();
        beat();
    }

    // 选择材料,是抽象方法,具体加什么材料由子类对象指定
    abstract void select();

    // 添加材料
    void add() {
        System.out.println("添加豆子");
    }

    // 打碎豆子
    void beat() {
        System.out.println("放到豆浆机去打碎");
    }
}
3.PeanutSoyaMilk.java 花生豆浆
java 复制代码
package com.sun;

/**
 * Description:
 * @Author sun
 * @Create 2024/6/10 19:19
 * @Version 1.0
 */
public class PeanutSoyaMilk extends SoyaMilk{
    @Override
    void select() {
        System.out.println("加入上好的花生豆");
    }
}
4.RedBeanSoyaMilk.java 红豆豆浆
java 复制代码
package com.sun;

/**
 * Description:
 * @Author sun
 * @Create 2024/6/10 19:18
 * @Version 1.0
 */
public class RedBeanSoyaMilk extends SoyaMilk{
    @Override
    void select() {
        System.out.println("加入上好的红豆");
    }
}
5.Client.java
java 复制代码
package com.sun;

/**
 * Description:
 * @Author sun
 * @Create 2024/6/10 19:20
 * @Version 1.0
 */
public class Client {
    public static void main(String[] args) {
        System.out.println("制作红豆豆浆");
        SoyaMilk soyaMilk = new RedBeanSoyaMilk();
        soyaMilk.make();
        System.out.println("制作花生豆浆");
        SoyaMilk soyaMilk1 = new PeanutSoyaMilk();
        soyaMilk1.make();
    }
}
6.结果

3.钩子方法

1.基本介绍
2.代码实现
1.SoyaMilk.java 添加钩子方法,由子类决定是否要重写
2.NoSoyaMilk.java 新的子类,不加配料
java 复制代码
package com.sun;

/**
 * Description:
 * @Author sun
 * @Create 2024/6/10 19:32
 * @Version 1.0
 */
public class NoSoyaMilk extends SoyaMilk{
    @Override
    void select() {
        System.out.println("选择豆子,不准备加配料");
    }

    @Override
    boolean customerWantCondiments() {
        // 返回false就意味着不加配料
        return false;
    }
}
3.Client.java
java 复制代码
package com.sun;

/**
 * Description:
 * @Author sun
 * @Create 2024/6/10 19:20
 * @Version 1.0
 */
public class Client {
    public static void main(String[] args) {
        System.out.println("制作红豆豆浆");
        SoyaMilk soyaMilk = new RedBeanSoyaMilk();
        soyaMilk.make();
        System.out.println("制作花生豆浆");
        SoyaMilk soyaMilk1 = new PeanutSoyaMilk();
        soyaMilk1.make();
        System.out.println("制作不加配料的豆浆");
        SoyaMilk soyaMilk2 = new NoSoyaMilk();
        soyaMilk2.make();
    }
}
4.结果

4.模板方法在IOC中的应用

命令模式

1.引出命令模式

1.智能生活项目
2.命令模式基本介绍
3.原理类图

2.命令模式解决智能生活项目

1.类图
2.代码实现
1.LightReceiver.java 实现灯具体操作的类
java 复制代码
package com.sun;

/**
 * Description: 实现灯具体操作的类
 * @Author sun
 * @Create 2024/6/11 21:00
 * @Version 1.0
 */
public class LightReceiver {

    public void on() {
        System.out.println("点灯打开了");
    }

    public void off() {
        System.out.println("电灯关闭了");
    }
}
2.Command.java 命令接口
java 复制代码
package com.sun;

/**
 * Description:
 * @Author sun
 * @Create 2024/6/11 20:58
 * @Version 1.0
 */
public interface Command {

    // 执行操作
    void execute();
    // 撤销操作
    void undo();
}
3.LightOnCommand.java 开灯命令,构造器聚合LightReceiver,调用对象逻辑
java 复制代码
package com.sun;

/**
 * Description: 开灯命令
 * @Author sun
 * @Create 2024/6/11 20:59
 * @Version 1.0
 */
public class LightOnCommand implements Command{

    // 构造器聚合LightReceiver,调用对象逻辑
    LightReceiver lightReceiver;

    public LightOnCommand(LightReceiver lightReceiver) {
        this.lightReceiver = lightReceiver;
    }

    @Override
    public void execute() {
        lightReceiver.on();
    }

    @Override
    public void undo() {
        lightReceiver.off();
    }
}
4.LightOffCommand.java 关灯命令,构造器聚合LightReceiver,调用对象逻辑
java 复制代码
package com.sun;

/**
 * Description: 关灯命令
 * @Author sun
 * @Create 2024/6/11 21:06
 * @Version 1.0
 */
public class LightOffCommand implements Command{

    // 构造器聚合LightReceiver,调用对象逻辑
    LightReceiver lightReceiver;

    public LightOffCommand(LightReceiver lightReceiver) {
        this.lightReceiver = lightReceiver;
    }

    @Override
    public void execute() {
        lightReceiver.off();
    }

    @Override
    public void undo() {
        lightReceiver.on();
    }
}
5.NoCommand.java 空命令,即空执行,用于初始化每个按钮
java 复制代码
package com.sun;

/**
 * Description: 空命令,即空执行,用于初始化每个按钮,调用空命令时,对象什么都不做
 * @Author sun
 * @Create 2024/6/11 21:07
 * @Version 1.0
 */
public class NoCommand implements Command{

    @Override
    public void execute() {

    }

    @Override
    public void undo() {

    }
}
6.RemoteController.java 相当于遥控器,聚合所有命令
java 复制代码
package com.sun;

/**
 * Description:
 * @Author sun
 * @Create 2024/6/11 21:09
 * @Version 1.0
 */
public class RemoteController {

    // 开按钮的命令数组
    Command[] onCommands;
    // 关按钮的命令数组
    Command[] offCommands;
    // 执行撤销的命令
    Command undoCommand;

    // 构造器,完成对按钮的初始化
    public RemoteController() {
        // 初始化数量
        onCommands = new Command[5];
        offCommands = new Command[5];
        // 初始化为空命令
        for (int i = 0; i < 5; i++) {
            onCommands[i] = new NoCommand();
            offCommands[i] = new NoCommand();
        }
    }

    // 设置按钮的命令
    public void setCommand(int no, Command onCommand, Command offCommand) {
        this.onCommands[no] = onCommand;
        this.offCommands[no] = offCommand;
    }

    // 按下开的按钮
    public void onButtonWasPushed(int no) {
        onCommands[no].execute();
        // 记录这次的操作,用于撤销
        undoCommand = onCommands[no];
    }

    // 按下关的按钮
    public void offButtonWasPushed(int no) {
        offCommands[no].execute();
        // 记录这次的操作,用于撤销
        undoCommand = offCommands[no];
    }

    // 按下撤销按钮
    public void undoButtonWasPushed() {
        undoCommand.undo();
    }

}
7.Client.java 调用命令
java 复制代码
package com.sun;

/**
 * Description:
 * @Author sun
 * @Create 2024/6/11 21:29
 * @Version 1.0
 */
public class Client {
    public static void main(String[] args) {
        // 自下而上,进行聚合
        // 创建一个电灯
        LightReceiver lightReceiver = new LightReceiver();
        // 将电灯聚合到点灯具体的命令,使其可以使用
        LightOffCommand lightOffCommand = new LightOffCommand(lightReceiver);
        LightOnCommand lightOnCommand = new LightOnCommand(lightReceiver);
        // 先初始化一个遥控器,使其都聚合的空的对象逻辑
        RemoteController remoteController = new RemoteController();
        // 设置命令
        remoteController.setCommand(0, lightOnCommand, lightOffCommand);
        // 执行命令
        remoteController.onButtonWasPushed(0);
        remoteController.offButtonWasPushed(0);
        // 撤销命令
        remoteController.undoButtonWasPushed();
    }
}

3.命令模式在JdbcTemplate的使用

相关推荐
听麟5 小时前
HarmonyOS 6.0+ 跨端智慧政务服务平台开发实战:多端协同办理与电子证照管理落地
笔记·华为·wpf·音视频·harmonyos·政务
前端世界5 小时前
从单设备到多设备协同:鸿蒙分布式计算框架原理与实战解析
华为·harmonyos
前端不太难7 小时前
HarmonyOS App 工程深水区:从能跑到可控
华为·状态模式·harmonyos
ujainu8 小时前
《零依赖!用 Flutter + OpenHarmony 构建鸿蒙风格临时记事本(一):内存 CRUD》
flutter·华为·openharmony
听麟8 小时前
HarmonyOS 6.0+ PC端虚拟仿真训练系统开发实战:3D引擎集成与交互联动落地
笔记·深度学习·3d·华为·交互·harmonyos
江湖有缘8 小时前
基于华为openEuler系统部署Gitblit服务器
运维·服务器·华为
前端世界9 小时前
从一个 entry 写到十几个模块:鸿蒙模块化开发的真实落地方案(含可运行 Demo)
华为·harmonyos
听麟9 小时前
HarmonyOS 6.0+ APP AR文旅导览系统开发实战:空间定位与文物交互落地
人工智能·深度学习·华为·ar·wpf·harmonyos
●VON10 小时前
HarmonyOS应用开发实战(基础篇)Day01-《ArkTS基本知识》
学习·华为·harmonyos·鸿蒙·von
BlackWolfSky10 小时前
鸿蒙高级课程笔记2—应用性能优化
笔记·华为·harmonyos