二. 角色Command(命令模式):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
客户(Client)角色:创建了一个具体命令(ConcreteCommand)对象并确定其接收者。命令(Command)角色:声明了一个给所有具体命令类的抽象接口。具体命令(ConcreteCommand)角色:定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。接收者(Receiver)角色:负责具体实施和执行一个请求。
假设一个老师可以命令学生执行完成作业和叫家长两项操作,而告知学生的手段是通过班长转达,那么这就形成了命令模式,老师为客户角色,学生为接收者,班长则为请求者角色。Teacher.javapublic class Teacher {public static void main(String[] args) {Monitor monitor = new Monitor();Student like = new Student();Student sb = new Student();Command callParentCommand = new CallParentCommand(sb);Command finishHomeWorkCommand = new FinishHomeworkCommand(like);monitor.addCommands(callParentCommand, finishHomeWorkCommand);monitor.action();monitor.undo(callParentCommand);monitor.action();}}指明了接收者分别为like 和 sb,并利用班长将具体命令组成集合统一执行。Student.javapublic class Student {public void finishHomework() {System.out.println("把作业做完");}public void callParent(){System.out.println("把家长叫过来");}}学生类,里面有完成作业和叫家长两个方法。Monitor.javapublic class Monitor {private List<Command> commands = new ArrayList<Command>();public void addCommands(Command... commands){for(Command command : commands){this.commands.add(command);}}public void action(){for(Command command : commands){command.execute();}}public void undo(Command command){System.out.println("饶了你");this.commands.remove(command);}}班长类,其主要负责添加、删除命令并执行。Command.javapublic interface Command {public void execute();}命令接口。CallParentCommand.javapublic class CallParentCommand implements Command {private Student student;public CallParentCommand(Student student){this.student = student;}@Overridepublic void execute() {student.callParent();}}叫家长具体命令,其引用了Student类,并调用接收者的操作。FinishHomeworkCommand.javapublic class FinishHomeworkCommand implements Command {private Student student;public FinishHomeworkCommand(Student student){this.student = student;}@Overridepublic void execute() {student.finishHomework();}}同上
联系客服