教育培训网站建设环球网今日疫情消息
命令模式:一种数据驱动的设计模式也属于行为型模式,请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。你认为是命令的地方都可以使用命令模式。
介绍
- 意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。
- 主要解决问题:行为请求者与行为实现者的关系紧耦合,将"行为请求者"与"行为实现者"解耦,通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。
- 关键代码:定义三个角色,命令、接受者、调用者
- 优点: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;}@Overridepublic void execute() {draw.triangle();} }
绘制矩形具体命令//具体绘制圆形命令 public class CircularDraw implements Drawing{Draw draw;public CircularDraw(Draw draw) {this.draw = draw;}@Overridepublic void execute() {draw.circular();} }
//具体绘制矩形命令 public class RectangleDraw implements Drawing{Draw draw;public RectangleDraw(Draw draw) {this.draw = draw;;}@Overridepublic 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();}