文章目录
- 模板方法模式
-
- 命令模式
-
- 1.引出命令模式
-
- 2.命令模式解决智能生活项目
-
-
- 1.类图
- 2.代码实现
-
- [1.LightReceiver.java 实现灯具体操作的类](#1.LightReceiver.java 实现灯具体操作的类)
- [2.Command.java 命令接口](#2.Command.java 命令接口)
- [3.LightOnCommand.java 开灯命令,构造器聚合LightReceiver,调用对象逻辑](#3.LightOnCommand.java 开灯命令,构造器聚合LightReceiver,调用对象逻辑)
- [4.LightOffCommand.java 关灯命令,构造器聚合LightReceiver,调用对象逻辑](#4.LightOffCommand.java 关灯命令,构造器聚合LightReceiver,调用对象逻辑)
- [5.NoCommand.java 空命令,即空执行,用于初始化每个按钮](#5.NoCommand.java 空命令,即空执行,用于初始化每个按钮)
- [6.RemoteController.java 相当于遥控器,聚合所有命令](#6.RemoteController.java 相当于遥控器,聚合所有命令)
- [7.Client.java 调用命令](#7.Client.java 调用命令)
- 3.命令模式在JdbcTemplate的使用
模板方法模式
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的使用