设计模式学习笔记--中介者模式

【FPGA】Robei EDA 的使用(7)—— Robei文件上板试验 #沐朝露兮以自华,觅大道兮以求成 我又滚过来了,研究了20多天RISCV,结果最后因为硬件问题导致无法在比赛中使用RISCV CPU,虽然已经临近比赛后期了,非常的崩溃,但是也没有什么办法。唉,一切不过是从头再来罢了。(写写博客舒缓我心中苦闷) ————————————————进入正文的分割线———————————————— 今天介绍一下如何利用 Robei EDA 生成文件,导入vivado中,综合下载到开发板里。拿我一个PWM控制舵机的代码为例。 Robei EDA设置 假设代码模块(model文件)经 阅读详情

一.简介


今天来学习一下传说中的中介者模式。说到中介者,我们最容易想到的就是电话中继器,这里我们看看电话的演变过程吧。最早的电话只是两个通话的用户之间相连,这样的结构简单直接,操作最方便。但是随着使用电话的人数多了起来,为每两部电话之间架设一条线路很明显是不可能的,于是就有了电话中继器,记得以前经常看老电影里面,打电话的人要拿起电话,先打给接线员,说“给我接到XXX那”。没错,接线员就相当于中介者。在面向对象设计中,我们经常有很多类对象,对象之间需要交互,而如果对象过多,而每个对象之间都有可能交互的话,最简单的方式就是每个对象保存其他所有可能交互对象的引用,但是这样做有几个问题,第一,需要保存的内容过多,每个对象存一份,很明显是冗余,对象之间的耦合性太高,牵一发而动全身,如果新增一个类,所有之前的类都要修改。为了解决这个问题,中介者模式就应运而生了。
下面看一下中介者模式的定义以及UML类图:
中介者模式(Mediator Pattern):用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。
简单解释一下UML类图,我们原本的对象在图中就相当于Colleague同事类,如果没有用中介者模式,他们每个具体的Collegue都需要保存其他所有对象的引用,UML图会灰常凌乱,而通过中介者Mediator,只有中介者自己保存所有对象的引用,而每个具体的同事类只需要和中介者建立关系,就可以和所有的其他同事类对象进行通信,这样大大降低了系统的耦合度。


二.中介者模式的例子


我们就拿电话的例子来看一下,有中介者和没有中介者的情况。


1.没有使用中介者模式的情况


// Design Pattern.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
using namespace std;

//抽象电话类
class BasePhone
{
public:
	virtual void Call(int num) = 0;
	virtual void Answer() = 0;
};

//移动电话
class MobilePhone : public BasePhone
{
private:
	vector<BasePhone*> m_phoneVec;
	string m_Name;
public:
	
	MobilePhone(string name)
		: m_Name(name)
	{
	
	}
	//添加通讯录,或者说铺电话线更恰当
	void Add(BasePhone* phone)
	{
		m_phoneVec.push_back(phone);
	}

	//根据号码打电话
	virtual void Call(int num) override
	{
		cout << m_Name << "用手机打电话, ";
		m_phoneVec[num]->Answer();
	}

	//接电话
	virtual void Answer() override
	{
		cout << m_Name << "用手机接电话" << endl;
	}
};

class TelePhone : public BasePhone
{
private:
	vector<BasePhone*> m_phoneVec;
	string m_Name;
public:
	TelePhone(string name)
		: m_Name(name)
	{

	}

	//添加通讯录,或者说铺电话线更恰当
	void Add(BasePhone* phone)
	{
		m_phoneVec.push_back(phone);
	}

	//根据号码打电话
	virtual void Call(int num) override
	{
		cout << m_Name << "用座机打电话, ";
		m_phoneVec[num]->Answer();
		//这里直接根据基类来处理了,如果有其他处理,耦合性更大
	}

	//接电话
	virtual void Answer() override
	{
		cout << m_Name << "用座机接电话" << endl;
	}
};




int _tmain(int argc, _TCHAR* argv[])
{
	
	MobilePhone* phoneA = new MobilePhone("小明");
	TelePhone*   phoneB = new TelePhone("小刚");
	MobilePhone* phoneC = new MobilePhone("小蔡");

	//为每个对象和每个对象之间都建立联系
	phoneA->Add(phoneA);
	phoneA->Add(phoneB);
	phoneA->Add(phoneC);
	phoneB->Add(phoneA);
	phoneB->Add(phoneB);
	phoneB->Add(phoneC);
	phoneC->Add(phoneA);
	phoneC->Add(phoneB);
	phoneC->Add(phoneC);
	phoneA->Call(1);
	phoneB->Call(2);
	phoneC->Call(0);

	system("pause");
	

	return 0;
}
结果:
小明用手机打电话, 小刚用座机接电话
小刚用座机打电话, 小蔡用手机接电话
小蔡用手机打电话, 小明用手机接电话
请按任意键继续. . .

2.使用了中介者模式的情况


我们发现,每个电话都要与其他两个电话耦合,虽然这里我使用的是基类,可以降低一部分耦合,但是还是感觉代码不够优雅,我们不希望它们彼此之间联系过于密切,于是我们就添加一个中介者。
// Design Pattern.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class BasePhone;
//中介者基类
class BaseMediator
{
public:
	virtual void Call(int num) = 0;
	virtual void Add(BasePhone* phone) = 0;
};


//抽象电话类
class BasePhone
{
protected:
	BaseMediator* m_Mediator;
public:
	//现在我只需要增加一个中介者就可以了
	void SetMediator(BaseMediator* mediator)
	{
		m_Mediator = mediator;
	}

	//通过中介者向其他电话发送信息
	virtual void Call(int num)
	{
		m_Mediator->Call(num);
	}

	virtual void Answer() = 0;
};


//电子电话中继器
class ElectricMediator : public BaseMediator
{
private:
	vector<BasePhone*> phoneVec;
public:
	//登记电话
	void Add(BasePhone* phone) override
	{
		phoneVec.push_back(phone);
	}

	//拨号
	virtual void Call(int num) override
	{
		phoneVec[num]->Answer();
	}
};

//移动电话
class MobilePhone : public BasePhone
{
private:
	
	string m_Name;
public:
	
	MobilePhone(string name)
		: m_Name(name)
	{
	
	}

	//根据号码打电话
	virtual void Call(int num) override
	{
		cout << m_Name << "用手机打电话, ";
		BasePhone::Call(num);
	}

	//接电话
	virtual void Answer() override
	{
		cout << m_Name << "用手机接电话" << endl;
	}
};

class TelePhone : public BasePhone
{
private:
	string m_Name;
public:
	TelePhone(string name)
		: m_Name(name)
	{

	}

	//根据号码打电话
	virtual void Call(int num) override
	{
		cout << m_Name << "用座机打电话, ";
		BasePhone::Call(num);
	}

	//接电话
	virtual void Answer() override
	{
		cout << m_Name << "用座机接电话" << endl;
	}
};




int _tmain(int argc, _TCHAR* argv[])
{
	
	MobilePhone* phoneA = new MobilePhone("小明");
	TelePhone*   phoneB = new TelePhone("小刚");
	MobilePhone* phoneC = new MobilePhone("小蔡");
	BaseMediator* mediator = new ElectricMediator();

	//向中介者中注册电话
	mediator->Add(phoneA);
	mediator->Add(phoneB);
	mediator->Add(phoneC);

	//电话只保存中介者的引用就可以了
	phoneA->SetMediator(mediator);
	phoneB->SetMediator(mediator);
	phoneC->SetMediator(mediator);

	phoneA->Call(1);
	phoneB->Call(2);
	phoneC->Call(0);

	system("pause");
	

	return 0;
}
结果:
小明用手机打电话, 小刚用座机接电话
小刚用座机打电话, 小蔡用手机接电话
小蔡用手机打电话, 小明用手机接电话
请按任意键继续. . 
.


三.中介者模式的总结


最后,我们来看一下中介者模式的优点,缺点以及使用时机:

优点;
1)去除原来同事对象多对多的交互关系,用中介者和对象的一对多的关系代替,原来的网状结构被星型结构所代替。
2)中介者模式将复杂对象之间的耦合关系解除,新增对象时不需要更改原有代码,符合开放-封闭原则。

缺点:
中介者模式将大量对象的交互细节放在中介者中,中介者职责过重,难以维护。

使用时机:
当我们的系统中对象之间的引用关系呈网状,对象之间都需要相互引用,每个对象都需要引用其他对象时,我们就可以考虑使用中介者模式来重构系统。
自建 HTML获取腾讯六宫格点选图片验证码素材,实现刷新批量获取图片方便训练 通过自建 HTML 页面,可以方便地获取腾讯六宫格二维码素材,不仅过程简单,而且可以灵活配置各种参数。希望这篇文章能帮助到需要相关素材的小伙伴。如果你有其他问题或者更好的方法,欢迎留言交流! 阅读详情

相关推荐

Anylogic试用版密匙

#$%99dTMbLIj+hm/c9fn0suWlfQjdK9FzRH8oSbR Rbm3FEeONkF5mDLKHxhscEDBANDg4BSU2Oi6hErk TH/KzwiCtsM0jfD50uRsj60+gi9ifTlduwcpSr6a GtVSilXwF997xTVAoMLddqOzGQAbnSjBiJOBdm1Z 0QwwIEJynvYgckLfoEADzncIgNnJjYshWcmGh3s9 gTgyuQPlRBeTXfb+ZJPI1JGi4sAUljwdB53Df+AX SEf5FaIbih

qq_43939616的博客 8266

设计模式(十一)桥接设计模式(Bridge)-- 结构型

桥接模式:分为抽象 和 实现两部分,抽象是对事物的抽象,接口是对行为的抽象 1、引出桥接模式的案例 -- 手机问题 传统方案解决手机操作问题分析 1) 扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类,同样如果我们增加一个手机品牌,也要在各个手机样式类下增加。 2) 违反了单一职责原则,当我们增加手机样式时,要同时增加所有品牌的手机,这样增加了...

SmileTimLi的博客 661

免费大容量国外网盘测评:冷数据归档与rclone加密接入

云存储的本质,是通过对象存储、冗余编码和分层缓存,把本地磁盘容量问题转化为网络访问与数据管理问题。免费大容量国外网盘常以空间换用户规模或付费转化,容量政策、传输策略、协议支持和退出成本,往往比标称容量更决定长期可用性。支持 WebDAV、S3 兼容和命令行工具的服务,可接入 rclone 等自动化流程,再配合客户端加密与冷热分层,用于冷数据归档、老项目备份和家庭影像保存。理解带宽换算、单文件上限、保活机制与传输一致性后,评估话题型大容量网盘与专业向协议网盘,就能把免费空间纳入可靠存储层。围绕免费大容量国外网

weixin_31292729的博客 213

设计模式:桥接模式(Bridge)

定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。 意图:将抽象与实现解耦。  桥接模式主要应对的是由于实际的需要,某个类具有两个或者两个以上的维度变化(违反了SRP原则),如果只是用继承将无法实现这种需要,或者使得设计变得相当臃肿。 桥接模式所涉及的角色 1. Abstraction:定义抽象接口,拥有一个Impl...

weixin_34303897的博客 740

SAP IDOC实战:如何用EDI实现跨公司采购订单自动生成销售订单(附完整配置步骤)

本文详细解析了如何利用SAP IDOC与EDI技术,实现跨公司采购订单自动生成销售订单的完整流程。通过实战案例,从业务蓝图设计、输出条件配置、伙伴参数设定到IDOC消息类型处理,提供了清晰的配置步骤与故障排查指南,帮助企业打通内部业务流,构建高效的自动化闭环。

weixin_29215815的博客 727

基于Python爬虫的新闻热点分析与挖掘

本文介绍了基于Python爬虫的新闻热点分析与挖掘方法,主要包括数据收集、预处理、热点分析和可视化四个部分。首先通过爬虫抓取新浪新闻数据,利用文本清洗和存储技术进行数据预处理;接着采用TF-IDF和LDA算法进行关键词提取与主题建模;最后通过词云图和主题分布图实现数据可视化。该方法能有效识别新闻热点,为信息筛选和决策提供支持。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1544

设计模式 - 中介器模式

中介者模式使得组件通过一个中心点——中介者进行交互。组件不需要直接进行通信,而是将请求发送给中介者,由中介者进行转发!在JavaScript中,中介者往往只是一个对象字面量或一个函数。你可以将这种模式与空中交通管制员和飞行员之间的关系进行比较。飞行员不是直接互相交谈,这可能会相当混乱,而是与空中交通管制员交谈。空中交通管制员确保所有飞机接收到他们所需的信息,以便安全飞行,不与其他飞机相撞。虽然我们希望不要使用 JavaScript 控制飞机,但我们往往不得不处理对象之间的多向数据。

liangshanbo1215的博客 1130

NX二次开发编译时dll自动数字签名及拷贝

在UG5.0开始,所有基于UG二次开发的DLL都要“签名”后才能被客户端上正版的NX调用。

菜鸟爱飞不飞的博客 2683

设计模式之中介模式-java篇

1.中介模式的定义是什么? 答:中介者模式(Mediator Mode)就是用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 2.中介模式需要注意的什么? 答:由于中介模式是对同事类进行了解耦,若不明确各个类的职责,那么就不要进行使用,而且粒度一定要合适,不能滥用。 3.中继模式举例并实现代码? 答:该例子举例链家网作为...

weixin_40544651的博客 194

VLA、世界模型与端到端在智驾中的本质关系与工程落地

世界模型并非3D重建,而是对环境状态转移函数的可微分建模;VLA不是视觉+语言+动作的简单拼接,核心在于跨模态语义对齐。二者共同支撑具身智能系统实现从感知到行动的闭环推演,其技术价值体现在长尾场景泛化能力提升与决策延迟降低。在自动驾驶领域,真实量产方案均采用VLA架构作为多模态感知基础,嵌入轻量级世界模型以支持反事实轨迹推演,并通过WA硬件封装保障实时性,最终由端到端控制层完成像素到扭矩的语义贯通。这种混合架构已成L2+/L3智驾系统的工程共识。

weixin_34163553的博客 365

以 Joule 驱动的生成式开发:把需求文档直接变成可运行的 SAP 应用

摘要:SAP BTP的AI助手Joule正在改变开发方式,支持从自然语言描述自动生成数据模型、服务、UI及测试代码。在SAP Business Application Studio中,Joule能根据业务需求生成结构化代码,并提供代码补全、重构、解释等功能。开发者需注意避免上传敏感数据,并对AI生成的代码进行人工审核。Joule特别针对ABAP开发进行了优化,提供符合SAP规范的代码建议,帮助迁移遗留系统。此外,它还能快速生成CAP项目原型,但所有AI生成内容都需经过严格测试验证。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 340

Java设计模式系列之中介者模式

中介者模式(Mediator)的定义 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 中介者模式(Mediator)的适用性 1.一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。 2.一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。 3.想定制一个分布在多个...

weixin_34150224的博客 128

嵌入式开发工程师笔试面试指南-Linux驱动

linux驱动

weixin_43491077的博客 473

学习笔记【23种设计模式-第十八节:Mediator Pattern 中介者模式】

Mediator Pattern 中介者模式 简述: 中介者模式,用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显示的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 中介者模式属于行为型模式,使代码易于维护 比如MVC模式,C(Controller控制器)是M(Model模型)和V(View视图)的中介者,在前后端交互时起到了中间人的作用。 角色 Mediator就是抽象中介者,它定义了同事对象到中介者对象的接口 Colleague 是抽象同事类 ConcreteMedi

qq_53273362的博客 157

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

深度学习工具包 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")

设计模式学习笔记--中介者模式Mediator pattern(Java版)

一、场景 公司里各个部门的总经理 二、实质 如果一个系统中对象之间的联系呈现为网状结构,对象之间存在大量多对多关系,将导致关系及其复杂,这种对象为“同事对象”。 我们可以引入一个中介者对象,使各个同事对象只跟中介者对象打交道,将复杂的网络结构化解为星形结构。 三、示例 package com.lgd.mediator; //同事类的接口 public interfac

吃果冻不吐果冻皮 880

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【设计模式学习笔记】中介者模式

中介者模式:用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。【菜鸟】 文章目录            1.1 交谈动作及对象           1.2 中介者长这模样           1.3 测试          ​​​​​​​ 1.4 结果          ​​​​​​...

Roger_CoderLife的博客 173

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

设计模式学习笔记——08 中介者模式

中介者模式 Mediator模式也叫中介者模式,Mediator模式是行为模式之一,在Mediator模式中,类之间的交互行为被统一放在Mediator的对象中,对象通过Mediator对象同其他对象交互,Mediator对象起着控制器的作用。MVC中的C控制器就是一个中介者,它将M业务逻辑和V视图隔离开,把M运行的结果和V代表的视图融合成一个前端可以展示的页面,减少M和V的依赖关系。 优点 减少...

GM. 201

设计模式学习笔记——中介者模式

1.可以避免同事类之间的耦合过度,使同事类之间可以相互独立使用。(迪米特原则)2.一对多关联转变为一对一关联,对象关系容易理解和维护。3.使用中介者模式可以将对象的行为和协作进行抽象,灵活处理对象之间的作用。

x_k的专栏 466

《设计模式》学习笔记——中介者模式

        中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。 意图:     用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。主要解决:     对象与对象之间存在大...

smallerxuan的博客 2414

设计模式学习笔记(十九)中介者模式

1、解耦:中介者模式将对象之间的通信行为集中在一个中介者对象中,使得各个对象之间不直接相互引用,从而降低了它们之间的耦合度。2、简化对象间交互:中介者模式通过将复杂的交互逻辑封装在中介者对象中,简化了对象之间的交互过程,使其更加直观和易于理解。重用性:中介者模式将对象间的通信行为集中在一个中介者对象中,可以使得该中介者对象在不同的场景下被重用,减少了重复的代码编写。3、扩展性:通过增加新的中介者对象或者修改现有中介者对象,可以比较灵活地改变对象间的交互方式。

weixin_44917291的博客 308

设计模式学习笔记-中介者模式

智能家庭项目 智能家庭包括各种设备,闹钟、咖啡机、电视机、窗帘等 主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作比如: 闹钟响起–>咖啡机做咖啡–>窗帘自动落下–>电视机开始播放 传统方案解决问题 存在问题 当各个电器对象有多种状态改变时,相互调用关系复杂 各个电器对象彼此联系,你中有我,我中有你不利于松耦合 各个对象之间所传递的消息容易混乱 当系统增加一个新的电器对象时,或者执行流程改变时,代码不易维护和扩展 中介者模式 介绍 中介者模式用一个中介对象封账一系

我不是什么好人 256

二十一、中介者模式——设计模式学习笔记

中介者模式,用一个中介对象来封装一系列的对象交互,中介者使对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

L0nginus的博客 533

设计模式学习笔记(九:中介者模式)

1.1概述     用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。这就是中介者模式的定义。     一个对象含有另一个对象的引用是面向对象中经常使用的方式,也是面向对象所提倡的,即少用继承多用组合。但是怎样合理地组合对象对系统今后的扩展、维护和对象的复用是至关重要的,这也正是学习设计模式的重要原因。     ...

nimeimeidewen的专栏 359

[学习笔记:设计模式] 22_中介者模式

中介者模式

qq_59896820的博客 692

设计模式之禅学习笔记--中介者模式

一、定义 用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示的相互作用,从而使其耦合松散,而且可以独立的改变它们之间的交互。 二、通用类图 中介者模式由以下几部分组成: 1:Mediator抽象中介者角色。抽象中介者角色定义统一的接口,用于各同事角色之间的通信。 2:ConcreteMediator具体中介者角色。具体中介者角色通过协调各同事角色实现协作行为,因为它必须

xiang912的专栏 528

游戏设计模式学习笔记(12)中介者模式

游戏设计模式学习笔记(12)中介者模式 参考: 《设计模式与游戏完美开发》 《游戏编程模式》(https://github.com/tkchu/Game-Programming-Patterns-CN) 《图说设计模式( Graphic Design Patterns)》(https://github.com/me115/design_patterns) 【游戏设计模式】浅墨_毛星云: http...

l773575310的博客 298
上一篇: 设计模式学习笔记--桥接模式
下一篇: 增强现实原理解析
puppet_master
puppet_master 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄12年 2695粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值