分享

10. 命令模式

 黎可图书馆 2013-09-09
一. 概念
Command(命令模式):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。

二. 角色
客户(Client)角色:创建了一个具体命令(ConcreteCommand)对象并确定其接收者。
命令(Command)角色:声明了一个给所有具体命令类的抽象接口。
具体命令(ConcreteCommand)角色:定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。
请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。
接收者(Receiver)角色:负责具体实施和执行一个请求。

三. 实现
假设一个老师可以命令学生执行完成作业和叫家长两项操作,而告知学生的手段是通过班长转达,那么这就形成了命令模式,老师为客户角色,学生为接收者,班长则为请求者角色。

Teacher.java
public 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.java
public class Student {
public void finishHomework() {
System.out.println("把作业做完");
}
public void callParent(){
System.out.println("把家长叫过来");
}
}
学生类,里面有完成作业和叫家长两个方法。

Monitor.java
public 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.java
public interface Command {
public void execute();
}
命令接口。

CallParentCommand.java
public class CallParentCommand implements Command {
private Student student;
public CallParentCommand(Student student){
this.student = student;
}
@Override
public void execute() {
student.callParent();
}

}
叫家长具体命令,其引用了Student类,并调用接收者的操作。

FinishHomeworkCommand.java
public class FinishHomeworkCommand implements Command {
private Student student;
public FinishHomeworkCommand(Student student){
this.student = student;
}
@Override
public void execute() {
student.finishHomework();
}
}
同上

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多