设计模式——命令模式

设计模式——命令模式

1-  命令模式的定义

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

No BB,Show Code!

2-  命令模式实现代码

创建Command接口:

package designPattern.test.command;

/**
 * 命令接口
 */
public interface Command<T> {


    /**
     * 命令执行方法
     */
    void execute(T t);
}

定义命令Command操作的业务bean——Student,代码如下:

package designPattern.test.command;

import java.util.Date;

/**
 * 学生类
 */
public class Student {

    //学号
    private Long id;

    //姓名
    private String name;

    //性别:1-男,0-女
    private Byte gender;

    //出生日期
    private Date birthday;

    public Student(Long id, String name, Byte gender, Date birthday) {
        this.id = id;
        this.name = name;
        this.gender = gender;
        this.birthday = birthday;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Byte getGender() {
        return gender;
    }

    public void setGender(Byte gender) {
        this.gender = gender;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        if (id != null ? !id.equals(student.id) : student.id != null) return false;
        if (name != null ? !name.equals(student.name) : student.name != null) return false;
        if (gender != null ? !gender.equals(student.gender) : student.gender != null) return false;
        return birthday != null ? birthday.equals(student.birthday) : student.birthday == null;

    }

    @Override
    public int hashCode() {
        int result = id != null ? id.hashCode() : 0;
        result = 31 * result + (name != null ? name.hashCode() : 0);
        result = 31 * result + (gender != null ? gender.hashCode() : 0);
        result = 31 * result + (birthday != null ? birthday.hashCode() : 0);
        return result;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", gender=" + gender +
                ", birthday=" + birthday +
                '}';
    }
}

创建接口的实现类,表示实际的命令:

InsertCommand:增加一条记录命令

package designPattern.test.command;

import com.google.common.base.Preconditions;

import java.util.List;

/**
 * 表示绘制一个点的命令
 */
public class InsertCommand implements Command<Student> {

    private final List<Student> list;

    public InsertCommand(List<Student> list) {
        this.list = list;
    }


    @Override
    public void execute(Student student) {
        Preconditions.checkNotNull(student);
        Preconditions.checkNotNull(student.getId());
        Preconditions.checkNotNull(student.getName());
        Preconditions.checkNotNull(student.getGender());
        Preconditions.checkNotNull(student.getBirthday());
        System.out.println("模拟写入一条数据到student表中:" + student);
        list.add(student);
    }
}

DeleteCommand:根据Id删除一条记录命令

package designPattern.test.command;

import com.google.common.base.Preconditions;

import java.util.List;

/**
 * 删除命令
 */
public class DeleteCommand implements Command<Student> {

    private final List<Student> list;

    public DeleteCommand(List<Student> list) {
        this.list = list;
    }

    @Override
    public void execute(Student student) {
        Preconditions.checkNotNull(student);
        Preconditions.checkNotNull(student.getId());
        System.out.println("模拟删除student" + student);
        for (Student stu : list) {
            if (stu.getId().equals(student.getId())) {
                list.remove(stu);
                return;
            }
        }
    }
}

UpdateCommand:根据id更新一条记录

package designPattern.test.command;

import com.google.common.base.Preconditions;
import org.apache.commons.collections4.CollectionUtils;

import java.util.List;

/**
 * 修改命令:只能修改一条,根据id修改
 */
public class UpdateCommand implements Command<Student> {

    private final List<Student> list;

    public UpdateCommand(List<Student> list) {
        this.list = list;
    }

    @Override
    public void execute(Student student) {
        Preconditions.checkNotNull(student);
        Preconditions.checkNotNull(student.getId());
        System.out.println("模拟修改student" + student);
        if (CollectionUtils.isEmpty(list)) {
            System.out.println("list为空");
            return;
        }
        System.out.println("模拟修改操作" + student);
        for (Student stu : list) {
            if (stu.getId().equals(student.getId())) {
                stu.setName(student.getName());
                stu.setGender(student.getGender());
                stu.setBirthday(student.getBirthday());
                break;
            }
        }
    }
}

SelectCommand:根据id查询记录命令

package designPattern.test.command;

import com.google.common.base.Preconditions;
import org.apache.commons.collections4.CollectionUtils;

import java.util.List;

/**
 * 查询命令
 */
public class SelectCommand implements Command<Student> {

    private final List<Student> list;

    public SelectCommand(List<Student> list) {
        this.list = list;
    }

    @Override
    public void execute(Student student) {
        Preconditions.checkNotNull(student);
        Preconditions.checkNotNull(student.getId());
        //只能根据学号查询
        if (CollectionUtils.isEmpty(list)) {
            System.out.println("List为空");
            return;
        }
        for (Student stu : list) {
            if (stu.getId().equals(student.getId())) {
                System.out.println("查询出student:" + stu);
                return;
            }
        }
        System.out.println("未查询到" + student.getId() + "对应的student");
    }
}

3-  测试

测试代码如下:

package designPattern.test.command;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 命令模式测试
 */
public class CommandTest {

    @Test
    public void testCommand() {
        List<Student> studentList = new ArrayList<>();
        new InsertCommand(studentList).execute(new Student(1001l, "aaa", (byte) 1, new Date()));
        new InsertCommand(studentList).execute(new Student(1002l, "bbb", (byte) 0, new Date()));
        new InsertCommand(studentList).execute(new Student(1003l, "ccc", (byte) 1, new Date()));
        new InsertCommand(studentList).execute(new Student(1004l, "ddd", (byte) 0, new Date()));
        new DeleteCommand(studentList).execute(new Student(1001l, null, null, null));
        new UpdateCommand(studentList).execute(new Student(1002l, "eee", (byte) 0, new Date()));
        new SelectCommand(studentList).execute(new Student(1003l, null, null, null));
        System.out.println();
    }

}

执行结果:

模拟写入一条数据到student表中:Student{id=1001, name='aaa', gender=1, birthday=Sat Mar 31 23:15:21 CST 2018}
模拟写入一条数据到student表中:Student{id=1002, name='bbb', gender=0, birthday=Sat Mar 31 23:15:21 CST 2018}
模拟写入一条数据到student表中:Student{id=1003, name='ccc', gender=1, birthday=Sat Mar 31 23:15:21 CST 2018}
模拟写入一条数据到student表中:Student{id=1004, name='ddd', gender=0, birthday=Sat Mar 31 23:15:21 CST 2018}
模拟删除studentStudent{id=1001, name='null', gender=null, birthday=null}
模拟修改studentStudent{id=1002, name='eee', gender=0, birthday=Sat Mar 31 23:15:24 CST 2018}
模拟修改操作Student{id=1002, name='eee', gender=0, birthday=Sat Mar 31 23:15:24 CST 2018}
查询出student:Student{id=1003, name='ccc', gender=1, birthday=Sat Mar 31 23:15:21 CST 2018}

命令模式的优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去

1. 用户与权限管理模块 角色管理: 学生:查看实验室信息、预约设备、提交耗材申请、参与安全考核 教师:管理课题组预约、审批学生耗材申请、查看本课题组使用记录 管理员:设备全生命周期管理、审核预约、耗材采购与分发、安全检查 用户操作: 登录认证:统一身份认证(对接学号 / 工号系统,模拟实现),支持密码重置 信息管理:学生 / 教师维护个人信息(联系方式、所属院系),管理员管理所有用户 权限控制:不同角色仅可见对应功能(如学生不可删除设备信息) 2. 实验室与设备管理模块 实验室信息管理: 基础信息:实验室编号、名称、位置、容纳人数、开放时间、负责人 功能分类:按学科(计算机实验室 / 电子实验室 / 化学实验室)标记,关联可开展实验类型 状态展示:实时显示当前使用人数、设备运行状态(正常 / 故障) 设备管理: 设备档案:名称、型号、规格、购置日期、单价、生产厂家、存放位置、责任人 全生命周期管理: 入库登记:管理员录入新设备信息,生成唯一资产编号 维护记录:记录维修、校准、保养信息(时间、内容、执行人) 报废处理:登记报废原因、时间,更新设备状态为 "已报废" 设备查询:支持按名称、型号、状态多条件检索,显示设备当前可用情况 3. 预约与使用模块 预约管理: 预约规则:学生可预约未来 7 天内的设备 / 实验室,单次最长 4 小时(可设置) 预约流程:选择实验室→选择设备→选择时间段→提交申请(需填写实验目的) 审核机制:普通实验自动通过,高危实验(如化学实验)需教师审核 使用记录: 签到 / 签退:到达实验室后扫码签到,离开时签退,系统自动记录实际使用时长 使用登记:填写实验内容、设备运行情况(正常 / 异常),异常情况需详细描述 违规管理:迟到 15 分钟自动取消预约,多次违规限制预约权限 4. 耗材与安全管理模块 耗材管理: 耗材档案:名称、规格、数量、存放位置、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值