Java 设计模式(一) 命令模式

代码不是看出来的,而是敲出来的,欢迎关注WX公众号【秃头程序员】,收藏教程。

设计模式的提法最早起源于建筑学,随后在软件领域由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides合作出版的《设计模式:可复用的面向对象软件的基础》,正式掀开了软件业设计模式的序幕,该书被广大喜爱者昵称为GOF(Gang of Four)之书,被认为是学习设计模式的必读著作。

而我们学习设计模式的目的是什么,学习设计模式会对我们的应聘面试、开发编程起到多大帮助作用。设计模式的作用在于帮助我们将应用组织成容易了解,容易维护,具有弹性的架构,建立可维护的OO(Object Oriented面向对象)系统,要诀在于随时想到系统以后可能需要的变化以及应付变化的原则。

1、设计模式能让专业人之间交流方便,如下:

程序员A:这里我用了XXX设计模式

程序员B:那我大致了解你程序的设计思路了

2、易维护

项目经理:今天客户有这样一个需求…

程序员:明白了,这里我使用了XXX设计模式,所以改起来很快

3、设计模式是编程经验的总结

程序员A:B,你怎么想到要这样去构建你的代码

程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题

4、学习设计模式并不是必须的

程序员A:B,你这段代码使用的是XXX设计模式对吗?

程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的

Java 中一般认为有23种设计模式,总体来说设计模式分为三大类:

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十几种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。今天此文秃头程序员先介绍命令模式。

命令模式

涉及到一个对象请求另一个对象调用其方法到达某种目的。如果请求者不希望或无法直接和被请求者打交道,即不希望或无法含有被请求者的引用,那么就可以使用命令模式。

在面向对象的程序设计中,一个对象调用另一个对象,一般情况下的调用过程是:创建目标对象实例;设置调用参数;调用目标对象的方法。但在有些情况下有必要使用一个专门的类对这种调用过程加以封装,我们把这种专门的类称作command类。

命令模式的结构中包括四种角色:

  • 接收者(Receiver)
  • 命令(Command)接口
  • 具体命令(ConcreteCommand)
  • 请求者(Invoker)

模式的UML类图如下:

Java 设计模式(一) 命令模式

<code>1.接收者(Receiver) : CompanyStudent.java
public class CompanyStudent{
public void doWork(){
System.out.println("我会完成作业");
}
}/<code>
<code>2.命令(Command)接口 : Command.java
public interface Command {
public abstract void execute();
}/<code>
<code>3.具体命令(ConcreteCommand) ConcreteCommand.java 
public class ConcreteCommand implements Command{
CompanyStudent student; //含有接收者的引用
ConcreteCommand(CompanyStudent student){
this.student=student;
}
public void execute(){ //封装着老师的请求
student.doWork(); //做作业
}
}/<code>
<code>4.请求者(Invoker) Teacher.java 
public class Teacher{
Command command; //用来存放具体命令的引用
public void setCommand(Command command){
this.command=command;
}
public void startExecuteCommand(){ //让具体命令执行execute()方法
command.execute();
}
}/<code>
<code>5.应用 Application.java
public class Application{
public static void main(String args[]){
CompanyStudent bill=new CompanyStudent();
Command command=new ConcreteCommand(bill);
teacher lisa=new teacher();
lisa.setCommand(command);
lisa.startExecuteCommand();

}
}/<code>

适合使用命令模式的情景:程序需要在不同的时刻指定、排列和执行请求;程序需要提供撤销操作;程序需要支持宏操作。

通过对上面的分析我们可以知道如下几点:

1. 命令模式是通过命令发送者和命令执行者的解耦来完成对命令的具体控制的。

2. 命令模式是对功能方法的抽象,并不是对对象的抽象。

3. 命令模式是将功能提升到对象来操作,以便对多个功能进行一系列的处理以及封装。

代码不是看出来的,而是敲出来的,欢迎关注WX公众号【秃头程序员】,收藏教程。


分享到:


相關文章: