命令模式之2 Invoker Vs. Client
当程序中直接编写下达命令的语句如new Cmd1().execute()时。一般会将调用者与客户类合二为一。
在GUI程序中。下达命令的语句通常包括在底层框架中。或者说底层框架包括了调用者。这时程序猿编写的程序都是客户类。
GUI程序中,由系统作为命令调用者在某种界面事件发生时自己主动调用命令。
以下的演示程序中使用了button、下拉菜单(JMenuBar-JMenu- JMenuItem)和弹出菜单(JPopupMenu),而JButton 、JMenuItem和JPopupMenu均能够通过其构造器注入一个Action命令。(依赖注入)
以下将编写两个AbstractAction的子类,它们将被注入到对应的控件中。
值得注意的是,详细命令类自己实现全部功能,不须要额外的接收者。在此情况下。既能够说应用了命令模式(编写了两个子命令)。也能够说简单的应用了回调(编写了两个包括回调函数的类)。
yqj2065个人觉得,命令模式的概念还是小一点好:详细命令指定运行者(能够是抽象类型)和被调用的方法。将C/S结构的C与S解耦。
GoF的:“将(client的)请求封装为一个对象,从而使你可用不同的请求对客户进行參数化”。过于泛泛而谈。
“将(client的)请求封装为一个对象",參见方法类型化,是Java接口的一般意图;客户下达的cmd.exe(),在多态的场合都是”用不同的请求对客户进行參数化“。当不须要接收者的时候,我们甚至能够把AbstractAction的actionPerformed(ActionEvent
evt)视为一个策略,也是能够的,难道我们说此例程使用了策略模式??
无论怎么说,GUI中的这样的应用。是命令模式的典型案例。
假设你的程序中多处使用某种button如Exit。能够使用命令模式编写一个命令。而不是随地使用匿名类。
例程 3-22命令
package method.command.gui;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
class SubmitAction extends AbstractAction {
private Component target;
public SubmitAction(String name, Icon icon, Component t){
putValue(Action.NAME, name);
putValue(Action.SMALL_ICON, icon);
putValue(Action.SHORT_DESCRIPTION, name + " the program");
target = t;
}
@Override public void actionPerformed(ActionEvent evt) {
JOptionPane.showMessageDialog(target, "submit action ");
}
}
class ExitAction extends AbstractAction {
private Component target;
public ExitAction(String name, Icon icon, Component t){
putValue(Action.NAME, name);
putValue(Action.SMALL_ICON, icon);
putValue(Action.SHORT_DESCRIPTION, name + " the program");
target = t;
}
@Override public void actionPerformed(ActionEvent evt) {
int answer = JOptionPane.showConfirmDialog(target, "Are you sure you want to exit? ", "Confirmation",
JOptionPane.YES_NO_OPTION);
if ( answer == JOptionPane.YES_OPTION) System.exit(0);
}
}
public class Test extends JFrame{
Test() {
Action ea = new ExitAction("Exit", null, this);
Action sa = new SubmitAction("Submit", null, this);
//下拉菜单(JMenuBar-JMenu- JMenuItem)
JMenuBar bar = new JMenuBar();
JMenu mn_demo= new JMenu("Demo");
mn_demo.add(new JMenuItem(sa));
mn_demo.add(new JMenuItem(ea));
bar.add(mn_demo);
this.setJMenuBar(bar);
//JPopupMenu
final JPopupMenu pop = new JPopupMenu("PopMenu");
pop.add(sa);
pop.add(ea);
//
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
showPopup(e);
}
public void mouseReleased(MouseEvent e) {
showPopup(e);
}
private void showPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
pop.show(e.getComponent(),e.getX(), e.getY());
}
}
});
JPanel jp = new JPanel();
JButton subbtn = new JButton(sa);
JButton exitbtn = new JButton(ea);
jp.add(subbtn);
jp.add(exitbtn);
Container con = getContentPane();
con.add(jp, "South"); setTitle("Command pattern example");
setSize(300,200);
setVisible(true);
}
}
命令模式之2 Invoker Vs. Client的更多相关文章
- 使用PHP实现命令模式(转)
<?php /** * 命令模式 2010-08-21 sz * @author phppan.p#gmail.com http://www.phppan.com * 哥学社成员(http:// ...
- java设计模式之命令模式
学校中.生活中.社会中总是会存在一定的阶层,虽然我们很多人都不可认可阶层的存在.命令这一词也就在阶层中诞生.家长命令孩子,老师命令学生,领导命令小娄娄.这些都在我们的生活存在的东西,相信这一个模式学习 ...
- Java-马士兵设计模式学习笔记-命令模式
一.概述 命令模式 二.代码 1.Client.java public class Client { public void request(Server server){ server.addCom ...
- 【胡思乱想】命令模式中,命令对象如何解耦Invoker和Receiver
首先,我们得清楚为何要解耦? 耦合的坏处就是,牵一发而动全身,比如,当我更改了类A或其子类的时候,类B也要进行修改.这里,解除耦合,就意味着,即使你Receiver怎么改,添加了多少,删除了多少.我I ...
- 命令模式(Command、Recevier、Invoker)(电脑开机命令)
(将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能.) 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是 ...
- 设计模式--命令模式Command(对象行为型)
一.命令模式 将一个请求封装为一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. (1)Command类:是一个抽象类,类中对需要执行的命令进行 ...
- C#设计模式系列:命令模式(Command)
1.命令模式简介 1.1>.定义 命令模式的目的是解除命令发出者和接收者之间的紧密耦合关系,使二者相对独立,有利于程序的并行开发和代码的维护.命令模式的核心思想是将请求封装为一个对象,将其作为命 ...
- (十三)WebGIS中工具栏的设计之命令模式
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 从这一章节开始我们将正式进入WebGIS的工具栏中相关功能的 ...
- [Head First设计模式]餐馆中的设计模式——命令模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
随机推荐
- 国内物联网平台初探(五) ——机智云IoT物联网云服务平台及智能硬件自助开发平台
平台定位 机智云平台是致力于物联网.智能硬件云服务的开放平台.平台提供了从定义产品.设备端开发调试.应用开发.产测.运营管理等覆盖智能硬件接入到运营管理全生命周期服务的能力. 机智云平台为开发者提供了 ...
- STEM教育是什么?
STEM教育是什么? STEM 是Science科学.Technology技术.Engineering工程.Math数学,这4个词的开头字母的组合.所以STEM教育就是结合科学.技术.工程.数学的跨领 ...
- PIE加载自定义服务数据详细介绍
这段时间我一直在研究如何用PIE加载在线地图服务,遇到了许多问题,多亏了技术员小姐姐的帮助,才让我能正确加载ArcGIS Online在线服务.天地图在线地图和谷歌在线地图.我是根据博客园PIE官方博 ...
- 21. Merge Two Sorted Lists[E]合并两个有序链表
题目 Merge two sorted linked lists and return it as a new list. The new list should be made by splicin ...
- BZOJ 4742 DP
思路: Claris大大说了 排序以后 这个可以看成是括号序列 f[i][j][k]表示到了i j个左括号 k个右括号 (f[i][j][k]+=f[i-1][j][k])%=p; if(node[i ...
- 移动端web开发初探之Vuejs的简单实战
这段时间在做的东西,是北邮人论坛APP的注册页.这个注册页是内嵌的网页,因为打算安卓和IOS平台同时使用.因此实际上就是在做移动端的web开发了. 在这过程中遇到了不少有意思的东西. DEMO的git ...
- 使用Axis2方式发布webService实例说明
1.简单的pojo方式: 不需要写配置文件,直接把class文件拷贝到axis2的WEB-INF目录下的poji文件夹下即可.但其局限性表现在,实现类不能有包声明,这在实际开发过程中使用较少,这里不做 ...
- 定时器篇---java.util.TimerTask和quartz
最近项目中出现了定时执行任务的东西,研究了一下,觉得挺不错的,以后还用得到,就总结了下. 这里只介绍两种java.util.Timer 和 quartz java.util.Timer java自带的 ...
- IOS Html富文本渲染方式:DTCoreText、WKWebView、UIWebView的内存占用对比
在app的内容页(详情页)中,富文本的显示一直是经常需要处理的问题,而通常在后端的富文本编辑中,Html应用比较普遍,所以其实需要处理的Html富文本显示的问题,以下这三种方式肯定不是最优的显示Htm ...
- MVC 返回json数据
使用 return Json(pageList, JsonRequestBehavior.AllowGet); 返回object 使用 return Content(JsonConvert.Seria ...