开发模式:实现Command模式

PxCook开发模式深度体验:如何像‘像素大厨’一样从PSD里‘端出’前端代码? 本文深度解析PxCook开发模式如何高效将PSD设计稿转化为前端代码,提升开发效率60%以上。通过智能标注、多平台代码适配和团队协作优化,PxCook成为前端开发的‘像素大厨’,助力开发者快速实现设计还原。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 概述 有时需要向对象发送请求,但是不知道 "被请求的操作" 或 "请求的接受者" 的任何信息。在面向过程的程序设计语言中,这类通信是通过回调函数来完成的:在某个地方登记这个函数,然后在后面调用它。在面向对象程序中,command(命令)与回调函数等价,它封装了回调函数。本文演示如何在Java中实现Command模式。 --------------------------------------------------------------------------- 设计模式不但可以加速面向对象工程的设计进度,而且可以提高开发小组的产出以及软件的质量。Commad模式是一种对象行为模式,它可以对发送者(sender)和接收者(receiver)完全解耦(decoupling)。("发送者" 是请求操作的对象,"接收者" 是接收请求并执行某操作的对象。有了 "解耦",发送者对接收者的接口一无所知。)这里,"请求"(request)这个术语指的是要被执行的命令。Command模式还让我们可以对 "何时" 以及 "如何" 完成请求进行改变。因此,Command模式为我们提供了灵活性和可扩展性。 在象C这样的程序设计语言中,函数指针常被用来消除庞大的switch语句。(参见 "Java Tip 30: Polymorphism and Java" 获得更详细的介绍)Java没有函数指针,所以我们可以用Command模式来实现回调函数。在下面的第一个代码示例TestCommand.java中,你将实际看到它是如何实现的。 一些开发者在其它语言中已经习惯于使用函数指针,因而他们往往禁不起诱惑,想以同样的方法使用Reflection API的Method对象。例如,在 "Java Reflection" 一文中,Paul Tremblett介绍了如何使用Reflection而不是switch语句来实现事务处理(Transaction) (参见 "相关资源" 获得Tremblett的文章和Sun的Reflection教程网址的链接)。我是不会为这样的诱惑所动的。正如Sun所指出的:在有其它更贴近于Java程序设计语言的工具满足使用要求的情况下,一般不提倡使用Reflect API。不使用Method对象,程序会更易于调试和维护。所以,你应该定义一个接口,并在类中实现它,以执行所需操作。 因此我建议,可以使用Command模式并结合Java的动态加载和绑定机制来实现函数指针。(关于Java的动态加载和绑定机制的详细介绍,参见Gosling和Henry McGilton的"The Java Language Environment -- A White Paper",列于"相关资源"。) 遵循上面的建议,我们可以运用Command模式,利用它所提供的多态性来消除庞大的switch语句,从而设计出可扩展的系统。我们还可以利用Java独有的动态加载和绑定机制来构筑动态的、并且可以动态扩展的系统。这一点在下面第二个代码示例TestTransactionCommand.java中进行说明。 Command模式使请求本身成为一个对象。这个对象和其它对象一样可以被存储和四处传递。这种模式的关键在于一个Command接口:它声明了一个接口,用于执行操作。最简单的形式下,这个接口包含一个抽象的execute操作。每个具体的Command类把接收者作为一个实例变量进行存储,从而指定了一对 "接收者" 和 "行为"。它为execute()方法提供不同的实现以进行请求调用。接收者知道如何执行请求。 如下的图1表示了Switch--一个Command对象的集合体(aggregation)。它的接口中有flipUp()和flipDown()两种操作。Switch被称为 "调用者"(invoker),因为它调用command接口中的execute操作。 具体的command,如LightOnCommand,实现command接口的execute操作。它知道去调用合适的接收者对象的操作。这种情况下它充当了一个适配器(adapter)。通过 "适配器"这一术语, 我想说明:具体的Command对象是一个简单的连接器,它连接具有不同接口的 "调用者" 和 "接收者"。 客户实例化调用者,接收者以及具体的command对象。 图2为时序图,它表示对象间的相互作用。它说明了Command如何对调用者和接收者(以及它执行的请求)解耦。客户用合适的接收者作为构造函数的参数来创建具体的command。然后,它将Command保存在调用者中。调用者回调具体的command,后者知道如何完成想要的Action()操作。 客户(代码中的主程序)创建具体的Command对象并设置它的接收者。作为一个调用者对象,Switch保存具体的Command对象。调用者通过对Command对象调用execute来发送请求。具体的Command对象对它的接收者进行操作调用,从而完成操作请求。 这里最关键的思想在于,具体的command用调用者来注册自身,调用者进行回调,在接收者身上执行命令。 Command模式示例代码 让我们来看一个简单的例子,它通过Command模式实现回调机制。 以Fan(风扇)和Light(灯)为例。我们的目标是设计一个Switch,它可以对任一个对象进行 "开" 和 "关" 的操作。Fan和Light具有不同的接口,这意味着Switch必须独立于接收者接口,或者说,它不清楚接收者的接口。为了解决这一问题,每个Switch都需要合适的command作为参数。很明显,连接到Light的Switch和连接到Fan的Switch具有不同的command。因此,Command类必须是抽象的,或者是个接口。 Switch的构造函数被调用时,它以一组合适的command作为参数。command作为Switch的私有变量保存下来。 调用flipUp()和flipDown()操作时,它们只是简单地让合适的command进行execute()操作。Switch对调用execute()后将发生些什么一无所知。 TestCommand.java class Fan { public void startRotate() { System.out.println("Fan is rotating"); } public void stopRotate() { System.out.println("Fan is not rotating"); } } class Light { public void turnOn( ) { System.out.println("Light is on "); } public void turnOff( ) { System.out.println("Light is off"); } } class Switch { private Command UpCommand, DownCommand; public Switch( Command Up, Command Down) { UpCommand = Up; // concrete Command registers itself with the invoker DownCommand = Down; } void flipUp( ) { // invoker calls back concrete Command, which executes the Command on the receiver UpCommand . execute ( ) ; } void flipDown( ) { DownCommand . execute ( ); } } class LightOnCommand implements Command { private Light myLight; public LightOnCommand ( Light L) { myLight = L; } public void execute( ) { myLight . turnOn( ); } } class LightOffCommand implements Command { private Light myLight; public LightOffCommand ( Light L) { myLight = L; } public void execute( ) { myLight . turnOff( ); } } class FanOnCommand implements Command { private Fan myFan; public FanOnCommand ( Fan F) { myFan = F; } public void execute( ) { myFan . startRotate( ); } } class FanOffCommand implements Command { private Fan myFan; public FanOffCommand ( Fan F) { myFan = F; } public void execute( ) { myFan . stopRotate( ); } } public class TestCommand { public static void main(String[] args) { Light testLight = new Light( ); LightOnCommand testLOC = new LightOnCommand(testLight); LightOffCommand testLFC = new LightOffCommand(testLight); Switch testSwitch = new Switch(testLOC,testLFC); testSwitch.flipUp( ); testSwitch.flipDown( ); Fan testFan = new Fan( ); FanOnCommand foc = new FanOnCommand(testFan); FanOffCommand ffc = new FanOffCommand(testFan); Switch ts = new Switch( foc,ffc); ts.flipUp( ); ts.flipDown( ); } } Command.java public interface Command { public abstract void execute ( ); } 在上面的示例代码中,Command模式将 "调用操作的对象" (Switch)和 "知道如何执行操作的对象" (Light和Fan)完全分离开来。这带来了很大的灵活性:发送请求的对象只需要知道如何发送;它不必知道如何完成请求。 Command模式实现Transaction Command模式也被称为action(动作)模式或transaction(事务)模式。假设有一个服务器,它接收并处理客户通过TCP/IP socket连接发送的transaction。这些transaction包含一个命令,后跟零个或多个 参数。 一些设计者可能会使用switch语句,每个command对应一个case。在一个面向对象工程的设计中,代码中如果使用switch语句,往往表示这是一个糟糕的设计。Command模式展现的是支持transaction的面向对象的方法,它可以用于解决这类设计问题。 在TestTransactionCommand.java程序的客户代码中,所有请求都被封装在通用的TransactionCommand对象中。TransactionCommand对象由客户创建并用CommandManager进行登记。等待的请求可以通过调用runCommands()在不同时期被执行,这带来了很大的灵活性。而且我们还可以将多个command组装成一个复合command。示例代码中还有CommandArgument,CommandReceiver,CommandManager这些类,以及TransactionCommand的子类--AddCommand和SubtractCommand。下面是对这些类的介绍。 · CommandArgument是一个helper类,它保存命令的参数。如果是大量(或可变数量)的任何类型的参数,它可以被重写,以简化参数的传递工作。 · CommandReceiver实现所有的命令处理方法(command-processing method),它用Singleton模式来实现。 · CommandManager是调用者,和前面例子中的Switch相当。它在其私有myCommand变量中保存通用TransactionCommand对象。runCommands()被调用时,它调用合适的TransactionCommand对象的execute()。 Java中,可以根据一个包含类名的字符串查找类的定义。在TransactionCommand类的execute ()操作中,我先计算出类名,然后将它链接到运行系统中--也就是说,类是根据需要被即时载入的。这里所采用的命名方式是,在命令名后连接一个 "Command" 字符串作为transaction command子类名,这样它就可以被动态载入。 注意,newInstance()返回的Class对象必须被转换为合适的类型。这意味着新的类要么必须实现一个接口,要么继承一个在编译期就为程序所知道的现有的类。本例中我们是实现Command接口,所以不存在问题。 file://TestTransactionCommand.java import java.util.*; final class CommandReceiver { private int[] c; private CommandArgument a; private CommandReceiver(){ c = new int[2]; } private static CommandReceiver cr = new CommandReceiver(); public static CommandReceiver getHandle() { return cr; } public void setCommandArgument(CommandArgument a) { this.a = a; } public void methAdd() { c = a.getArguments(); System.out.println("The result is " (c[0] c[1])); } public void methSubtract() { c = a.getArguments(); System.out.println("The result is " (c[0]-c[1])); } } class CommandManager { private Command myCommand; public CommandManager(Command myCommand) { this.myCommand = myCommand ; } public void runCommands( ) { myCommand.execute(); } } class TransactionCommand implements Command { private CommandReceiver commandreceiver; private Vector commandnamelist,commandargumentlist; private String commandname; private CommandArgument commandargument; private Command command; public TransactionCommand () { this(null,null); } public TransactionCommand ( Vector commandnamelist, Vector commandargumentlist){ this.commandnamelist = commandnamelist; this.commandargumentlist = commandargumentlist; commandreceiver = CommandReceiver.getHandle(); } public void execute( ) { for (int i = 0; i < commandnamelist.size(); i ) { commandname = (String)(commandnamelist.get(i)); commandargument = (CommandArgument)((commandargumentlist.get(i))); commandreceiver.setCommandArgument(commandargument); String classname = commandname "Command"; try { Class cls = Class.forName(classname); command = (Command) cls.newInstance(); } catch (Throwable e) { System.err.println(e); } command.execute(); } } } class AddCommand extends TransactionCommand { private CommandReceiver cr; public AddCommand () { cr = CommandReceiver.getHandle(); } public void execute( ) { cr.methAdd(); } } class SubtractCommand extends TransactionCommand { private CommandReceiver cr; public SubtractCommand () { cr = CommandReceiver.getHandle(); } public void execute( ) { cr.methSubtract(); } } class CommandArgument { private int[] args; CommandArgument() { args = new int[2]; } public int[] getArguments() { return args; } public void setArgument(int i1, int i2) { args[0] = i1; args[1] = i2; } } public class TestTransactionCommand { private Vector clist,alist; public TestTransactionCommand() { clist = new Vector(); alist = new Vector(); } public void clearBuffer(Vector c, Vector a) { clist.removeAll(c); alist.removeAll(a); } public Vector getClist() { return clist; } public Vector getAlist() { return alist; } public static void main(String[] args) { CommandArgument ca,ca2; TestTransactionCommand t = new TestTransactionCommand(); ca = new CommandArgument(); ca.setArgument(2,8); Vector myclist = t.getClist(); Vector myalist = t.getAlist(); myclist.addElement("Add"); myalist.addElement(ca); TransactionCommand tc = new TransactionCommand(myclist,myalist); CommandManager cm = new CommandManager(tc); cm.runCommands(); t.clearBuffer(myclist,myalist); ca2 = new CommandArgument(); ca2.setArgument(5,7); myclist = t.getClist(); myalist = t.getAlist(); myclist.addElement("Subtract"); myalist.addElement(ca2); myclist.addElement("Add"); myalist.addElement(ca2); TransactionCommand tc2 = new TransactionCommand(myclist,myalist); CommandManager cm2 = new CommandManager(tc2); cm2.runCommands(); } } 命令及其参数保存在列表中,并被封装成通用TransactionCommand对象。通用TransactionCommand用CommandManager来注册。任何时候,命令可以在CommandManager类中通过调用runCommands()接口来执行。 客户代码不依赖于任何具体的TransactionCommand子类,也就是说,我的设计是针对接口而不是实现。这带来了灵活性:要想增加一个新的命令,只需要定义一个新的TransactionCommand子类,并在CommandReceiver类中提供新的命令处理方法的实现。仅此而已。 结论 Command模式具有以下优点: 1. command将 "进行操作请求" 的对象和 "知道如何执行操作" 的对象分离开来(即,解耦)。 2. command是个很棒的对象。它可以象任何其它对象一样被使用和继承。 3. 多个command可以被组装成一个复合command。 4. 很容易增加新的command,因为不需要修改现有的类。 如果执行过的命令序列被保存在一个历史列表中,就可以遍历这个列表来提供undo和redo操作。要想实现这一功能,必须在Command接口中有一个unexecute()操作。这一练习留给读者自己去完成。 --------------------------------------------------------------------------- 相关资源 · Design Patterns by Gamma, Helm, Johnson, Vlissides, Addison-Wesley, 1994, ISBN 0-201-63361-2 http://www.bookbuyer.com/cgi-bin/getTitle.cgi?ISBN=0201633612 · Dr. Dobb's Journal, January 1998: "Java Reflection: Not just for tool developers," by Paul Tremblett http://www.ddj.com/articles/1998/9801/9801c/9801c.htm · Sun's Reflection page http://java.sun.com/docs/books/tutorial/reflect/index.html · "The Java Language Environment -- A White Paper" (May 1996), by James Gosling and Henry McGilton covers details about Java's dynamic loading and binding mechanism http://java.sun.com/docs/white/langenv/ For more on taking advantage of Java's unique feature of dynamic loading and binding mechanism to build a dynamic and dynamically-extensible system, see http://java.sun.com/docs/white/langenv/
基于STM32的智能鞋柜系统设计与实现 摘要:本文设计并实现了一种基于STM32F103C8T6单片机的智能鞋柜系统。该系统通过DHT11温湿度传感器、PM2.5粉尘传感器和MQ-135空气质量传感器构建多维度环境监测网络,结合光电红外传感器和光敏传感器实现柜门状态识别与智能照明。系统采用分层控制策略,当温度低于15℃或湿度高于65%时自动启动加热和通风,PM2.5超标时启动通风,污染物浓度升高时激活紫外线杀菌。创新性地实现了柜门状态与紫外线消毒的双保险互锁机制,确保使用安全。测试结果表明,系统温湿度控制精度达±0.4℃/±2.0%RH,PM2. 阅读详情

相关推荐

有限元法(Finite Element Method,FEM)原理详解

有限元法( FEM )是一种流行的方法,用于数值求解工程和数学建模中出现的微分方程。

车手只需要车和手,压力来自轮胎 7万+

Java Tip: 实现Command模式

 Java Tip: 实现Command模式概述有时需要向对象发送请求,但是不知道 "被请求的操作" 或 "请求的接受者" 的任何信息。在面向过程的程序设计语言中,这类通信是通过回调函数来完成的:在某个地方登记这个函数,然后在后面调用它。在面向对象程序中,command(命令)与回调函数等价,它封装了回调函数。本文演示如何在Java中实现Command模式。--------------

lostmouse的专栏 2049

飞书应用开发脚手架lark-harness:从零构建企业级机器人

在构建企业级应用时,开发脚手架是提升工程效率和规范性的关键工具。其核心原理在于通过预设的项目模板、最佳实践和通用模块封装,自动化处理项目初始化、配置管理和基础架构搭建。这种技术价值在于将开发者从重复性劳动中解放出来,确保团队技术栈统一,并降低维护成本。在Node.js生态中,脚手架常与Express或Koa等Web框架结合,用于快速构建Web服务、API接口和实时事件处理系统。具体到飞书开放平台开发场景,开发者需要处理OAuth 2.0授权、事件订阅验证、消息加解密等复杂且标准的流程。lark-harnes

weixin_30703911的博客 613

Java设计模式 -16- 命令模式(Command 模式)

Java设计模式 -16- 命令模式(Command 模式)前言命令模式的定义与特点优点:缺点:命令模式的结构与实现1. 模式的结构2. 模式的实现命令模式的应用实例命令模式的应用场景命令模式的扩展 前言 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满

Android系统工程师--小馬佩德罗 1521

数据去重复_京东商品评论情感分析|文本数据预处理

本文爬取了十款热销手机的文本评论数据后,首先对文本评论数据做文本预处理,文本评论数据中存在大量的无价值信息,引入无用的文本数据,对其作情感分析,显然没有价值,得出的文本挖掘结果也不尽人意。所以对于文本评论数据先进行文本预处理是必不可少的一步,把大量的、冗余的、无价值的信息去除,可以极大提高文本数据的质量,精确文本分析结果。1 文本去重1.1文本去重的原因文本数据预处理时,首先应去除文本评论数据中反...

weixin_34556808的博客 2074

spark 适配达梦数据库

spark 适配达梦数据库 版本 spark3.0.0 scala2.12.10 DM Database Server 64 V8 步骤一: 引驱动包: SBT方式: "com.dameng" % "Dm8JdbcDriver18" % "8.1.0.157", maven方式: <dependency> <groupId>com.dameng</groupId> <artifactId>Dm8JdbcDriver18</artifac

_@Eva@_的博客 2091

命令模式(Command) Java实现

命令模式 命令模式(Command)的定义 命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Transaction)模式。 命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。 命令模式的结构 命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的...

CmdSmith的博客 1973

价值投资/指标选股(akshare)

利用akshare的数据源,可以获取所有的股票数据以及公开的财务数据,可以进行条件筛选,获取满足条件的股票。 这套模板可以用于价值投资,指标选股。选股周期为日线级别。然后结果可以邮箱发送。 import time import akshare as ak ## A 股上市公司的实时行情数据 stock_zh_a_spot_df = ak.stock_zh_a_spot() #print(stock_zh_a_spot_df) ##取前300测试 ##取前300测试 df_stock =...

qq_26742269的博客 1万+

Java设计模式之行为型-命令模式 (Command)

????文章示例代码???? 附链 你也可以在这些平台阅读本文: 语雀 个人博客 定义 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化。 四个角色 命令模式主要有以下四个角色: 抽象命令类Command:声明执行操作的接口。 具体命令类Concrete Command:是抽象命令类的具体实现类,持有接受者对象,同时通过调用接收者的功能来完成命令要执行的操作。 接收者Receiver...

Horace's Blog 486

Keil5实战:如何高效导出变量数据并实现可视化分析

本文详细介绍了在Keil5开发环境中,如何利用调试脚本高效导出程序运行时变量数据的方法。通过编写脚本自动捕获数据并保存为文件,再结合Excel或Python进行可视化分析,为嵌入式调试与算法优化提供了数据支撑,显著提升开发效率。

silver的专栏 1106

ENSP实验一:防火墙基础配置

配置client(内网)、FTP Server(外网)的IP地址。进入防火墙,输入密码:默认为admin@123。

Carohuan的博客 1万+

java 命令设计模式_java设计模式-Command(命令)模式

Command定义将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。优点: 解耦了调用者和接受者之间联系。调用者调用一个操作,接受者接受请求执行相应的动作,因为使用Command模式解耦,调用者无需知道接受者任何接口。缺点: 造成出现过多的具体命令类代码例子如下:播放器执行命令者:package command;//命令执行者播放器pub...

weixin_39760689的博客 226

Python 爬虫教程:金融数据定向抓取(银行 + 投资网站数据结构化提取)

在当今数字化时代,金融数据的获取和分析对于投资者、分析师以及金融机构来说至关重要。Python 爬虫技术可以帮助我们高效地从各种网站上抓取金融数据,从而为投资决策、风险评估和市场分析提供支持。本文将详细介绍如何使用 Python 爬虫技术来定向抓取银行和投资网站的数据,并将其结构化提取,以便进一步分析和使用。

u014481728的博客 882

WPF DataGrid自动生成行号

在使用WPF进行应用程序的开发时,经常会为DataGrid生成行号,这里主要介绍一下生成行号的方法。通常有三种方法,这里主要介绍其中的两种,另一种简单提一下。 1. 直接在LoadingRow事件中操作。 这种方式是在code behind文件中操作。即相应的*.xaml.cs文件。  代码如下: this.dataGridSoftware.LoadingRow += new Ev...

weixin_34363171的博客 535

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

MCPJungle开发模式 vs 企业模式:如何选择适合你的部署方式

MCPJungle是一个强大的自托管MCP网关工具,它提供了两种主要的运行模式:**开发模式**和**企业模式**。对于新手和普通用户来说,了解这两种模式的区别并选择适合自己需求的部署方式至关重要。本文将详细介绍这两种模式的特点、适用场景以及选择指南,帮助你快速上手MCPJungle并做出明智的部署决策。 ## 🔍 MCPJungle模式概述:理解核心差异 MCPJungle作为一个统一的M

gitblog_00036的博客 976

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

设计模式之 Command通俗理解

1 command模式定义 Commad模式是一种对象行为模式, 它可以对发送者(sender)和接收者(receiver)完全解耦(decoupling)。("发送者" 是请求操作的对象,"接收者" 是接收请求并执行某操作的对象。有了 "解耦",发送者对接收者的接口一无所知。) 2 通俗理解 简单来看,在对象A调用了对象B的一个方法,这样对象A就可以看做一个发送者,对象B就是一个接收者,在这种情况下,对象A必须知道对象B相应的方法名。如果在这里使用Command模式的话,就相当于在对象A和对象.

码灵的博客 870

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

设计模式(Java)—Command模式

一个类在进行工作时会调用自己或是其他类的方法,虽然调用结果会反映在对象的状态中,但是并不会留下工作的历史纪录。 这时,如果有一个类,用来表示进行这项工作的命令就会方便很多。每一项想做的工作就不再是方法的调用这种动态处理了,而是一个表示命令的类的实例,既可以用物来表示,要想管理工作的历史纪录,只需管理这些实例的集合即可,而且还可以随时再次执行过去的命令,或是将多个过去的命令整合为一个新命令并执行。 ...

zoinsung_lee的博客 5176

Command模式

Command模式的中心思想还是代码的解耦和,通过引入中间层来解决代码的紧耦合。 下面来看一个在日常开发中经常碰到的场景:在一个类中需要调用另一个类的实现方法,那么比较常用的开发方式如下: package com.test.command.original; /** * 接受者(具体实现类) * */ public class Receiver { public void actio

DryKillLogic的专栏 1207

Fabric - chaincode开发模式

Fabric学习笔记(六) - chaincode开发模式 启动网络 terminal1 cd /opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode-docker-devmode docker-compose -f docker-compose-simple.yaml up 查看启动是否成功 termin

背着小书包一路追寻梦想 1690

MacPro自带浏览器Safari假死状态(无法操作)处理办法& Safari浏览器开发模式打开

一、Safari假死处理 已经解决了。 打开浏览器发现这个问题后,按command+option+esc强制退出。 然后再打开浏览器,在打开的时候不停的按回车,然后回出现一个弹框,是否作为默认浏览器,点击“不使用”即可。 重新打开可以正常使用。 取经自江湖贴吧解决方案: https://tieba.baidu.com/p/6100727034?red_tag=2235159302 二、Safari浏览器开发模式打开 1打开Safari浏览器,点击左上角Safari菜单,找到并..

自在轩恒 1万+

OpenCore Legacy Patcher:如何在2007年Mac上运行最新macOS的架构解析

在苹果官方停止支持的硬件上运行最新macOS系统,这听起来像是技术爱好者的幻想。然而,OpenCore Legacy Patcher项目将这个幻想变成了现实,为技术决策者和架构师提供了一个深度研究现代macOS兼容性工程的机会。这个基于Python的开源项目不仅是一个工具,更是一个完整的硬件兼容性解决方案架构,支持从macOS Big Sur到Sequoia的完整系统体验。 ## 逆向工程的艺术

gitblog_00780的博客 745

开发模式分类

 创建型模式1、  ABSTRACT FACTORY(抽象工厂模式)——对象创建型模式2、  FACTORY METHOD(工厂方法)——对象创建型模式3、  SINGLETON(单件)——对象创建型模式4、  BUILDER(生成器)——对象创建型模式5、  PROTOTYPE(原型)——对象创建型模式结构型模式1、  ADAPTER(适配器)——对象结构型模式

lizhi_218 484

常见设计模式的解析和实现(C++)之十四-Command模式

作用: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作. UML结构图: 解析: Comnand模式的思想是把命令封装在一个类中,就是这里的Command基类,同时把接收对象也封装在一个类中就是这里的Receiver类中,由调用这个命令的类也就是这里的Invoker类来调用.其实,如果弄清楚了Command模式的

Will Mu 的专栏 517

WPF Command 设计思想与实现剖析

一文吃透 WPF Command:从原理到实战

龟速船长 749

Unity游戏开发实战:如何用QFramework的MVC+Command模式重构你的计数器Demo(附完整代码)

本文详细介绍了如何使用QFramework框架的MVC架构和Command模式重构Unity计数器Demo,提升代码的可维护性和扩展性。通过分离Model、View和Controller层,并结合Command模式封装业务逻辑,实现清晰的代码结构。文章还展示了如何添加成就系统和数据持久化功能,为Unity游戏开发提供实用参考。

weixin_30379531的博客 412

DDD开发模式说明

领域核心建模应用层编排基础设施隔离适配器/防腐层思想API层负责接入Application层负责编排Domain层负责业务规则Infra层负责技术实现对于复杂业务系统,这种模式比传统三层架构更适合持续演进,也更有利于团队协作和代码治理。

G探险者的博客 409
上一篇: 如何进行Apache虚拟主机配置
下一篇: Java Card应用程式开发工具
java169
博客等级 码龄18年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值