命令模式(行为类)

来源:互联网 发布:linux系统切换用户 编辑:程序博客网 时间:2024/06/13 09:20

UML

这里写图片描述

  • receiver角色: 该角色是干活的角色,命令传递到这里是应该被执行的
  • Command角色: 需要执行的命令都需要在这里执行
  • Invoker角色: 接收到命令,并执行命令

介绍

  • 意图: 将一个请求封装为一个命令,从而使得不同的请求对客户参数化
  • 优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
  • 缺点: 使用命令模式可能会导致某些系统有过多的具体命令类。
  • 用途: 模拟CMD

例子

UML

这里写图片描述

介绍

遥控器控制灯,立体声等的亮,暗

代码

Control

public interface Control {    public void onButton(int slot);    public void offButton(int slot);    public void undoButton();}

Command(Command)

public interface Command {    public void execute();    public void undo();}

CommandModeControl (Invoker)

import java.util.Stack;import com.java.jikexueyuan.commandmode.Control;import com.java.jikexueyuan.commandmode.device.Light;import com.java.jikexueyuan.commandmode.device.Stereo;public class CommandModeControl implements Control{    private Command[] onCommands;    private Command[] offCommands;    private Stack<Command> stack=new Stack<Command>();    public CommandModeControl()    {        onCommands=new Command[5];        offCommands=new Command[5];         Command noCommand=new NoCommand();         for(int i=0,len=onCommands.length;i<len;i++)         {             onCommands[i]=noCommand;             offCommands[i]=noCommand;         }    }    public void setCommand(int slot,Command onCommand,Command offCommand)    {        onCommands[slot]=onCommand;         offCommands[slot]=offCommand;    }    @Override    public void onButton(int slot) {        onCommands[slot].execute();        stack.push(onCommands[slot]);    }    @Override    public void offButton(int slot) {        offCommands[slot].execute();        stack.push(offCommands[slot]);    }    @Override    public void undoButton() {        // TODO Auto-generated method stub        stack.pop().undo();    }}

LightOnCommand (ConcreteCommand)

import com.java.jikexueyuan.commandmode.device.Light;public class LightOnCommand implements Command {    private Light light;    public LightOnCommand(Light light)    {        this.light=light;    }    @Override    public void execute() {        // TODO Auto-generated method stub        light.On();    }    @Override    public void undo() {        // TODO Auto-generated method stub        light.Off();    }}

LightOffCommand (ConcreteCommand)

public class LightOffCommand implements Command {    private Light light;    public LightOffCommand(Light light)    {        this.light=light;    }    @Override    public void execute() {        // TODO Auto-generated method stub        light.Off();    }    @Override    public void undo() {        // TODO Auto-generated method stub        light.On();    }}

StereoAddVolCommand(ConcreteCommand)

public class StereoAddVolCommand implements Command {    private Stereo setreo;    public StereoAddVolCommand(Stereo setreo)    {        this.setreo=setreo;    }    @Override    public void execute() {        // TODO Auto-generated method stub    int vol=    setreo.GetVol();    if(vol<11)    {        setreo.SetVol(++vol);    }    }    @Override    public void undo() {        // TODO Auto-generated method stub    int vol=    setreo.GetVol();    if(vol>0)    {        setreo.SetVol(--vol);    }    }}

StereoOffCommand(ConcreteCommand)

public class StereoOffCommand implements Command {    private Stereo setreo;    public StereoOffCommand(Stereo setreo)    {        this.setreo=setreo;    }    @Override    public void execute() {        // TODO Auto-generated method stub        setreo.Off();    }    @Override    public void undo() {        // TODO Auto-generated method stub        setreo.On();        setreo.SetCd();    }}

StereoOnCommand(ConcreteCommand)

public class StereoOnCommand implements Command {    private Stereo setreo;    public StereoOnCommand(Stereo setreo)    {        this.setreo=setreo;    }    @Override    public void execute() {        // TODO Auto-generated method stub        setreo.On();        setreo.SetCd();    }    @Override    public void undo() {        // TODO Auto-generated method stub        setreo.Off();    }}

StereoSubVolCommand(ConcreteCommand)

public class StereoSubVolCommand implements Command {    private Stereo setreo;    public StereoSubVolCommand(Stereo setreo)    {        this.setreo=setreo;    }    @Override    public void execute() {        // TODO Auto-generated method stub    int vol=    setreo.GetVol();    if(vol>0)    {        setreo.SetVol(--vol);    }    }    @Override    public void undo() {        // TODO Auto-generated method stub    int vol=    setreo.GetVol();    if(vol<11)    {        setreo.SetVol(++vol);    }    }}

MarcoCommand(ConceteCommand)

public class MarcoCommand implements Command {    private Command[] commands;    public MarcoCommand(Command[] commands) {        this.commands = commands;    }    @Override    public void execute() {        // TODO Auto-generated method stub        for (int i = 0, len = commands.length; i < len; i++) {            commands[i].execute();        }    }    @Override    public void undo() {        // TODO Auto-generated method stub        for (int i = commands.length - 1; i >= 0; i--) {            commands[i].undo();        }    }}

NoCommand(ConcreteCommand)

public class NoCommand implements Command {    @Override    public void execute() {        // TODO Auto-generated method stub    }    @Override    public void undo() {        // TODO Auto-generated method stub    }}

Light(receiver)

public class Light {    String loc = "";    public Light(String loc) {        this.loc = loc;    }    public void On() {        System.out.println(loc + " On");    }    public void Off() {        System.out.println(loc + " Off");    }}

Stereo(receiver)

public class Stereo {    static int volume = 0;    public void On() {        System.out.println("Stereo On");    }    public void Off() {        System.out.println("Stereo Off");    }    public void SetCd() {        System.out.println("Stereo SetCd");    }    public void SetVol(int vol) {        volume = vol;        System.out.println("Stereo volume=" + volume);    }    public int GetVol() {        return volume;    }    public void Start() {        System.out.println("Stereo Start");    }}

参考

<<设计模式之禅>>
极客学院教学视频

0 0
原创粉丝点击