命令模式(Command)
1 场景问题
1.1 如何开机
估计有些朋友看到这个标题会非常奇怪,电脑装配好了,如何开机?不就是按下启动按钮就可以了吗?难道还有什么玄机不成。
对于使用电脑的客户——就是我们来说,开机确实很简单,按下启动按钮,然后耐心等待就可以了。但是当我们按下启动按钮过后呢?谁来处理?如何处理?都经历了怎样的过程,才让电脑真正的启动起来,供我们使用。
先一起来简单的认识一下电脑的启动过程,了解一下即可。
?当我们按下启动按钮,电源开始向主板和其它设备供电
?主板的系统BIOS(基本输入输出系统)开始加电后自检
?主板的BIOS会依次去寻找显卡等其它设备的BIOS,并让它们自检或者初始化
?开始检测CPU、内存、硬盘、光驱、串口、并口、软驱、即插即用设备等等
?BIOS更新ESCD(扩展系统配置数据),ESCD是BIOS和操作系统交换硬件配置数据的一种手段
?等前面的事情都完成后,BIOS才按照用户的配置进行系统引导,进入操作系统里面,等到操作系统装载并初始化完毕,就出现我们熟悉的系统登录界面了。
1.2 与我何干
讲了一通电脑启动的过程,有些朋友会想,这与我何干呢?
没错,看起来这些硬件知识跟你没有什么大的关系,但是,如果现在提出一个要求:请你用软件把上面的过程表现出来,你该如何实现?
首先把上面的过程总结一下,主要就这么几个步骤:首先加载电源,然后是设备检查,再然后是装载系统,最后电脑就正常启动了。可是谁来完成这些过程?如何完成?
不能让使用电脑的客户——就是我们来做这些工作吧,真正完成这些工作的是主板,那么客户和主板如何发生联系呢?现实中,是用连接线把按钮连接到主板上的,这样当客户按下按钮的时候,就相当于发命令给主板,让主板去完成后续的工作。
另外,从客户的角度来看,开机就是按下按钮,不管什么样的主板都是一样的,也就是说,客户只管发出命令,谁接收命令,谁实现命令,如何实现,客户是不关心的。
1.3 有何问题
把上面的问题抽象描述一下:客户端只是想要发出命令或者请求,不关心请求的真正接收者是谁,也不关心具体如何实现,而且同一个请求的动作可以有不同的请求内容,当然具体的处理功能也不一样,请问该怎么实现?
2 解决方案
2.1 命令模式来解决
用来解决上述问题的一个合理的解决方案就是命令模式。那么什么是命令模式呢?
(1)命令模式定义
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
(2)应用命令模式来解决的思路
首先来看看实际电脑的解决方案
先画个图来描述一下,看看实际的电脑是如何处理上面描述的这个问题的,如图1所示:
图1 电脑操作示意图
当客户按下按钮的时候,按钮本身并不知道如何处理,于是通过连接线来请求主板,让主板去完成真正启动机器的功能。
这里为了描述它们之间的关系,把主板画到了机箱的外面。如果连接线连接到不同的主板,那么真正执行按钮请求的主板也就不同了,而客户是不知道这些变化的。
通过引入按钮和连接线,来让发出命令的客户和命令的真正实现者——
主板完全解耦,客户操作的始终是按钮,按钮后面的事情客户就统统不管了。
要用程序来解决上面提出的问题,一种自然的方案就是来模拟上述解决思路。
在命令模式中,会定义一个命令的接口,用来约束所有的命令对象,然后提供具体的命令实现,每个命令实现对象是对客户端某个请求的封装,对应于机箱上的按钮,一个机箱上可以有很多按钮,也就相当于会有多个具体的命令实现对象。
在命令模式中,命令对象并不知道如何处理命令,会有相应的接收者对象来真正执行命令。就像电脑的例子,机箱上的按钮并不知道如何处理功能,而是把这个请求转发给主板,由主板来执行真正的功能,这个主板就相当于命令模式的接收者。
在命令模式中,命令对象和接收者对象的关系,并不是与生俱来的,需要有一个装配的过程,命令模式中的Client对象就来实现这样的功能。这就相当于在电脑的例子中,有了机箱上的按钮,也有了主板,还需要有一个连接线把这个按钮连接到主板上才行。
命令模式还会提供一个Invoker对象来持有命令对象,就像电脑的例子,机箱上会有多个按钮,这个机箱就相当于命令模式的Invoker对象。这样一来,命令模式的客户端就可以通过Invoker来触发并要求执行相应的命令了,这也相当于真正的客户是按下机箱上的按钮来操作电脑一样。
2.2 模式结构和说明
命令模式的结构如图2所示:
图2 命令模式结构图
Command:
定义命令的接口,声明执行的方法。
ConcreteCommand:
命令接口实现对象,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
Receiver:
接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
Invoker:
要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。
Client:
创建具体的命令对象,并且设置命令对象的接收者。注意这个不是我们常规意义上的客户端,而是在组装命令对象和接收者,或许,把这个Client称为装配者会更好理解,因为真正使用命令的客户端是从Invoker来触发执行。
2.3 命令模式示例代码
(1)先来看看命令接口的定义,示例代码如下:
(3)再来看看接收者对象的实现示意,示例代码如下:
(4)接下来看看Invoker对象,示例代码如下:
(5)再来看看Client的实现,注意这个不是我们通常意义上的测试客户端,主要功能是要创建命令对象并设定它的接收者,因此这里并没有调用执行的代码,示例代码如下:
2.4 使用命令模式来实现示例
要使用命令模式来实现示例,需要先把命令模式中所涉及的各个部分,在实际的示例中对应出来,然后才能按照命令模式的结构来设计和实现程序。根据前面描述的解决思路,大致对应如下:
?机箱上的按钮就相当于是命令对象
?机箱相当于是Invoker
?主板相当于接收者对象
?命令对象持有一个接收者对象,就相当于是给机箱的按钮连上了一根连接线
?当机箱上的按钮被按下的时候,机箱就把这个命令通过连接线发送出去。
主板类才是真正实现开机功能的地方,是真正执行命令的地方,也就是“接收者”。命令的实现对象,其实是个“虚”的实现,就如同那根连接线,它哪知道如何实现啊,还不就是把命令传递给连接线连到的主板。
使用命令模式来实现示例的结构如图3所示:
图3 使用命令模式来实现示例的结构示意图
还是来看看示例代码,会比较清楚。
(1)定义主板
根据前面的描述,我们会发现,真正执行客户命令或请求的是主板,也只有主板才知道如何去实现客户的命令,因此先来抽象主板,把它用对象描述出来。
先来定义主板的接口,最起码主板会有一个能开机的方法,示例代码如下:
定义了接口,那就接着定义实现类吧,定义两个主板的实现类,一个是技嘉主板,一个是微星主板,现在的实现是一样的,但是不同的主板对同一个命令的操作可以是不同的,这点大家要注意。由于两个实现基本一样,就示例一个,示例代码如下:
微星主板的实现和这个完全一样,只是把技嘉改名成微星了。
(2)定义命令接口和命令的实现
对于客户来说,开机就是按下按钮,别的什么都不想做。把用户的这个动作抽象一下,就相当于客户发出了一个命令或者请求,其它的客户就不关心了。为描述客户的命令,现定义出一个命令的接口,里面只有一个方法,那就是执行,示例代码如下:
有了命令的接口,再来定义一个具体的实现,其实就是模拟现实中机箱上按钮的功能,因为我们按下的是按钮,但是按钮本身是不知道如何启动电脑的,它需要把这个命令转给主板,让主板去真正执行开机功能。示例代码如下:
由于客户不想直接和主板打交道,而且客户根本不知道具体的主板是什么,客户只是希望按下启动按钮,电脑就正常启动了,就这么简单。就算换了主板,客户还是一样的按下启动按钮就可以了。
换句话说就是:客户想要和主板完全解耦,怎么办呢?
这就需要在客户和主板之间建立一个中间对象了,客户发出的命令传递给这个中间对象,然后由这个中间对象去找真正的执行者——主板,来完成工作。
很显然,这个中间对象就是上面的命令实现对象,请注意:这个实现其实是个虚的实现,真正的实现是主板完成的,在这个虚的实现里面,是通过转调主板的功能来实现的,主板对象实例,是从外面传进来的。
(3)提供机箱
客户需要操作按钮,按钮是放置在机箱之上的,所以需要把机箱也定义出来,示例代码如下:
(4)客户使用按钮
抽象好了机箱和主板,命令对象也准备好了,客户想要使用按钮来完成开机的功能,在使用之前,客户的第一件事情就应该是把按钮和主板组装起来,形成一个完整的机器。
在实际生活中,是由装机工程师来完成这部分工作,这里为了测试简单,直接写在客户端开头了。机器组装好过后,客户应该把与主板连接好的按钮对象放置到机箱上,等待客户随时操作。把这个过程也用代码描述出来,示例代码如下:
运行一下,看看效果,输出如下:
你可以给命令对象组装不同的主板实现类,然后再次测试,看看效果。
事实上,你会发现,如果对象结构已经组装好了过后,对于真正的客户端,也就是真实的用户而言,任务就是面对机箱,按下机箱上的按钮,就可以执行开机的命令了,实际生活中也是这样的。
(5)小结
如同前面的示例,把客户的开机请求封装成为一个OpenCommand对象,客户的开机操作就变成了执行OpenCommand对象的方法了?如果还有其它的命令对象,比如让机器重启的ResetCommand对象;那么客户按下按钮的动作,就可以用这不同的命令对象去匹配,也就是对客户进行参数化。
用大白话描述就是:客户按下一个按钮,到底是开机还是重启,那要看参数化配置的是哪一个具体的按钮对象,如果参数化的是开机的命令对象,那就执行开机的功能,如果参数化的是重启的命令对象,那就执行重启的功能。虽然按下的是同一个按钮,但是请求是不同的,对应执行的功能也就不同了。
在模式讲解的时候会给大家一个参数化配置的示例,这里就不多讲了。至于对请求排队或记录请求日志,以及支持可撤销的操作等功能,也放到模式讲解里面。
3 模式讲解
3.1 认识命令模式
(1)命令模式的关键
命令模式的关键之处就是把请求封装成为对象,也就是命令对象,并定义了统一的执行操作的接口,这个命令对象可以被存储、转发、记录、处理、撤销等,整个命令模式都是围绕这个对象在进行。
(2)命令模式的组装和调用
在命令模式中经常会有一个命令的组装者,用它来维护命令的“虚”实现和真实实现之间的关系。如果是超级智能的命令,也就是说命令对象自己完全实现好了,不需要接收者,那就是命令模式的退化,不需要接收者,自然也不需要组装者了。
而真正的用户就是具体化请求的内容,然后提交请求进行触发就好了。真正的用户会通过invoker来触发命令。
在实际开发过程中,Client和Invoker可以融合在一起,由客户在使用命令模式的时候,先进行命令对象和接收者的组装,组装完成后,就可以调用命令执行请求。
(3)命令模式的接收者
接收者可以是任意的类,对它没有什么特殊要求,这个对象知道如何真正执行命令的操作,执行时是从command的实现类里面转调过来。
一个接收者对象可以处理多个命令,接收者和命令之间没有约定的对应关系。接收者提供的方法个数、名称、功能和命令中的可以不一样,只要能够通过调用接收者的方法来实现命令对应的功能就可以了。
(4)智能命令
在标准的命令模式里面,命令的实现类是没有真正实现命令要求的功能的,真正执行命令的功能的是接收者。
如果命令的实现对象比较智能,它自己就能真实地实现命令要求的功能,而不再需要调用接收者,那么这种情况就称为智能命令。
也可以有半智能的命令,命令对象知道部分实现,其它的还是需要调用接收者来完成,也就是说命令的功能由命令对象和接收者共同来完成。
(5)发起请求的对象和真正实现的对象是解耦的
请求究竟由谁处理,如何处理,发起请求的对象是不知道的,也就是发起请求的对象和真正实现的对象是解耦的。发起请求的对象只管发出命令,其它的就不管了。
(6)命令模式的调用顺序示意图
使用命令模式的过程分成两个阶段,一个阶段是组装命令对象和接收者对象的过程,另外一个阶段是触发调用Invoker,来让命令真正执行的过程。
先看看组装过程的调用顺序示意图,如图4所示:
图4 命令模式组装过程的调用顺序示意图
接下来再看看真正执行命令时的调用顺序示意图,如图5所示:
图5 命令模式执行过程的调用顺序示意图
3.2 参数化配置
所谓命令模式的参数化配置,指的是:可以用不同的命令对象,去参数化配置客户的请求。
像前面描述的那样:客户按下一个按钮,到底是开机还是重启,那要看参数化配置的是哪一个具体的按钮对象,如果参数化的是开机的命令对象,那就执行开机的功能,如果参数化的是重启的命令对象,那就执行重启的功能。虽然按下的是同一个按钮,相当于是同一个请求,但是为请求配置不同的按钮对象,那就会执行不同的功能。
把这个功能用代码实现出来,一起来体会一下命令模式的参数化配置。
(1)同样先定义主板接口吧,现在想要添加一个重启的按钮,因此主板需要添加一个方法来实现重启的功能,示例代码如下:
/**
* 主板的接口
*/
public interface MainBoardApi {
/**
* 主板具有能开机的功能
*/
public void open();
/**
* 主板具有实现重启的功能
*/
public void reset();
}
接口发生了改变,实现类也得有相应的改变,由于两个主板的实现示意差不多,因此还是只示例一个,示例代码如下:
/**
* 技嘉主板类,命令的真正实现者,在Command模式中充当Receiver
*/
public class GigaMainBoard implements MainBoardApi{
/**
* 真正的开机命令的实现
*/
public void open(){
System.out.println("技嘉主板现在正在开机,请等候");
System.out.println("接通电源......");
System.out.println("设备检查......");
System.out.println("装载系统......");
System.out.println("机器正常运转起来......");
System.out.println("机器已经正常打开,请操作");
}
/**
* 真正的重新启动机器命令的实现
*/
public void reset(){
System.out.println("技嘉主板现在正在重新启动机器,请等候");
System.out.println("机器已经正常打开,请操作");
}
}
(2)该来定义命令和按钮了,命令接口没有任何变化,原有的开机命令的实现也没有任何变化,只是新添加了一个重启命令的实现,示例代码如下:
/**
* 重启机器命令的实现,实现Command接口,
* 持有重启机器命令的真正实现,通过调用接收者的方法来实现命令
*/
public class ResetCommand implements Command{
/**
* 持有真正实现命令的接收者——主板对象
*/
private MainBoardApi mainBoard = null;
/**
* 构造方法,传入主板对象
* @param mainBoard 主板对象
*/
public ResetCommand(MainBoardApi mainBoard) {
this.mainBoard = mainBoard;
}
public void execute() {
//对于命令对象,根本不知道如何重启机器,会转调主板对象
//让主板去完成重启机器的功能
this.mainBoard.reset();
}
}
(3)持有命令的机箱也需要修改,现在不只一个命令按钮了,有两个了,所以需要在机箱类里面新添加重启的按钮,为了简单,没有做成集合。示例代码如下:
/**
* 机箱对象,本身有按钮,持有按钮对应的命令对象
*/
public class Box {
private Command openCommand;
public void setOpenCommand(Command command){
this.openCommand = command;
}
public void openButtonPressed(){
//按下按钮,执行命令
openCommand.execute();
}
/**
* 重启机器命令对象
*/
private Command resetCommand;
/**
* 设置重启机器命令对象
* @param command
*/
public void setResetCommand(Command command){
this.resetCommand = command;
}
/**
* 提供给客户使用,接收并相应用户请求,相当于重启按钮被按下触发的方法
*/
public void resetButtonPressed(){
//按下按钮,执行命令
resetCommand.execute();
}
}
(4)看看客户如何使用这两个按钮,示例代码如下
public class Client {
public static void main(String[] args) {
//1:把命令和真正的实现组合起来,相当于在组装机器,
//把机箱上按钮的连接线插接到主板上。
MainBoardApi mainBoard = new GigaMainBoard();
//创建开机命令
OpenCommand openCommand = new OpenCommand(mainBoard);
//创建重启机器的命令
ResetCommand resetCommand = new
ResetCommand(mainBoard);
//2:为机箱上的按钮设置对应的命令,让按钮知道该干什么
Box box = new Box();
//先正确配置,就是开机按钮对开机命令,重启按钮对重启命令
box.setOpenCommand(openCommand);
box.setResetCommand(resetCommand);
//3:然后模拟按下机箱上的按钮
System.out.println("正确配置下
------------------------->");
System.out.println(">>>按下开机按钮:>>>");
box.openButtonPressed();
System.out.println(">>>按下重启按钮:>>>");
box.resetButtonPressed();
//然后来错误配置一回,反正是进行参数化配置
//就是开机按钮对重启命令,重启按钮对开机命令
box.setOpenCommand(resetCommand);
box.setResetCommand(openCommand);
//4:然后还是来模拟按下机箱上的按钮
System.out.println("错误配置下
------------------------->");
System.out.println(">>>按下开机按钮:>>>");
box.openButtonPressed();
System.out.println(">>>按下重启按钮:>>>");
box.resetButtonPressed();
}
}
运行一下看看,很有意思,结果如下:
软件设计模式(Java版)习题 第1章软件设计模式基础 1.1 软件设计模式概述 1.2 UML中的类图 1.3 面向对象的设计原则 一、名词解释 1.一个软件实体应当对扩展开放,对修改关闭,即在不修改源代码的基础上扩展 一个系统的行为。 2.一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。 3.在软件中如果能够使用基类对象,那么一定能够使用其子类对象。 4.是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结, 使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 二、单选择题 1.( A ) 2.( A ) 3. ( A ) 4. ( D ) 5. ( D ) 6.( A ) 7. ( D ) 8.( D ) 9.( D ) 10.( E ) 11.( C ) 12.( C ) 13. ( A ) 三、多选择题 1.( A、B、C、D ) 2. ( A、B ) 3.( A、D ) 4.( A、B、C、D ) 四、填空题 1.依赖倒转、迪米特法则、单一职责 2.模式名字、目的、问题、解决方案、效果、实例代码 3.超类、子类 4.开闭 5.用户 6.依赖倒转 7.组合/聚合 8.结构型、行为型 9.依赖倒转 10.开闭 11.需求收集是否正确、体系结构的构建是否合理、测试是否完全 12.人与人之间的交流 13.接口 14.名称、目的、解决方案 15.对象组合、类继承
16.对象组合 17.对象组合、类继承 18.抽象类的指针 五、简答题 1.答:设计模式按类型分为以下三类: 1)创建型设计模式:以灵活的方式创建对象集合,用于管理对象的创建。 2)结构型设计模式:将己有的代码集成到新的面向对象设计中,用于处理类或对象的组合。 3)行为型设计模式:用于描述对类或对象怎样交互和怎样分配职责。 2.答:设计模式的主要优点如下: 1)设计模式融合了众多专家的经验,并以一种标准的形式供广大开发人员所用,它提供了一套通用的设计词汇和一种通用的语言以方便开发人员之间沟通和交 流,使得设计方案更加通俗易懂。 2)设计模式使人们可以更加简单方便地复用成功的设计和体系结构,将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。设计模式使得重用成功的设计更加容易,并避免那些导致不可重用的设计方案。 3)设计模式使得设计方案更加灵活,且易于修改。 4)设计模式的使用将提高软件系统的开发效率和软件质量,且在一定程度上节约设计成本。 5)设计模式有助于初学者更深入地理解面向对象思想,一方面可以帮助初学者更加方便地阅读和学习现有类库与其他系统中的源代码,另一方面还可以提高软件的设计水平和代码质量。 3.答:设计模式一般有如下几个基本要素:模式名称、问题、目的、解决方案、效 果、实例代码和相关设计模式,其中的关键元素包括模式名称、问题、解决方案和效果。 4.答:正确使用设计模式具有以下优点: ⑴可以提高程序员的思维能力、编程能力和设计能力。 ⑵使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从 而缩短软件的开发周期。 ⑶使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。 5.答:根据类与类之间的耦合度从弱到强排列,UML中的类图有以下几种关系:依赖关 系、关联关系、聚合关系、组合关系、泛化关系和实现关系。其中泛化和实现的耦合度相等,它们是最强的。
HTML各种命令的代码 跑马灯 普通卷动 滑动 预设卷动 来回卷动向下卷动 向上卷动 向右卷动 向左卷动 卷动次数 设定宽度 设定高度 设定背景颜色设定卷动距离设定卷动时间 字体效果
SD模式的命令说明: Class0 :(卡的识别、初始化等基本命令集) : CMD0 GO_IDLE_STA TE Mandatory Mandatory Used to change from SD to SPI mode /* 使SD卡进入Idle状态复位SD卡*/ CMD1 读OCR寄存器,是否为SD卡 CMD2 ALL_SEND_CID Mandatory CID not supported by SDIO /* 广播获取卡的CID信息*/ CMD3 SEND_RELATIVE_ADDR Mandatory Mandatory /* 广播获取SD卡所分配的相对地址*/ CMD4 SET_DSR Optional DSR not supported by SDIO CMD5 IO_SEND_OP_COND Mandatory CMD6 SWITCH_FUNC Mandatory1 Mandatory1 Added in Part 1 v1.10 CMD7 SELECT/DESELECT_CARD Mandatory Mandatory /* 根据获取指定的RCA,选中SD卡,如果 在选中一个卡的状态下,又选中其他的卡,那么之前的卡会自动取消选中,如果发送地址0,则表示取消选中全部卡*/ CMD8 SDIO_SEND_IF_COND获取卡的版本 CMD9 SEND_CSD Mandatory CSD not supported by SDIO /* 获取SD相关的存储信息,如 块大小,容量等. */ CMD10 SEND_CID Mandatory CID not supported by SDIO Class2 (读卡命令集): CMD12 STOP_TRANSMISSION Mandatory /* 停止多块传输操作*/ CMD13 SEND_STATUS Mandatory Card Status includes only SDMEM information /* 获取卡的状态*/ CMD15 GO_INACTIVE_STA TE Mandatory Mandatory CMD16 SET_BLOCKLEN Mandatory /* 设置SD卡的块大小,CSD寄存器有描述. */ CMD17 READ_SINGLE_BLOCK Mandatory /* 使SD卡进入传输状态,读取单个块*/ CMD18 READ_MULTIPLE_BLOCK Mandatory /* 使SD卡进入传输状态,读取多个块,直到收到 CMD12为止*/ Class4(写卡命令集) : CMD24 WRITE_BLOCK Mandatory /* 使SD卡进入传输状态,写入单个块*/ CMD25 WRITE_MULTIPLE_BLOCK Mandatory /* 使SD卡进入传输状态,写入多个块*/ CMD27 PROGRAM_CSD Mandatory CSD not supported by SDIO 写CSD寄存器Class6(写保护命令集): CMD28 SET_WRITE_PROT Optional 设置写保护块的地址 CMD29 CLR_WRITE_PROT Optional 擦除写保护块的地址 CMD30 SEND_WRITE_PROT Optional 查询保护状态 Class5 (擦除卡命令集): CMD32 ERASE_WR_BLK_START Mandatory 设置擦除块的起始地址 CMD33 ERASE_WR_BLK_END Mandatory 设置擦除块的中止地址 CMD38 ERASE Mandatory 擦出所选择的的块 class7(卡的锁定,解锁功能命令集):
MTK平台手机指令大全 设置指令:*#66*# 中文语言:*#0086# + send 查看版本:*#8375# 软件版本:*#8882# 测试:*#87# 调试:*#8899# (?) 默认语言:*#0000#+通话键 设置英文:*#0044#+通话键 繁体中文:*#0886#+通话键 简体中文:*#0086#+通话键 串号查询:*#06# 原厂设置:*#66*# 查看版本:*#8375# 工厂指令:*#3646633# 自动测试:*#87# 软件版本:*#8882# *#035670766*001# *#035670766*002# 有一些机器开机输入*#66*#不进测试的。可以在开机瞬间,在按键灯亮和开机音乐响的时候快速按*#*#............*#就可进入测试 科达Q191(MT6228平台)有些好象不支持,可惜啊.......... 诺基亚是国际知名手机品牌,它在中国市场上一直占据着很大一部分销售份额。诺基亚手机拥有着时尚的外观和强大的功能,尤其是它出色的性能,经久耐用。是赢得很多消费者喜爱的主要原因。不少消费者在购买诺基亚手机之后,都会拿着说明书仔细阅读使用说明。然而,不管是什么牌子的手机除了说明书上的那些说明文字之外,都还有很多用户并不知晓的操作命令!而这些使用命令却能够给我们的使用上提供很大的帮助。 1 输入*#06#:显示IMEI码 2 输入*#0000#:显示软件版本(部分型号如果不起作用,可按*#型号代码#,如*#6110#) 第一行--软件版本; 第二行--软件发布日期; 第三行--手机型号 3 输入*#92702689#查询更多的手机信息。有五个选项(可用上下方向键选择): ①Serial No.:手机的IMEI码。
DotA Imba 常用指令及模式介绍 作者:来源:发布时间:2010-11-19 11:51:47 DOTA正式版常用命令 -ap 全选模式玩家可以选择所有酒馆的英雄。 -ar 全体随机模式玩家从所有酒馆的范围里自动随机得到一个英雄。 -rd 随机征召模式22个随机英雄从所有酒馆里选出来,并且围成一个圈。剩下的英雄和酒馆全部移除。然后玩家按照1-2-2-1-1-2-2-1-1-2的顺序选择英雄。(IM模式下玩家选择英雄的顺序是随机的,并延长了玩家准备时间) -dm 死亡竞赛模式如果你的英雄死了,你会在复活时间到的时候重新选一个英雄。如果主游戏模式是随机,那么你将随机得到那个英雄。如果一个团队有44次死亡,或者基地被拆,团队就输了。补充说明:第一个玩家可以在选择死亡竞赛模式后15秒内输入下面的命令,需要分开输入。 -nd取消死亡计时器当英雄死亡后不需要复活时间立即可以选下一个英雄。 -du 复选模式玩家选了某一个英雄后,该英雄不被从酒馆移除,其他玩家还可以选。 -sp 洗牌模式团队将被随机洗牌,包括颜色、团队归属、团队人数都可能变更。 -sc 超级士兵模式某些时候每方会各产生超级士兵跟随小兵进攻。最弱的是攻城傀儡,强一点的是恐怖怪鱼,最强的是远古九头蛇。 -mc 变种超级兵模式一个改进的超级兵模式。超级士兵从开局4分钟开始出动,每2分钟出动一次. 第一波为恐怖怪鱼. 九头蛇怪将在开局20分钟后才会出现. 40分钟后,将同时出动2只超级士兵. 超级士兵也将出现在同一条道路上。 -st 超级塔模式所有建筑会自动快速回血。-fr 快速复活模式英雄复活时间减半。选择英雄时的相关命令 -random 随机选择英雄随机选择一个英雄,不消耗金钱。 -repick 重新选择英雄花费一定钱,让你放弃已选择的英雄而重新选。只能使用一次,一般消耗150金钱,但在-ar中消耗400 。如果是随机英雄模式,新英雄也是随机的。在禁止重选模式下,不能使用这个命令。 -swap 1/2/3/4/5 交换英雄命令向你想交换的英雄序号玩家提交交换请求。如果他也向你提交请求,交换成功。交换命令可以多次使用,但是只能在开局后90秒前使用。 游戏中使用的相关命令 -ma 显示阵容显示对方控制的英雄以及等级,也显示离线玩家的离线时间。 -ms 显示移动速度显示你英雄的当前移动速度。 -apm 查看apm命令查看玩家当前的手速,即每分钟的平均操作次数。 -ii 记分板上显示盟友装备 -ha 查看屠夫钩子命中率
摘要: 随着软件系统规模和复杂性的增加, 人们对软件的可靠性和生产效率也提出了更高的要求, 软件重用在当前比以往任何时候都显得重要. 设计模式是系统设计阶段的软件重用, 使得那些具有良好性能的设计方案可以在相似环境下被再次复用. 设计模式以文档的形式把面向对象的软件设计经验记录下来, 并予以系统的命名、解释和评价, 使开发人员在进行系统的设计与开发时, 可以使用别人的成功经验而不必为普通的、重复的问题重新设计解决方案,使设计者更容易理解其设计思路,能为自己的问题找到更合适的解决办法,帮助设计者更快更好地完成系统设计. 1.设计模式简介 设计模式是针对面向对象系统中重复出现的设计问题,提出一个通用的设计方案,并予以系统化的命名和动机解释。它描述了问题,提出了解决方案,并指出在什么条件下使用该方案以及其效果。该解决方案是解决该问题的一组精心安排的通用的类和对象,再经过定制和实现就可用来解决特定的上下文中的问题。简单来说,设计模式就是一个常用的方案。在我们的开发过程中经常会遇到一些相同或相近的问题,如果每次都寻找一个相应的解决办法&那么就会增加开发时间,降低开发效率。为了节省时间&提高开发效率&就需要提供一些解决类似问题的,在应用中被证明可行的方案设计模式。所以一个设计模式就是描述了一个被证明可行的方案,这些方案可以重用,有良好的伸缩性。一般而言,一个设计模式有四个要素: 1.模式名称 2.问题。 3.解决方案。 4.效果。 2.设计模式的分类 根据两条准则对模式进行分类,范围准则和目的准则。 范围准则,即指定设计模式主要是用于类还是用于对象。设计模式据此可分 为: (1)类设计模式:处理类和子类之间的关系,这些关系通过继承建立,是静态的,在编译时刻便确定下来了。 (2)对象设计模式:处理对象间的关系,这些关系在运行时刻是可以变化的,更具动态性。从某种意义上来说,几乎所有设计模式都使用继承机制,所以“类设计模式”只指那些集中于处理类间关系的设计模式,而大部分设计模式都属于对象设计模式的范畴。 目的准则,即设计模式是用来完成什么工作的。设计模式据此可分为: (l)创建型设计模式:与类或对象的创建有关; (2)结构型设计模式:处理类或对象的组合; (3)行为型设计模式:对类或对象怎样交互和怎样分配职责进行 描述。 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 3.设计模式的六大原则 1.单一职责原则:一个类应该只有一个职责。 优点:降低类的复杂性;提高类的可读性;提高代码的可维护性和复用性;降低因变更引
命令模式常用操作 h(或向左方向键)--- 光标左移一个字符 j(或向下方向键)--- 光标下移一个字符 k(或向上方向键)--- 光标上移一个字符 l(或向右方向键)--- 光标右移一个字符 [Ctrl] + f--- 屏幕向下移动一页(相当于Page Down键) [Ctrl] + b--- 屏幕向上移动一页(相当于Page Up键) [0]或[Home]--- 光标移动到当前行的最前面 [$]或[End]--- 光标移动到当前行的末尾 G--- 光标移动到文件的最后一行(第一个字符处) nG--- n为数字(下同),移动到当前文件中第n行 gg--- 移动到文件的第一行,相当于"1G" n[Enter]--- 光标向下移动n行 /word--- 在文件中查找内容为word的字符串(向下查找) ?word--- 在文件中查找内容为word的字符串(向上查找) [n]--- 表示重复查找动作,即查找下一个 [N]--- 反向查找下一个 :n1,n2s/word1/word2/g--- n1、n2为数字,在第n1行到第n2行之间查找word1字符串,并将其替换成word2 :1,s/word1/word2/g--- 从第一行(第n行同理)到最后一行查找word1注册,并将其替换成word2:1,s/word1/word2/g--- 从第一
行(第n行同理)到最后一行查找word1注册,并将其替换成word2:1, s/word1/word2/gc--- 功能同上,只不过每次替换时都会让用户确认x,X--- x为向后删除一个字符,相当于[Delete],X为向前删除一个字符,相当于[Backspace] dd--- 删除光标所在的一整行 ndd--- 删除光标所在的向下n行 yy--- 复制光标所在的那一行 nyy--- 复制光标所在的向下n行 p,P--- p为将已经复制的数据在光标下一行粘贴;P为将已经复制的数据在光标上一行粘贴 u--- 撤消上一个操作 [Ctrl] + r--- 多次撤消 .--- 这是小数点键,重复上一个操作 命令模式切换到编辑模式的操作 1、进入插入模式(6个命令) i--- 从目前光标所在处插入 I--- 从目前光标 a--- 从当前光标所在的下一个字符处开始插入 A--- 从光标所在行的最后一个字符处开始插入 o--- 英文小写字母o,在目前光标所在行的下一行处插入新的一行并开始插入
常用命令: A——ARC——圆弧B——BLOCK——块定义C——CIRCLE——圆D——DIMSTYLE——标注样式E/DEL键——ERASE——删除F——FILIET——倒圆角H——BHATCH——填充L——LINE——直线 M/S——MOVE——移动O——OFFSET——偏移P——PAN——实时平移(图标为小手)X——EXPLODE——分解PO——POINT——点XL——XLINE——射线ML——MLINE——多线PL——PLINE——多段线POL——POLYGON——正多边形REC——RECTANGLE——矩形DO——DONUT——圆环EL——ELLIPSE——椭圆CO——COPY——复制MI——MIRROR——镜像AR——ARRAY——阵列RO——ROTATE——旋转TR——TRIM——修剪EX——EXTEND——延伸CHA——CHAMFER——倒角F——FILIET——倒圆角BR——BREAK——打断 尺寸标注: DLI——DIMLINEAR——直线标注DAL——DIMALIGNED——对齐标注DRA——DIMRADIUS——半径标注DDI——DIMDIAMETER——直径标注DAN——DIMANGULAR——角度标注DCE——DIMCENTER——中心标注DOR——DIMORDINATE——点标注TOL——TOLERANCE——标注形位公差LE——QLEADER——快速引出标注DBA——DIMBASELINE——基线标注DCO——DIMCONTINUE——连续标注DED——DIMEDIT——编辑标注DOV——DIMOVERRIDE——替换标注系统变量 常用CTRL快捷键: 【CTRL】+1—PROPERTIES—修改特性【CTRL】+2—ADCENTER—设计中心 【CTRL】+O——OPEN——打开文件【CTRL】+N/M——NEW——新建文件 【CTRL】+P——PRINT——打印文件【CTRL】+S——SAVE——
命令模式 为方便用户对路由器进行配置和管理,ZXR10ZSR根据功能和权限将命令分配到不同的 模式下,一条命令只有在特定的模式下才能执行,在任何命令模式下输入问号(?)都可 以查看该模式下允许使用的命令。ZXR10ZSR的命令模式主要包括以下几种: 1. 用户模式 2. 特权模式 3. 全局配置模式 4. 接口配置模式 5. 路由配置模式 6. 诊断模式 1.2.1 用户模式 当使用超级终端方式登录系统时,将自动进入用户模式;当使用Telnet方式登录时,用户输入登录的用户名和密码后进入用户模式。用户模式的提示符是路由器的主机名后跟一个“>”号,如下所示(缺省的主机名是ZXR10): ZXR10> 用户模式下可以执行ping,telnet等命令,还可以查看一些系统信息。 1.2.2 特权模式 在用户模式下输入enable命令和相应口令后,即可进入特权模
式,如下所示: ZXR10>enable Password: (输入的密码不在屏幕上显示) ZXR10# 在特权模式下可以查看到更详细的配置信息,还可以进入配置模式对整个路由器进行配置,因此必须用口令加以保护,以防止未授权的用户使用。 要从特权模式返回到用户模式,则使用disable命令。 1.2.3 全局配置模式 在特权模式下输入configterminal命令进入全局配置模式,如下所示: ZXR10#config terminal Enter configuration commands,one par line,End with Ctrl-Z。 ZXR10(config)# 全局配置模式下的命令作用于整个系统,而不仅仅是一个协议或接口。 要退出全局命令模式并返回到特权模式,输入exit或end命令,或按<CTRL+Z>。 1.2.4 接口配置模式 在全局配置模式下使用interface命令进入接口配置模式,举例如下: ZXR10(config)#interface fei_2/1
注: 文档内容基本上来自于网上,并加上自己的理解而成。有的觉得网友总结得非常好,就完全照搬下来,供学习之用。然而,有的摘抄并没有加上原链接和出处,请谅解。 通过命令模式,通过在客户端和具体的命令之间添加一层Invoker,剪断了客户端和具体服务提供者之间的耦合,降低了两者之间的耦合度,同时也增加了灵活性,比如我们可以灵活的某一个请求的服务提供者,通过单独的服务提供者Command类,可以很方便的提供redo和undo的功能等等,这些都是命令模式的优势。 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦合。这就是命令模式(Command Pattern) 即命令模式的核心是要解决“行为请求者”和“行为实现”都之间的耦合,以达到灵活多变的效果。 目标: 客户只需要发命令,而不需要管命令是如何被执行的!Command pattern From Wikipedia,the free encyclopedia In object-oriented programming,the command pattern is the method and values for the method parameters.
?
? ? ? ? ? ? ? ? ? ? [edit]Uses
[edit]Structure
UPDATE:The explanation for the Receiver block above should be "The actual work to be done by the command(action)" [edit]Terminology 1.Ambiguity. 2.The term command is ambiguous.For example,move up,move up may refer to a single
DOTA全部模式命令 在下列命令前键入"-o", "-c" 或" c"作为前缀: (例. "-oa", "-ca", " ca"都是合法命令) 提示: XX 代表玩家代号(1,2,..,10), 你可以用","隔开输入多个代号(例. "-oa 2,4,5") a 或a XX: AI攻击敌方基地。此命令可用来取消sd。 当你使用该命令时,AI将有一段时间不会去打野或保卫基地。 d 或d XX: AI防御我方基地。 sd XX: AI留守我方基地。当基地中仍有敌方战斗力时,AI会一直留守,直到敌方撤退。 可以使用a命令来取消。 b XX: AI战线稍微退后。 f XX: AI向喷泉撤退。 p[l/m/r/n]: (例. -cpm 全民中路推) 所有友方AI向一路推进(l、m、r代表左、中、右),此命令能否被响应取决于AI是否空闲。 键入pn意味着让AI选择一路他们比较喜欢的路推。 g[l/m/r] XX: (例. -cgl 3,5 命令3,5号AI左路推) 指定友方AI立刻向一路推进(l、m、r代表左、中、右)(即时)。 AI将会火速前往指定路线的友方的后方。 t XX [目标]: (例. -ct 1,4 8)(命令1,4号AI攻击8号玩家) 攻击目标所在地(前提是目标可见)。 neut: 打开/关闭AI打野怪开关。 auto: 打开/关闭AI自动换路开关。 roshan, roshanXX: AI攻击Roshan。 ui: 显示命令列表。你也可以仅仅键入一个空格来显示此列表。 tango:吃树代替治疗药膏(必须在60秒内输入) flask:治疗药膏代替吃树(必须在60秒内输入) 以下命令不需要输入-o或者-c -aiunstuck XX :命令卡住的AI返回基地 -pa:手选友方AI -pe:手选敌方AI -px:取消手选AI -airepick XX:命令AI重新选择英雄(既可以是友方也可以是敌方) 只有出现提示的玩家可以使用以上命令。-pa/-pe命令可以使您在酒馆中为AI点选英雄。 只有你还未选择英雄时才可以使用上述命令。 使用-px来取消为AI选择英雄。 如果你未在45秒内使用-pa/-pe命令,AI将会自选英雄,并且该命令失效。
【Dota Imba命令大全】 三选一模式指令_最新Dota Imba3.79b命令 DOTA IMBA这张图拥有许多有趣的命令,而其中有很多是正常的DOTA版本所没有的,这些命令可以带给玩家更多的娱乐和体验。 进入游戏后,玩家既可以使用正常DOTA版本的所有命令(如-AP -RD -RDSP 等等),也可以将正常模式下的命令与IM模式下的命令混合使用,以达到更有趣的游戏体验。在这里,小编为您整理了一些IM模式下的专有命令,供玩家体验IM的乐趣。 如果你要同时开启-cn,-sl命令,你只需要输入-c nsl,多个命令以此类推。(如-ardmimssstscakfefnbb) 推荐模式1:-ardmssstscakfefnbb,然后再键入-nd(死亡随机模式,死亡后立即复活,注意要连续输入) —此模式下英雄会随机获得5个技能(1级的时候有2个,其他技能随着英雄升级而获得),死亡之后会更换英雄和技能。此模式被称为随机死亡模式,比较注重人品。 推荐模式2:-sdstscakfefrfnbb(三选一模式) —此模式下每个人会从随机的三个英雄——力量\敏捷\智力中选择一个,技能为所选英雄原有技能,另随机获得一个额外技能。此模式则是著名的三选一模式,很考验对英雄的了解程度。 推荐模式3:-ZMR —在最新dota imba3.76版本中输入此命令,将自动开启三选一模式。 -im 开启IM模式(想玩IM版地图的必选模式,想玩DOTA IMBA必须开启的模式)。注:3.72版以后不需要输入-im,默认为im模式,直接输入正常的游戏模式(-ap,rd等)就行对战。 -cn 在该模式下AI英雄的技能不会IM化。
设计模式主要分三个类型:创建型、结构型和行为型。 其中创建型有: 一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点 二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。 三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。 四、Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。 五、Prototype,原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。 行为型有: 六、Iterator,迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。 七、Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。 八、Template Method,模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。 九、Command,命令模式:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作。 十、State,状态模式:允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了他的类。 十一、Strategy,策略模式:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。 十二、China of Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系 十三、Mediator,中介者模式:用一个中介对象封装一些列的对象交互。 十四、Visitor,访问者模式:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作。 十五、Interpreter,解释器模式:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 十六、Memento,备忘录模式:在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 结构型有: 十七、Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性。 十八、Facade,外观模式:为子系统中的一组接口提供一致的界面,fa?ade 提供了一高层接口,这个接口使得子系统更容易使用。 十九、Proxy,代理模式:为其他对象提供一种代理以控制对这个对象的访问
描述: 通常,面向对象应用程序是由一组能够提供有限的、专注于功能的相互交互的对象集合组成。为了响应用户的交互动作,应用程序执行一系列的处理。为了响应用户的请求,应用程序使用不同的对象提供的服务处理请求。根据实现,应用可以指定一个对象,这个指定的对象可以调用不同对象上的操作,被称为调用者(invoker)。(译者注:其实个人认为这个invoker在这里主动地成分更大,它是偏向于调用其他对象,这个区别就像英语employ这个动词是雇佣的意思,employee是员工??被雇佣的对象,而employer是雇主??雇佣的主动者,那么在这里的invoker是一个道理)。调用者(invoker)可以看作为客户应用程序的一部分。那些包含提供处理请求服务实现的对象集合成为接受对象(Receiver Object)。 Figure 30.1: Object Interaction?Before Applying the Command Pa ttern 在这种设计中,发出请求的应用程序和提供处理请求服务的接受对象(Receiver Object)集合之间彼此是紧密关联的,因为它们之间直接相互交互。这导致了在调用者(invoker)实现中会包含大量的if条件语句。 1.… 2.if(RequestType=TypeA){ 3.//do something 4.} 5. 6.if(RequestType=TypeB){ 7.//do something 8.} 9.… 当一种新的处理类型需要加入的应用时,现存的代码需要进行修改??这违背了面向对象开放?关闭的基本原则。 1.… 2.if(RequestType=TypeA){ 3.//do something 4.} 5.… 6.if(RequestType=NewType){ 7.//do something 8.}
首先/manuadd xx gm? 如果要使用这个命令,需要自己先有权限 在控制台输入manuadd xx admin 然后添加sethome权限 manselect 世界名字(默认world) 输入mangaddp essentials.sethome default(应该是这个格式不行的话就试试mangaddp default essentials.sethome) 这样就添加完sethome权限了 另外你启动完成之后输入plugins命令看看插件,把插件截图发出来 默认拥有全部权限的是admin 【单机】 ascend - 把自己提升到上一个平台 bind <命令> {命令关键字} - 设置一键命令 clear - 清空控制台 damage - 关闭或者开启伤害即无敌 descend - 把自己移动到下面一个的平台 destroy [all] - 破坏当前的东西(背包) defuse [all] - 拆弹(拆除已经点燃了的TNT炸药) diff - X difficulty - 设置游戏难度 dropstore - 在身边创建一个储物柜 *drops - 开关物品掉落,关闭的话采矿打怪不掉东西。 dupe [all] - 复制东西 duplicate [all] - 复制手上的东西并丢出来
explode [范围] - 设置一个地方爆炸(在自家慎用) extinguish [all] - 熄灭周围所有的火 ext [all] - 一样是熄灭火 falldamage - 开关高空落下伤害 firedamage - 开关火的伤害 fly - 飞行模式 *freeze - 冻结怪物 give <物品> [数量] - 给一样物品 goto <名字> - 去一个地方 grow [all] - 让立即小麦成长 h [COMMAND] - 命令列表/帮助 heal - 补指定的血 health - 设置生命值 help [COMMAND] - 命令列表/帮助 home 回到出生点 i <物品代码> [数量] - 刷东西 instantmine - 开关即时采矿(采矿无延迟) item <物品代码|物品名称> [数量] [费用] 给玩家物品, 如果不指定则是最大的数量itemname - 显示当前手上的物品名称 itemstack <物品代码> [数量] - 给玩家指定数量的物品 kill 自杀不解释 jump - 瞬移到鼠标所指的地方 killnpc [all] - 杀死周围全部NPC 或者叫杀了附近所有除自己外的活体生物 l - X
实验5 结构型和行为型设计模式实验 实验学时: 2 每组人数: 1 实验类型: 3 (1:基础性2:综合性3:设计性4:研究性) 实验要求: 1 (1:必修2:选修3:其它) 实验类别: 3 (1:基础2:专业基础3:专业4:其它) 一、实验目的 熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的结构型和行为型设计模式,包括代理模式、职责链模式和命令模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。 二、实验内容 1. 在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,例如在业务方法method()调用之前输出“方法method()被调用,调用时间为2014-11-5 10:10:10”,调用之后如果没有抛异常则输出“方法method()调用成功”,否则输出“方法method()调用失败”。在代理类中调用真实业务类的业务方法,使用代理模式设计该日志记录模块的结构,绘制类图并编程模拟实现。 2. 某软件公司承接了某信息咨询公司的收费商务信息查询系统的开发任务,该系统的基本需求如下: (1) 在进行商务信息查询之前用户需要通过身份验证,只有合法用户才能够使用该查询系统; (2) 在进行商务信息查询时系统需要记录查询日志,以便根据查询次数收取查询费用。 该软件公司开发人员已完成了商务信息查询模块的开发任务,现希望能够以一种松耦合的方式向原有系统增加身份验证和日志记录功能,客户端代码可以无区别地对待原始的商务信息查询模块和增加新功能之后的商务信息查询模块,而且可能在将来还要在该信息查询模块中增加一些新的功能。 试使用代理模式设计并编程模拟实现该收费商务信息查询系统。【提示:使用保护代理和智能引用代理】 3. 某企业的SCM(Supply Chain Management,供应链管理)系统中包含一个采购审批子系统。该企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开董事会讨论决定。如下图所示:
实验四命令模式的运用 一、实验目的: 命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象,命令模式也支持可撤销的操作。在熟悉命令模式相关理论知识的基础上,使用命令模式实现图片处理程序。 二、实验要求: 使用命令模式实现图片处理程序,要求如下: 1.图片处理程序要有3张图片。 2.每张图片至少有3种操作。 3.实现类似遥控器的菜单,动态的选择对图片进行的处理。 4.要有“撤消操作”,撤消操作要可以撤销至最后一步。 1、设计并绘制该程序的类图; 2、依照设计的类图使用Java语言编写代码,并实现该程序; 3、除了核心的模式相关类实现外,提供测试环境,按照难度高低,分别是: a)控制台程序,Client硬编码初始化模式和测试环境,运行结果文本输出; b)控制台程序,Client初始化测试环境,并根据用户输入运算,运行结果文本输出; c)设计并实现用户UI,Client初始化测试环境,并根据用户在UI控件上的输入运算,运 行结果文本输出; 三、实验内容: 类图 代码 package Picture; public interface Command { public void execute(); public void undo(); } package Picture; public class NoCommand implements Command { public void execute() { }
public void undo() { } } package Picture; public class Picture { public static final int enlarge=1; //放大图片; public static final int rotating=2;//旋转图片; public static final int ensmall=3;// 缩小图片; public static final int OFF= 0;//"无操作"; int way; String location; public Picture(String location) { this.location = location; way=OFF; } public void enlarge() { way = enlarge; System.out.println(location + " 已放大"); } public void rotating() { way= rotating; System.out.println(location + " 已旋转180°"); } public void ensmall() { way = ensmall; System.out.println(location + " 已缩小"); } public void OFF() { way= OFF; System.out.println(location + " 无操作"); } public int getWay() { return way; }
广州数控指令代码大全 2011-01-31 02:13 GSK980TA/D编程教材 《一》编程的基本概念 《二》常用G代码介绍 《三》单一固定循环 《四》复合型固定循环 《五》用户宏程序 《六》螺纹加工 《七》T代码及刀补 《八》F代码及G98、G99 《九》S代码及G96、G97 (注意:本教材仅供学习参考,实际操作编程时应以广数 GSK980T车床数控系统使用手册为准)2007年9月 《一》编程的基本概念: 一个完整的车床加工程序一般用于在一次装夹中按工艺要求完成对工件的加工,数控程序包括程序号、程序段。 (一)程序号:相当于程序名称,系统通过程序号可从存储器中多个程序中识别所要处理的程序,程序号由字母O及4位数字组成。 (二)程序段:相当于一句程序语句,由若干个字段组成,最后是一个分号(;)录入时在键入EOB键后自动加上。整个程序由
若干个程序段构成,一个程序段用来完成刀具的一个或一组动作,或实现机床的一些功能。 (三)字段(或称为字):由称为“地址”的单个英语字母加若干位数字组成。根据其功能可分成以下几种类型的字段: ▲程序段号:由字母N及数字组成,位于程序段最前面,主要作用是使程序便于阅读,可以省略,但某些特殊程序段(如表示跳转指令的目标程序段)必须标明程序段号。 为了便于修改程序时插入新程序段,各句程序段号一般可间隔一些数字(如N0010、N0020、N0030)。 ▲准备功能:即G代码,由字母G及二位数字组成,大多数G 代码用以指示刀具的运动。(如G00、G01、G02) ▲表示尺寸(坐标值)的字段:一般用在G代码字段的后面,为表示运动的G代码提供坐标数据,由一个字母与坐标值(整数或小数)组成。字母包括: 表示绝对坐标:X、Y、Z 表示相对坐标:U、V、W 表示园心坐标:I、 J、 K (车床实际使用的坐标只有X、Z,所以Y、V、J都用不着) ▼表示进给量的字段:用字母F加进给量值组成,一般用在插补指令的程序段中,规定了插补运动的速度。 ▼S代码:表示主轴速度的字段。用字母S加主轴每分钟转速(或主轴线速度:米/分)组成。