基本概念:
Command模式也叫命令模式 ,是行为设计模式的一种。Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数,命令模式将方法调用给封装起来了。
命令模式的几个角色:
Command: 抽象命令类
ConcreteCommand: 具体命令类
Invoker: 调用者
Receiver: 接收者
Client:客户类
命令模式的优缺点:
优点
1. 降低了系统耦合度
2. 新的命令可以很容易添加到系统中去。
缺点
使用命令模式可能会导致某些系统有过多的具体命令类。
Traders.java
package com.soyoungboy.command1; public class Traders { /** * @Title: sailMineralWater * @Description: TODO(卖矿泉水) * @param 设定文件 * @return void 返回类型 * @throws */ public void sailMineralWater() { System.out.println("卖矿泉水"); } /** * @Title: sailIceBlackTea * @Description: TODO(卖冰紅茶) * @param 设定文件 * @return void 返回类型 * @throws */ public void sailIceBlackTea() { System.out.println("卖冰紅茶"); } }
抽象命令类:Command.java
/** * @ClassName: Command * @Description: TODO(抽象命令类) */ public abstract class Command { private Traders traders; public Command(Traders traders) { this.traders = traders; } /** * @return 返回 traders **/ public Traders getTraders() { return traders; } /** * @param traders 要设置的 traders */ public void setTraders(Traders traders) { this.traders = traders; } public abstract void sail(); }
具体命令类1: MineralWaterCommand.java
package com.soyoungboy.command1; /** * * @ClassName: MineralWaterCommand * @Description: TODO(具体命令类 --販賣礦泉水) */ public class MineralWaterCommand extends Command { public MineralWaterCommand(Traders traders) { super(traders); } @Override public void sail() { this.getTraders().sailMineralWater(); } }
具体命令类2:IceBlackTeaCommand.java
-
package com.soyoungboy.command1; /** * * @ClassName: IceBlackTeaCommand * @Description: TODO(具体命令类 --販賣冰紅茶) */ public class IceBlackTeaCommand extends Command { public IceBlackTeaCommand(Traders traders) { super(traders); } @Override public void sail() { this.getTraders().sailIceBlackTea(); } }
- 接收类:Cashier.java
package com.soyoungboy.command1; import java.util.ArrayList; /** * @ClassName: Cashier * @Description: TODO(接收者 -- 收銀員類) */ public class Cashier { public ArrayList<Command> drinks = new ArrayList<Command>(); /** * @Title: addDrinks * @Description: TODO(购买各种饮料) * @param @param command 设定文件 * @return void 返回类型 * @throws */ public void addDrinks(Command command) { drinks.add(command); } /** * @Title: removeDrinks * @Description: TODO(不要某種飲料) * @param @param command 设定文件 * @return void 返回类型 * @throws */ public void removeDrinks(Command command) { drinks.remove(command); } /** * @Title: sail * @Description: TODO(售卖各自的饮料) * @param 设定文件 * @return void 返回类型 * @throws */ public void sail() { for (Command drink : drinks) { drink.sail(); } } }
客户类即测试类:
package com.soyoungboy.command1; public class Test { public static void main(String[] args) { Cashier cashier = new Cashier(); Traders traders = new Traders(); MineralWaterCommand mineralWaterCommand = new MineralWaterCommand(traders); IceBlackTeaCommand iceBlackTeaCommand = new IceBlackTeaCommand(traders); //来瓶冰红茶和矿泉水 cashier.addDrinks(mineralWaterCommand); cashier.addDrinks(iceBlackTeaCommand); cashier.sail(); System.out.println("----------------"); //再来瓶冰红茶 cashier.addDrinks(iceBlackTeaCommand); cashier.sail(); System.out.println("----------------"); //不要一瓶矿泉水了 cashier.removeDrinks(mineralWaterCommand); cashier.sail(); } }
测试结果:
卖矿泉水
卖冰紅茶
----------------
卖矿泉水
卖冰紅茶
卖冰紅茶
----------------
卖冰紅茶
卖冰紅茶
android中的使用:
Thread, Runnable中使用命令模式:
http://www.cnblogs.com/qianxudetianxia/archive/2011/08/13/2135478.html
2015年12月19日22:35:46更新
设计模式虽然增加了类的数量和复杂度,但是使得结构更加清晰,更加高扩展,低冗余。
命令模式定义:
将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化,对请求队列或者记录请求日志,以及支持可撤销的操作。