命令模式:一种数据驱动的设计模式也属于行为型模式,请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。你认为是命令的地方都可以使用命令模式。
介绍
- 意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。
- 主要解决问题:行为请求者与行为实现者的关系紧耦合,将"行为请求者"与"行为实现者"解耦,通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。
- 关键代码:定义三个角色,命令、接受者、调用者
- 优点:1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
- 缺点:使用命令模式可能会导致某些系统有过多的具体命令类
示例
还是以绘制三角形、圆形、矩形为例:
-
创建一个绘制命令接口(抽象命令)
//抽象命令 public interface Drawing { void execute(); }
-
接收者(接收 绘制方法)
//接收者 public class Draw { public void triangle(){ //绘制三角形逻辑 } public void circular(){ //绘制圆形逻辑 } public void rectangle(){ //绘制矩形逻辑 } }
-
具体命令
绘制三角形具体命令
绘制圆形具体命令//具体绘制三角形命令 public class TriangleDraw implements Drawing { Draw draw; public TriangleDraw(Draw draw) { this.draw = draw; } @Override public void execute() { draw.triangle(); } }
绘制矩形具体命令//具体绘制圆形命令 public class CircularDraw implements Drawing{ Draw draw; public CircularDraw(Draw draw) { this.draw = draw; } @Override public void execute() { draw.circular(); } }
//具体绘制矩形命令 public class RectangleDraw implements Drawing{ Draw draw; public RectangleDraw(Draw draw) { this.draw = draw;; } @Override public void execute() { draw.rectangle(); } }
-
使用
//使用示例 public static void main(String[] args) { Draw draw = new Draw(); TriangleDraw triangleDraw = new TriangleDraw(draw); CircularDraw circularDraw = new CircularDraw(draw); RectangleDraw rectangleDraw = new RectangleDraw(draw); Canvas canvas = new Canvas(); canvas.takeDrawing(triangleDraw); canvas.takeDrawing(circularDraw); canvas.takeDrawing(rectangleDraw); canvas.call(); }