命令模式
命令模式是对命令的封装,每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式解耦了请求方与接收方,请求方只需要请求执行命令,不用关心命令时怎样被接收,怎样被操作以及是否被执行等。命令模式属于行为型模式。
角色:
- 接收者角色(Receiver):负责具体实施或执行一个请求。
- 命令角色(Command):定义需要执行的所有命令行为。
- 具体命令角色(ConcreteCommand):该类内部维护一个接收者(Invoker),在其execute()方法中调用Invoker的相关方法。
- 请求者角色(Invoker):接收客户端的命令,并执行命令。
command角色就是作为Receiver与Invoker的中间件,解耦了彼此。
举例:播放器,具有播放功能,拖动进度条功能,停止播放器功能,暂停功能。
接收者角色,播放器内核类:
package com.jdwa.command;
public class GPlayer {
public void play(){
System.out.println("正常播放。。。");
}
public void speed(){
System.out.println("拖动进度条。。。");
}
public void stop(){
System.out.println("停止播放。。。");
}
public void pause(){
System.out.println("暂停播放。。。");
}
}
命令角色:
package com.jdwa.command;
public interface IAction {
void excute();
}
具体命令:
package com.jdwa.command;
public class PlayAction implements IAction{
private GPlayer gPlayer;
public PlayAction(GPlayer gPlayer){
this.gPlayer = gPlayer;
}
@Override
public void excute() {
gPlayer.play();
}
}
package com.jdwa.command;
public class SpeedAction implements IAction {
private GPlayer gPlayer;
public SpeedAction(GPlayer gPlayer) {
this.gPlayer = gPlayer;
}
@Override
public void excute() {
gPlayer.speed();
}
}
package com.jdwa.command;
public class StopAction implements IAction {
private GPlayer gPlayer;
public StopAction(GPlayer gPlayer) {
this.gPlayer = gPlayer;
}
@Override
public void excute() {
gPlayer.stop();
}
}
package com.jdwa.command;
public class PauseAction implements IAction {
private GPlayer gPlayer;
public PauseAction(GPlayer gPlayer) {
this.gPlayer = gPlayer;
}
@Override
public void excute() {
gPlayer.pause();
}
}
请求者角色,控制条
package com.jdwa.command;
import java.util.ArrayList;
import java.util.List;
public class Controller {
private List<IAction> actions = new ArrayList<>();
public void addAction(IAction action){
actions.add(action);
}
public void excute(IAction action){
action.excute();
}
public void excutes(){
for (IAction action:actions){
action.excute();
}
actions.clear();
}
}
测试:
package com.jdwa.command;
import java.util.ArrayList;
import java.util.List;
public class Controller {
private List<IAction> actions = new ArrayList<>();
public void addAction(IAction action){
actions.add(action);
}
public void excute(IAction action){
action.excute();
}
public void excutes(){
for (IAction action:actions){
action.excute();
}
actions.clear();
}
}
结果:
正常播放。。。
====组合功能=====
拖动进度条。。。
暂停播放。。。