JDK与设计模式:命令模式

1、命令模式
       命令模式 :将一个请求封装为一个对象,从而让我们可用不同的请求对 客户进行参数化,用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化。命令模式是一种对象行为型模式,其别名为动作 (Action) 模式或事务 (Transaction) 模式。
       命令模式可以将请求发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求
组成:      

     1)Command(抽象命令类):抽象命令类一般是一个抽象类或接口,在其中声明了用于执行请求的execute()等方法,通过这些方法可以调用请求接收者的相关操作。

     2)ConcreteCommand(具体命令类):具体命令类是抽象命令类的子类,实现了在抽象命令类中声明的方法,它对应具体的接收者对象,将接收者对象的动作绑定其中。在实现execute()方法时,将调用接收者对象的相关操作(Action)

     3)Invoker(调用者):调用者即请求发送者,它通过命令对象来执行请求。一个调用者并不需要在设计时确定其接收者,因此它只与抽象命令类之间存在关联关系。在程序运行时可以将一个具体命令对象注入其中,再调用具体命令对象的execute()方法,从而实现间接调用请求接收者的相关操作。

     4) Receiver(接收者):接收者执行与请求相关的操作,它具体实现对请求的业务处理。

类图:

        

       命令模式的本质是对请求进行封装,一个请求对应于一个命令,将发出命令的责任和执行命令的责任分割开每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行相应的操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求如何被接收、操作是否被执行、何时被执行,以及是怎么被执行的
       命令模式的关键在于引入了抽象命令类,请求发送者针对抽象命令类编程,只有实现了抽象命令类的具体命令才与请求接收者相关联。 在最简单的抽象命令类中只包含了一个抽象的 execute() 方法,每个具体命令类将一个 Receiver 类型的对象作为一个实例变量进行存储,从而具体指定一个请求的接收者,不同的具体命令类提供了 execute() 方法的不同实现,并调用不同接收者的请求处理方法。

代码:
abstract class Command{
  public abstract void execute();
 }
 class ConcreteCommand extends Command{
 
  Receiver receiver;//接收对象引用
 
      public void execute(){
   receiver.action();
  }
 }
 
    class	Receiver{
         
     public void action(){
      //接收者执行具体业务逻辑
     }     
    }
 
 class Invoker{
 
  Command command ;
  public Invoker(Command c) {
   // TODO Auto-generated constructor stub
   this.command = c ;
  }

  public Command getCommand() {
   return command;
  }

  public void setCommand(Command command) {
   this.command = command;
  }
 
  public void doSomething(){
   command.execute();//业务实现方法,调用命令类的execute()方法
  }
     
 }
适用场景:以下场景适合使用命令模式:       

    1)系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。请求调用者无须知道接收者的存在,也无须知道接收者是谁,接收者也无须关心何时被调用。

    2)需要在不同的时间指定请求、将请求排队。一个命令对象和原先的请求发出者可以有不同的生命期。换言之,原先的请求发出者可能已经不在了,而命令对象本身仍然是活动的。这时命令的接收者可以是在本地,也可以在网络的另外一个地址。命令对象可以在串形化之后传送到另外一台机器上去。

    3)系统需要支持命令的撤消(undo)。命令对象可以把状态存储起来,等到客户端需要撤销命令所产生的效果时,可以调用undo()方法,把命令所产生的效果撤销掉。命令对象还可以提供redo()方法,以供客户端在需要时,再重新实施命令效果。

总结:命令模式是一种使用频率非常高的设计模式,它可以将请求发送者与接收者解耦,请求发送者通过命令对象来间接引用请求接收者,使得系统具有更好的灵活性和可扩展性。

2、JDK中命令模式的应用
        在java jdk中,java.lang.Runnable 和  javax.swing.Action是使用命令模式的经典场景。


    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。<br>第1章 Java基础 <br>1.1 转换基本数据类型 <br>1.2 Java的运算符 <br>1.3 控制程序的流程 <br>1.4 计算阶乘 <br>1.5 实现命令行程序 <br>第2章 Java面向对象程序设计 <br>2. 1 复数类 <br>2. 2 equals.chashCode和clone方法 <br>2. 3 Java的参数传递 <br>2. 4 自定义形状类 <br>2. 5 类的加载顺序 <br>2. 6 方法和变量在继承时的覆盖与隐藏 <br>2. 7 排序类 <br>2. 8 Singleton单例模式 <br>2. 9 Factory工厂模式 <br>2. 10 Adapter适配器模式 <br>第3章 数字 <br>3. 1 数字与数字封装类 <br>3. 2 格式化数字 <br>3. 3 数字的舍入 <br>3. 4 转换数字的进制 <br>3. 5 生成随机数 <br>3. 6 处理大数字 <br>第4章 数组与集合 <br>4. 1 使用Arrays <br>4. 2 求质数. <br>4. 3 动态调整数组长度 <br>4. 4 矩阵 <br>4. 5 ArrayList. Vector和LinkedList <br>4. 6 生成不重复的随机数序列 <br>4. 7 自定义队列 <br>4. 8 对List排序 <br>4. 9 HashSet. LinkedHashSet和TreeSet <br>4. 10 列表. 集合与数组的互相转换 <br>4. 11 HashMap. Hashtable. LinkedHashMap和TreeMap <br>4. 12 对Map排序 <br>4. 13 Properties属性文件 <br>第5章 字符串 <br>5. 1 使用String <br>5. 2 基本数据类型与字符串的转化 <br>5. 3 判断Java标识符 <br>5. 4 使用StringBuffer <br>5. 5 IP地址转化成整数 <br>5. 6 18位身份证格式验证 <br>5. 7 表达式解析器 <br>5. 8 字符串编码的转换 <br>5. 9 字符串对齐器 <br>5. 10 密码加密与验证 <br>5. 11 制作命令行程序 <br>5. 12 使用StringTokenizer <br>5. 13 使用正则表达式操作字符串 <br>5. 14 使用正则表达式验证电话号码的格式 <br>第6章 Java异常处理 <br>6. 1 throw. throws. try和catch <br>6. 2 自定义异常类 <br>6. 3 使用finally <br>6. 4 使用异常的技巧与原则 <br>第7章 IO——输入输出流 <br>7. 1 获取文件的属性信息 <br>7. 2 列出指定目录下的文件 <br>7. 3 创建文件和目录 <br>7. 4 删除文件和目录 <br>7. 5 移动文件和目录 <br>7. 6 复制文件和目录 <br>7. 7 一个简单的文件搜索器 <br>7. 8 读文件 <br>7. 9 写文件 <br>7. 10 添加内容到文件尾 <br>7. 11 文件的分割与合并 <br>7. 12 从键盘接收数据并输出到文件 <br>7. 13 使用StreamTokenizer统计文件的字符数 <br>7. 14 序列化和反序列化对象 <br>7. 15 控制对象的序列化和反序列 <br>7. 16 读jar包的资源文件 <br>7. 17 用Zip格式压缩和解压缩文件 <br>7. 18 操作Excel文件 <br>7. 19 操作PDF文件 <br>7. 20 自定义日志文件类 <br>第8章 线程 <br>8. 1 定义和启动线程 <br>8. 2 停止线程 <br>8. 3 线程的互斥 <br>8. 4 线程的协作 <br>8. 5 线程join <br>8. 6 生产者. 消费者问题 <br>8. 7 线程优先级 <br>8. 8 列出虚拟机中所有的线程 <br>8. 9 守护线程Daemon <br>8. 10 线程池 <br>8. 11 一个死锁的例子 <br>8. 12 定时器Timer <br>第9章 Java GUI <br>9. 1 日历 <br>9. 2 开窗户游戏 <br>9. 3 标准型计算器 <br>9. 4 更改组件的外观 <br>9. 5 自定义对话框 <br>9. 6 制作欢迎画面 <br>9. 7 一个简单的编辑器 <br>9. 8 Swing的Drag和Drop <br>第10章 Java图形 <br>10. 1 一个圆形的按钮 <br>10. 2 捕捉屏幕 <br>10. 3 缩放图片 <br>10. 4 2D图形 <br>10. 5 3D图形.. <br>10. 6 一个时钟程序 <br>第11章 Java多媒体 <br>11. 1 滚动的消息 <br>11. 2 三维弹球 <br>11. 3 贪吃蛇游戏 <br>11. 4 Java声音处理 <br>11. 5 媒体播放器 <br>第12章 反射 <br>12. 1 instanceof操作符 <br>12. 2 获取类的信息 <br>12. 3 动态调用类的方法 <br>第13章 网络编程 <br>13. 1 获取URL的信息 <br>13. 2 Web浏览器 <br>13. 3 获取IP地址和域名 <br>13. 4 HTTP客户端 <br>13. 5 基本的Socket编程 <br>13. 6 HTTP服务器 <br>13. 7 一个支持多线程的服务器框架 <br>13. 8 代理服务器 <br>13. 9 Telnet客户端 <br>13. 10 UDP编程 <br>13. 11 聊天室服务器端 <br>13. 12 聊天室客户端 <br>13. 13 FTP客户端 <br>第14章 数据库 <br>14. 1 连接各种数据库 <br>14. 2 获得数据库和表的元数据 <br>14. 3 查询和更新数据库 <br>14. 4 批处理 <br>14. 5 提交与回滚事务 <br>14. 6 使用PreparedStatement <br>14. 7 读写二进制数据 <br>14. 8 读写Blob数据 <br>14. 9 使用ResultSet更新数据库 <br>14. 10 使用RowSet <br>14. 11 调用存储过程 <br>14. 12 一个数据库连接池 <br>第15章 Applet <br>15. 1 Applet时钟 <br>15. 2 处理鼠标和键盘事件 <br>15. 3 英文打字游戏 <br>15. 4 Applet间通信 <br>15. 5 汉诺塔游戏 <br>第16章 J2SE 5. 0新特性 <br>16. 1 自动装箱和拆箱 <br>16. 2 新的for循环 <br>16. 3 枚举类型 <br>16. 4 静态导入 <br>16. 5 可变长参数Varargs <br>16. 6 格式化输出 <br>16. 7 使用ProcessBuilder执行本地命令 <br>16. 8 泛型编程 <br>16. 9 注释功能Annotation <br>16. 10 监控与管理虚拟机 <br>16. 11 线程——Callable和Future <br>16. 12 线程——任务执行架构 <br>16. 13 线程——锁Lock <br>16. 14 线程——条件Condition <br>16. 15 线程——Semaphore <br>16. 16 线程——CountDownLatch <br>16. 17 线程——Cycli Barrier <br>16. 18 线程——Exchanger <br>16. 19 线程——BlockingQueue <br>第17章 Java与XML <br>17. 1 用DOM处理XML文档 <br>17. 2 用SAX处理XML文档 <br>17. 3 用XSLT转换XML <br>17. 4 对象与XML的转换 <br>第18章 Java Mail <br>18. 1 使用SMTP协议发送简单邮件 <br>18. 2 发送带附件的邮件 <br>18. 3 给多人发送邮件 <br>18. 4 使用POP3接收邮件 <br>第19章 JSP与Servlet <br>19. 1 获取客户端的真实IP地址 <br>19. 2 设置矛口读取Cookie <br>19. 3 JSP无刷新聊天室 <br>19. 4 上传文件 <br>19. 5 用Servlet生成图形验证码 <br>19. 6 用Servlet实现分页查看数据库 <br>
工厂系列模式的优缺点: 让用户的代码和某个特定类的子类的代码解耦 用户不必知道它所使用的对象是怎样创建的,只需知道该对象有哪些方法 抽象工厂模式可以为用户创建一系列相关的对象,使用户和创建这些对象的类脱耦 MVC模式是不是一种设计模式?为什么 MVC不是设计模式,应该是框架/架构模式,因为它的定义是抽象的,没有足够的细节描 述使你直接去实现,而只能根据MVC的概念和思想,用几个设计模式组合实现。 举出一个生活中使用装饰者模式的例子,用程序实现思路 举个生活中的例子,俗话说"人在衣着马在鞍",把这就话用装饰者模式的语境翻译一下 ,"人通过漂亮的衣服装饰后,男人变帅了,女人变漂亮了;"。对应 上面的类图,这里人对应于ConcreteComponent,而漂亮衣服则对应于ConcreteDecorato r; 设计模式如何分类,每一个类别都有什么特征? 设计模式分为3类,分别是:创建型模式、行为型模式、结构型模式。 创建型特点:避免用户直接使用new运算符创建对象。 行为型特点:怎样合理的设计对象之间的交互通信,以及怎样合理的为对象分配职 结构型特点:主要用于处理类或对象的组合 Java jdk中使用了哪些设计模式 1.单例2.静态工厂3.工厂方法4.抽象工厂5.构造者6.原型7.适配器8桥接9.组合10.装 饰器11.外观12.享元14.代理15.迭代器16.观察者17.协调者18.模板方法19.策略20.责 任链21.命令22.空对象25.解释器 面向对象的设计原则有哪些? 开闭原则、面向抽象的原则(依赖倒转原则)、多用组合少用继承原则、高内聚- 低耦合原则。 观察者模式的推拉有什么不同?使用场景 推,具体主题将变化后的数据全部交给具体观察者。场景:当具体主题认为具体观察者 需要这些变换后的数据时,往往采用推数据方式; 拉,具体主题不将变化后的数据交给具体观察者,而是提供获得这些数据的方法。场景 :当具体主题不知道具体观察者是否需要这些变换后的数据时,往往采用拉数据的方式 。 策略模式和工厂模式有什么不同? 策略模式定义了一系列算法,将他们一个个封装,并且他们之间可以相互替换; 工厂模式定义一个创建对象的接口,让子类决定实例化哪一个类 5观察者模式的推拉有什么不同?适用场景 现在要说的分歧在这里: "推"的方式是指,Subject维护一份观察者的列表,每当有更新发生,Subject会把更新 消息主动推送到各个Observer去。 "拉"的方式是指,各个Observer维护各自所关心的Subject列表,自行决定在合适的时间 去Subject获取相应的更新数据。 "推"的好处包括: 1、高效。如果没有更新发生,不会有任何更新消息推送的动作,即每次消息推送都发生 在确确实实的更新事件之后,都是有意义的。 2、实时。事件发生后的第一时间即可触发通知操作。 3、可以由Subject确立通知的时间,可以避开一些繁忙时间。 4、可以表达出不同事件发生的先后顺序。 缺点:精确性较差,不能保证能把信息送到客户器。 "拉"的好处包括: 1、如果观察者众多,Subject来维护订阅者的列表,可能困难,或者臃肿,把订阅关系 解脱到Observer去完成。 2、Observer可以不理会它不关心的变更事件,只需要去获取自己感兴趣的事件即可。 3、Observer可以自行决定获取更新事件的时间。 4、拉的形式可以让Subject更好地控制各个Observer每次查询更新的访问权限。缺点: 不能够及时获取系统的变更。 6策略模式和工厂模式有什么不同? 一般情况下,策略模式是为了解决的是策略的切换与扩展,更简洁的说是定义策略族, 分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客 户。可以应用的场景有优惠系统、工资计算系统等。而工厂模式主要解决的是资源的统 一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。主要应用 在多数据库选择,类库文件加载等。很明显的是策略模式是开放的,作为一个主体你的 活动范围是全程的,大多数事情要你自己亲力亲为。而工厂模式作是封闭的,作为主体 的你的活动范围是有限的,很多事情都帮组你做好了,你直接"点"就可以了。 7装饰者模式和适配器模式的比较 1.关于新职责:适配器也可以在转换时增加新的职责,但主要目的不在此。装饰者模 式主要是给被装饰者增加新职责的。 2.关于原接口:适配器模式是用新接口来调用原接口,原接口对新系统是不可见或者 说不可用的。装饰者模式原封不动的使用原接口,系统对装饰的对象也通过原接口来完 成使用。(增加新接口的装饰者模式可以认为是其变种--"半透明"装饰者) 3.关于其包裹的对象:适配器是知道被适配者的详细情况的(就是那个类或那个接口 )。装饰者只知道其接口是什么,至于

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值