java_command
来源:互联网 发布:抠图软件 for mac 编辑:程序博客网 时间:2024/06/05 16:44
introduction:
命令模式:
将“请求”封转成对象,以便使用不同的请求,队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
当需要将发出请求的对象和执行请求的对象解耦的时候,使用命令模式。
在传统的软件系统中,行为请求者和行为实现者之间通常呈现为一种紧耦合,将一组行为抽象为对象,实现二者之间的松耦合。
命令模式的本质:对命令进行封装,将发出命令的责任和执行命令的责任分开。
命令模式的关键:引入抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关。
命令模式的优势:低耦合,易扩充
命令模式的缺点:系统需要过多的命令类,影响命令模式的使用。
命令模式适用环境:
调用者和接收者解耦
支持命令的撤销操作和恢复操作
支持宏命令
命令模式实例:遥控器和电视机
demo:
1.简答命令模式:
description:描述电视机和遥控器场景
Tv.java
public class Tv { private String name; public Tv(String name){ this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void on(){ System.out.println(name+" on"); } public void off(){ System.out.println(name+" off"); }}
Command.java
public interface Command { void execute();}
TvOnCommand.java
public class TvOnCommand implements Command{ private Tv tv; public TvOnCommand(Tv tv){ this.tv = tv; } @Override public void execute() { tv.on(); }}
TvOffCommand.java
public class TvOffCommand implements Command{ private Tv tv; public TvOffCommand(Tv tv){ this.tv = tv; } @Override public void execute() { tv.off(); }}
NoCommand.java
public class NoCommand implements Command{ @Override public void execute() {}}以上实例是一个空对象,当你不想返回一个有意义的对象时,空对象就很有用。客户可以将处理null的责任转移给空对象。
RemoteControl.java
public class RemoteControl { Command onCommand; Command offCommand; public RemoteControl(){ NoCommand noCommand = new NoCommand(); this.onCommand = noCommand; this.offCommand = noCommand; } public void setCommand(Command onCommand, Command offCommand){ this.onCommand = onCommand; this.offCommand = offCommand; } public void onButtonPressed(){ this.onCommand.execute(); } public void offButtonPressed(){ this.offCommand.execute(); } @Override public String toString(){ StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("--- command begin --- \n"); stringBuffer.append("["+onCommand.getClass().getSimpleName()+"," +offCommand.getClass().getSimpleName()+"]"); stringBuffer.append("\n --- command end ---"); return stringBuffer.toString(); }}
Test.java
public class Test { public static void main(String[] args) { Tv tv = new Tv("asarja"); Command tvOn = new TvOnCommand(tv); Command tvOff = new TvOffCommand(tv); RemoteControl control = new RemoteControl(); control.setCommand(tvOn, tvOff); System.out.println(control); control.onButtonPressed(); control.offButtonPressed(); }}
运行结果:
--- command begin ---
[TvOnCommand,TvOffCommand]
--- command end ---
asarja on
asarja off
2.带撤销操作的命令模式(以下未列出的类与1中相同)
Command.java
public interface Command { void execute(); void undo(); }
TvOnCommand.java
public class TvOnCommand implements Command{ private Tv tv; public TvOnCommand(Tv tv){ this.tv = tv; } @Override public void execute() { tv.on(); } @Override public void undo() { tv.off(); } }
TvOffCommand.java
public class TvOffCommand implements Command{ private Tv tv; public TvOffCommand(Tv tv){ this.tv = tv; } @Override public void execute() { tv.off(); } @Override public void undo() { tv.on(); } }
NoCommand.java
public class NoCommand implements Command{ @Override public void execute() {} @Override public void undo() {} }
RemoteControl.java
public class RemoteControl { Command onCommand; Command offCommand; Command undoCommand; public RemoteControl(){ NoCommand noCommand = new NoCommand(); this.onCommand = noCommand; this.offCommand = noCommand; //初始化的时候 undoCommand 没有 this.undoCommand = noCommand; } public void setCommand(Command onCommand, Command offCommand){ this.onCommand = onCommand; this.offCommand = offCommand; } public void onButtonPressed(){ this.onCommand.execute(); this.undoCommand = this.onCommand; } public void offButtonPressed(){ this.offCommand.execute(); this.undoCommand = this.offCommand; } public void undoButtonPressed(){ this.undoCommand.undo(); } @Override public String toString(){ StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("--- command begin --- \n"); stringBuffer.append("["+onCommand.getClass().getSimpleName()+"," +offCommand.getClass().getSimpleName()+"]"); stringBuffer.append("\n --- command end ---"); return stringBuffer.toString(); } }
Test.java
public class Test { public static void main(String[] args) { Tv tv = new Tv("asarja"); Command tvOn = new TvOnCommand(tv); Command tvOff = new TvOffCommand(tv); RemoteControl control = new RemoteControl(); control.setCommand(tvOn, tvOff); System.out.println(control); control.onButtonPressed(); control.offButtonPressed(); control.undoButtonPressed(); } }
运行结果:
--- command begin ---
[TvOnCommand,TvOffCommand]
--- command end ---
asarja on
asarja off
asarja on
- java_command
- MySql实现跨表查询
- android开发实战系列(19)-- 让用户转移到另一个应用程序
- ZOJ 1298 poj 1135 Domino Effect(最短路,dij)
- linux下防御ddos攻击
- Android的AlertDialog详解
- java_command
- Hive BI analytics: Visual Reporting
- Android中一直走马灯效果的TextView
- 4断点和单步执行
- QLayout 动态布局(如何清空布局)
- Hive + Intellicus
- HAProxy负载均衡器的配置与算法
- Hadoop Ecosystem World-Map
- hdu 1085 Holding Bin-Laden Captive!