【设计模式小结】—-结构型模式

设计模式 笔记2 | 七个结构型模式 | 适配器模式 | 桥接模式 | 装饰器模式 | 组合模式 | 代理模式| 外观模式 | 享元模式 |模板代码、优缺点、应用场景总结 | 基于Java实现 继上次的五个创建型设计模式的学习,本次学习总结了七个结构性的设计模式,这些设计模式有的频繁出现在大多数Java框架中,本篇文章参照网上的文档资料,对这七种设计模式进行了总结,包括定义、模板代码和应用场景,适合初学阶段,学习设计模式并不能死记硬背,而是通过基础内容与实践不断地熟悉,这里我们先了解这些模式的大致使用,在将来读源码或者做开发设计对象类时可以参考这些设计模式,能有效降低代码耦合,以及提升代码可读性和可扩展性。............ 阅读详情

结构型模式描述如何组织类和对象以组成更大的结构。

结构型类模式采用继承机制来组合接口和实现,

结构型对象模式则采用组合聚合来组合对象以实现新功能,可以在运行时刻改变对象组合关系,具有更大灵活性,故这里只关注结构型对象模式。

一般常见的结构型模式有7种:ABCDFFP(Adapter,Bridge,Composite,Decorator,Façade,Flyweight,Proxy)

1.适配器模式(Adapter):使由于接口不兼容而不能一起工作的类可以一起工作。

有类或对象适配器模式,解决已存在目标客户接口和已存在功能类接口不兼容的问题。

对象适配器模式实现上是适配器对象包含一个被适配器对象来进行接口转换;

一般是项目改造或扩充时才用到。适配器模式使得一个接口和其它接口兼容,从而给出了多个不同接口的统一抽象。

 

协作:Client在Adapter的实例上调用一些操作,适配器调用含有的Adaptee对象实现这个操作。

2.桥接模式(Bridge):将抽象和实现分离,使他们可以独立的变化。

分离接口和实现,从而使抽象类的实现可以在运行时刻配置,在运行时刻改变其对象的实现;

接口实现分离有利于系统分层,从而产生跟好的结构化系统,可以独立的对Abstractation和Implementor层次结构进行扩充。

封装多维变化,抽象角色内含一个抽象实现角色,精确抽象角色调用父类中的抽象实现角色对象实现,具体实现角色继承抽象实现角色,如果再增加一维抽象,可以当抽象实现角色,在原有的抽象实现角色中包含新增的抽象实现角色,也可以当成新的抽象角色,原有的抽象角色作为一个抽象实现角色;这样说该模式实现时从抽象实现角色这维变化最好。

实例:不同人开不同车在不同路上行驶;不同名牌手机有不同系统不同软件功能;

协作:Abstraction将Client的请求转发给它的Implementor对象。

3.组合模式:将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。

即组合模式定义树状结构,可以将子对象当成整体对象一样处理;抽象构件对象,树枝构件对象,树叶构件对象,根据叶子是否当成枝干来看待可分为透明性和安全性两种模式。

组合模式必须提供管理子对象的方法,但管理对象的方法是在Component中就声明还是在Composite中声明呢?如下图在Component中声明所有用来管理子类对象的方法,以达到Component接口的最大化,从而使客户在接口层次上看树叶和树枝没有区别——透明性,但树叶是不存在子类的,可能有安全问题。

下图只在Composite中声明所有管理子类的方法,避免了上面的安全性问题,但是树枝和叶子又不同的接口,失去了透明性。

协作:用户使用Component类接口与组合结构中的对象交互,如果接收者是一个叶节点,则直接处理请求,如果接受者是Composite,它通常将请求发送给它的子部件,再转发请求之前或之后可能执行一些辅助操作。

实例:java单元测试框架Junit定义了两个概念:TestCase和TestSuite,前者是一个编写测试的类,后者是一个不同TestCase的集合,集合里也可以再包含TestCase,这样运行一个TestSuite会将其包含的TestCase全部运行。Junit采用了组合模式将TestCase和TestSuite统一起来,创建一个Test接口来扮演Component角色,TestCase扮演Leaf角色,Testsuite扮演Composite角色。Junit是一个偏重安全性的组合模式,因此用TestCase和Testsuite时不能直接用Test代替。

4.装饰者模式(Decorator):动态的给对象增加一些职责,比生成子类更灵活。装饰者模式描述了如何动态的给对象增加职责,采用递归方式组合对象从而允许你添加任意多的职责。

参与者:a抽象构件角色(Component):定义抽象接口,以规范准备接收附加职责的对象。

        b具体构件角色(ConcreteComponent):被装饰者。

        c装饰角色(Decorator):持有一个构件对象实例,并定义了抽象构件定义的接口。

        d具体装饰角色(ConcreteDecorator):负责给构件增加功能。

协作:Decorator将请求转发给它的Component对象,并有可能在转发请求前后执行一些附加的动作。

实例:Junit采用了装饰模式,在java.extensions包中,TestDecorator、RepeatedTest便是对TestCase的装饰模式的扩展。使用方法如:TestDecorator test=new RepeatedTest(new TestXX(),3);。

5.外观模式(Facade):为子系统中的一组接口提供一个一致的界面,使这一子系统更加容易使用。

外观模式用于给多个子系统定义一套统一的外观,描述了如何用单个对象表示整个子系统。Façade被客户角色调用,熟悉子系统的功能,内部根据客户角色已有的需求预定了几种功能组合。

协作:客户程序通过发送请求给Façade的方式与子系统通信,Façade将这些消息转发给适当的子系统对象;使用Façade的客户程序不需要直接访问子系统对象。

6.亨元模式:运用共享技术有效的支持大量细粒度对象。

java中string的实现,细化对象共享粒度;

参与者:a.Flyweight:描述一个接口可以接受并作用于外部状态。

b.ConcreteFlyweight:实现Flyweight并为内部状态增加存储空间。ConcreteFlyweight对象必须是可共享的,它所存储的状态必须是内部的。

c.unsharedConcreteFlyweight:并非所有Flyweight子类都需要被共享,unsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点。

d.FlyweightFactory:创建并管理flyweight对象,确保合理的共享flyweight。当用户请求一个flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个(不存在的话)。

e.维持一个对flyweight的引用,计算或存储flyweight的外部状态。

协作:flyweight执行所需的状态必定是内部的或外部的,内部的状态存储与ConcreteFlyweight对象之中,而外部对象由Client对象存储或计算。当用户调用flyweight操作时将该状态传递给它。用户不应直接对ConcreteFlyweight类进行实例化,而只能从FlyweightFactory对象得到ConcreteFlyweight对象,这样可以保证它们适当地进行共享。

7.代理模式(Proxy):为其它对象提供一种代理以控制对这种对象的访问。

代理模式提供了对对象的一些特有性质的一定程度上的间接访问,从而限制、增强或修改这些性质。

协作:代理根据其种类,在适当的时候向RealSubsject转发请求。

常见使用代理模式的情况:a远程代理:为一个对象在不同的地址空间提供局部代表。

b.虚代理:根据需要创建开销很大的对象。

c.保护代理:控制对原始对象的访问权限。

d.取代了简单的指针,它在访问对象时执行一些附加操作。


结构模式(Structural Pattern)

描述如何将类或者对象结合在一起形成更大的结构。结构模式描述两种不同的东西:类与类的实例。根据这一点,结构模式可以分为类的结构模式和对象的结构模式。

具体的集中结构模式如下所示:

Structural Patterns
  Adapter  Match interfaces of different classes
  Bridge  Separates an object’s interface from its implementation
  Composite  A tree structure of simple and composite objects
  Decorator  Add responsibilities to objects dynamically
  Facade  A single class that represents an entire subsystem
  Flyweight  A fine-grained instance used for efficient sharing
  Proxy  An object representing another object

概述:
结构型模式,顾名思义讨论的是类和对象的结构,它采用继承机制来组合接口或实现(类结构型模式),或者通过组合一些对象,从而实现新的功能(对象结构型模式)。这些结构型模式,它们在某些方面具有很大的相似性,仔细推敲,侧重点却各有不同。
Adapter模式通过类的继承或者对象的组合侧重于转换已有的接口;

Bridge模式通过将抽象和实现相分离,让它们可以分别独立的变化,它强调的是系统沿着多个方向的变化;

Decorator模式采用对象组合而非继承的手法,实现了在运行时动态的扩展对象功能的能力,它强调的是扩展接口;

Composite模式模糊了简单元素和复杂元素的概念,它强调的是一种类层次式的结构;Fa?ade 模式将复杂系统的内部子系统与客户程序之间的依赖解耦,它侧重于简化接口,更多的是一种架构模式;

Flyweight模式解决的是由于大量的细粒度对象所造成的内存开销的问题,它与Fa?ade模式恰好相反,关注的重点是细小的对象;

Proxy模式为其他对象提供一种代理以控制对这个对象的访问,它注重于增加间接层来简化复杂的问题。


结构型模式的区别与比较
1.桥接模式与装饰模式

这两个模式在一定程度上都是为了减少子类的数目,避免出现复杂的继承关系。但是它们解决的方法却各有不同,装饰模式把子类中比基类中多出来的部分放到单独的类里面,以适应新功能增加的需要,当我们把描述新功能的类封装到基类的对象里面时,就得到了所需要的子类对象,这些描述新功能的类通过组合可以实现很多的功能组合,装饰模式的简略图如下:

     桥接模式则把原来的基类的实现化细节抽象出来,在构造到一个实现化的结构中,然后再把原来的基类改造成一个抽象化的等级结构,这样就可以实现系统在多个维度上的独立变化,桥接模式的简略图如下:

 

 

2.外观模式和代理模式     
     外观模式和代理模式解决问题的侧重点不同,但是它们解决问题的手法却是一样的,即都是引入了间接层的手法,这也是我们软件系统中经常用的一种手法。外观模式虽然侧重于简化接口,但是在某些情况下,外观模式也可以兼任代理模式的责任,例如外观对象有可能是另一个位于另一个地址空间对象的远程代理,这时候我们可以叫做外观代理模式,或者代理外观模式。它们的类简略图如下:

 

 

 

3.适配器模式  
     适配器模式重在转换接口,它能够使原本不能在一起工作的两个类一起工作,所以经常用在类库复用,代码迁移等方面,有一种亡羊补牢的味道。类适配器和对象适配器可以根据具体实际情况来选用,但一般情况建议使用对象适配器模式,如下图所示,左边是类适配器模式,右边是对象适配器模式:

 

对变化的封装 
     如何应对变化,是软件开发的一个永恒的主题,也许我们不能够杜绝变化的发生,但至少我们可以通过一些手段让变化降到最低。“找到系统可变的因素,将之封装起来”,通常就叫做对变化的封装。关于这个问题的解释在《Java与模式》中讲的很清晰,抽象化与实现化的简单实现,也就是“开-闭”原则在类层次上的最简单实现,如下图所示: 

     在这个继承结构中,第一层是抽象化,它封装了抽象的业务逻辑,这是系统中不变的部分;第二层是实现化,它是具体的业务逻辑的实现,封装了系统中变化的部分,这个实现允许实现化角色多态性的变化:  

 

      也就是说,客户端依赖的是业务逻辑的抽象化类型的对象,而与抽象化的具体实现无关,不在乎它到底是“实现化”,“实现化2”还是“实现化3”,如下图所示: 

 

 

     每一种继承关系都封装了一个变化因素,而一个继承关系不应当处理两个变化因素,换言之,这种简单继承关系不能处理抽象化与实现化都变化的情况,如下图所示:

 

 

     上图中的两个变化因素应当是独立的,可以在不影响另一者的情况下独立的变化,如下面这两个等级结构分别封装了自己的变化因素,由于每一个变化因素都是可以通过静态关系表达的,因此分别使用继承关系实现,如下图:

 

      在抽象化和实现化之间的联系怎么办呢?好的设计只有一个,不好的设计却有很多中,下面这种设计就是继续使用继承进行静态关系设计的类图: 

 

 

     这样的设计其实存在着很多的问题,首先出现的是多重的继承关系,随着具体实现化的增多,子类的继承关系会变得异常复杂;其次如果出现新的抽象化修正或者新的具体实现角色,就只好重新修改现有系统中的静态关系,以适应新的角色,这就违背了开放-封闭原则。正确是设计应该是使用两个独立的等级结构封装两个独立的变化因素,并在它们之间使用聚合关系,以达到功能复用的目的,这就回到了我们的桥接模式上,如下图所示: 

 

 

     从另一个角度讲,一个好的设计通常没有多于两层的继承等级结构,或者说,如果出现两个以上的变化因素,就需要找出哪一个因素是静态的,可以使用静态关系,哪一个是动态的,必须使用聚合关系。


Python之最常用的16种设计模式 这篇文章是关于Python设计模式的详细介绍,包括面向对象编程的基础知识、SOLID设计原则、设计模式的分类和具体实现。文章首先解释了设计模式的概念,然后通过代码示例介绍了创建型、结构型和行为型模式中的一些常见模式,如简单工厂、工厂方法、抽象工厂、建造者、单例、适配器、桥接、组合、外观和代理模式等。通过这些模式,可以帮助开发者编写更灵活、可扩展和易于维护的代码。 阅读详情

相关推荐

TI理想二极管在冗余电源中应用实例

深入探讨理想二极管如何提升冗余电源系统的效率与可靠性,通过实际应用案例展示其在电流隔离和自动切换中的优势,帮助工程师优化电源架构设计。

weixin_30653091的博客 991

OOP设计原理&常见的设计模式

Java常见的几种设计模式&&OOP设计原理

weixin_65975275的博客 2510

Verilog语法之十:过程块(initial和always)

我将Verilog的语法进行了总结,写了13篇文章,让小白“快速见识猪如何跑”,每一篇讲解一类语法,结合正确的示例代码和错误的示例代码,有的章节对个别语法进行了归纳总结,帮助初学者加深理解。

航天领域资深码农,型号经验丰富,一线干货分享 1672

23种设计模式-结构型模式总结

结构型模式总结 一. 适配器模式 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。 模式中角色: 目标接口(Target):客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口。 需要适配的类(Adaptee):需要适配的类或适配者类。 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。 适...

weixin_42285505的博客 1045

转录组数据去批次方法整理(combat,combat-seq,removeBatchEffect)

正是因为这些非生物学的因素存在就有可能会导致我们的结果偏离真实的情况,那么实际分析的过程中研究者应当评估是否存在批次效应,并决定是否要进行去批次处理。批次效应是指样本在不同批次处理及测量的情况下引入与生物学情况不相关的技术误差,比如不同试剂耗材,不同操作者,不同的实验时间等。combat函数是基于贝叶斯框架下的调整数据批次效应的函数,主要适用于已经被过滤和标准化后的数据(combat-seq函数是基于二项回归分布下的调整数据批次效应的函数,主要适用于。值得注意的是,即使使用了所谓的去批次效应的工具,

zfyyzhys的博客 7862

手把手教你用Cadence仿真12bit SAR ADC:从电路图到FFT频谱分析(含Simc 18mmrf工艺文件)

本文详细介绍了使用Cadence仿真12bit SAR ADC的全流程,包括电路搭建、仿真环境配置、瞬态仿真优化及FFT频谱分析。基于Simc 18mmrf工艺文件,提供从电路图到性能验证的实战指南,特别分享工程实践中的排错技巧和优化策略,帮助工程师高效完成ADC设计验证。

weixin_30832405的博客 405

结构型设计模式详解与总结

在软件开发中,设计模式为我们提供了一些解决问题的通用方法,帮助开发人员编写更具扩展性、灵活性和可维护性的代码。设计模式分为三大类:创建型、结构型和行为型。本文将聚焦于**结构型设计模式**,详解它们的概念、适用场景以及具体实现,帮助读者深入理解并在实际项目中运用这些模式。

fudaihb的博客 1437

MacOS新手必看:HomeBrew安装避坑指南(含M1芯片适配方案)

本文为MacOS新手提供全面的HomeBrew安装指南,特别包含M1/M2芯片适配方案。从系统准备到核心安装流程,再到日常维护和高级配置,详细解析每个步骤的潜在问题及解决方案,帮助用户高效管理Mac软件。

weixin_28831399的博客 471

Hadoop自测题及参考答案

单选题 1、与其他几项不同的是 A. Mesos B. Mongodb C. Corona D. Borg E. YARN 注:其他几项都是资源统一管理系统或者资源统一调度系统,而 Mongodb一种非关系型数据库。 2、[java基础] 以下不属于线程安全的数据结构是 A. HashMap B. HashTable C. CopyOnWriteArrayL

三人行,必有我师焉。 1万+

13、核心网络模块:VyOS 设备配置实战

本文详细介绍了如何使用 Ansible 核心网络模块对 VyOS 虚拟设备进行自动化配置,涵盖环境搭建、变量设置、任务编写、playbook 运行及配置验证全过程。通过实际案例展示了 Ansible 在网络设备管理中的强大功能,包括多设备支持、模板化配置、备份回滚等优势,并提供了最佳实践建议与未来发展趋势分析,帮助读者提升网络运维效率。

linux6sysadmin的博客 114

深度学习论文: AnomalyDINO: Boosting Patch-based Few-shot Anomaly Detection with DINOv2

通过将DINOv2模型适应到一次性和少量异常检测中,并专注于工业应用少量异常检测。实验表明,这种方法不仅与现有技术相匹敌,甚至可以在许多设置中超越它们。我们提出的仅视觉方法AnomalyDINO基于补丁相似性,能够实现图像级别的异常预测和像素级别的异常分割。该方法在方法论上很简单,无需训练,因此不需要任何额外的数据进行微调或元学习。

mingo_敏 1904

几个常用的结构型设计模式总结

1.1配适器模式:解决两个类不兼容的问题,使两个类可以一起工作。            角色:Target(目标抽象类)、Adapter(配适器类)、Adaptee(配适者类)。   配适器模式有两种:对象配适器模式和类配适器模式。它们都是Adapter类实现了Target类的接口,不同的是对象配适器模式中Adapter和Adaptee是关联关系,而类配适器中是继承关系。由于Target有

talonnn的博客 930

【Google Play 上架】内部 / 封闭 / 开放 测试全解 — “只跑一个就能上架”?不行!

Google Play新规要求个人开发者账号在2023年11月13日后必须通过封闭测试(Closed testing)才能上架应用。封闭测试需要至少12名测试者连续14天保持参与状态,而内部测试和开放测试不能替代这一要求。三类测试轨道各有特点:内部测试用于快速内部验证,封闭测试是上架必经环节,开放测试面向更广泛用户但非必需。上架流程建议先内部测试修复问题,再启动封闭测试满足14天要求,最后申请生产发布。组织账号和早期个人账号可能不受此限制。开发者应提前规划测试人群,确保持续测试周期,并关注Play Cons

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 2799

设计模式 - 结构型设计模式小结

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net Definition Specify the kind of objects to create using a prototypical instance, and create new objects by copying this prot...

了解➔熟悉➔掌握➔精通 6万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【设计模式】结构型:几种设计模式小结

在之前的代码中我们列举了非常几个业务场景,相信小伙伴对委派模式和策略模式有了非常深刻的理解了。现在,我们再来回顾一下,DispatcherServlet 的委派逻辑,代码如下: public class DispatcherServlet extends HttpServle { protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOExcept

A minor 313

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

【Java设计模式 设计模式与范式】结构型模式小结

结构型模式主要总结了一些类或对象组合在一起的经典结构,这些经典的结构可以解决特定应用场景的问题。所以我们在使用结构型模式时的出发点还是场景,例如想要进行接口兼容我们可以考虑适配器模式、想要统一加日志、AOP等可以考虑代理模式,想要功能随意组合增强的文件系统可以使用装饰器模式、想要独立变化的JDBC接口标准和开发厂商实现可以使用桥接模式,想要处理组织关系开发人事系统可以使用组合模式,想要统一接口调用可以使用外观模式,想要节省内存、共享对象可以使用享元模式。从场景出发!

MaoLin Tian's Blog 555

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

编程-结构型设计模式-小结

结构型设计模式是一类设计模式,用于简化接口、组合对象、改变类的接口、封装对象的创建过程等。这些模式帮助开发者设计出更易于理解、维护和扩展的系统。

qq_45831414的博客 654

设计模式- 对象结构型模式小结

粗粗看文GOF的设计模式第二部分: 感觉着这部分类图实现上看差异很小,但是从动机和范围却差异很大: 1 ADAPTER  适配两个不兼容的类,采用多重继承或者的类适配器或者委托对象的对象适配器。 典型例子是 TextShape 2 Bridge  把抽象和实现隔离,使用场景是当某个抽象的实现不止一个,的时候,使用该模式的IMPL,把两者隔离开来,从而他们

qugang1982的专栏 620

3.8 《硬啃设计模式》 第17章 结构型设计模式小结

序号 模式 一句话说明 1 桥(Bridge) 将“抽象”和“实现”自由搭配。 2 轻量(Flyweight) 轻松地处理“大量”对象。 3 外观(Façade) 同时提供简单接口和复杂接口。 4 装饰者(Decorator) 不改变接口但要增强功能。 5 组合(Composite) 不管你是老子还是儿子,都一样处理。 6 代理(Pro

张传波(网名:Fireball,大大大火球) 2201

[设计模式笔记]快速小结(二)---结构型模式

二. 结构型模式 7. Adapter(适配器模式) 意图: 将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 结构: 图7 多重继承实现方式. 图8 对象组合方式实现 说明: Adapter中的Request实现调用了Adaptee中的方法. 怎样使得Adapter可以调用Adaptee

cay22的专栏 1452

设计模式-结构型模式

1.   Adapter模式a)        结构:类适配对象适配注: 1)将一个类的接口转换成客户所希望的另外一个接口,使得原来由于接口不兼容而不能一起工作的那些类可以一起工作。     2)Adapter属于一个中间类,负责协调Client与Target之间的调用转发。     3)由于Java只支持单继承,所以,在Java中从Adapter到Target的继承都不出现。 b)       

技术源于生活 1559

设计模式篇——总览

全篇目录 六大基本原则(必学) 单例模式 建造者模式 目录排序 我会以设计模式的使用频率及其重要程度,来进行优先级的排序。使得在你们精力最旺盛的时候,能够吸收更多有用的知识,希望你们能够坚持学习完全篇系列…… 文章结构 每一篇文章的结构基本是一样的: 先讲解设计模式的作用,其使用场景如何如何。 再进行简单的实现。 结合 Android 源码或者三方框架源码,进行分析。 最后来个小总结什么的。...

catzifeng的博客 255

设计模式(八)——桥接模式(Bridge Pattern)

桥接模式(Bridge Pattern) 基本介绍 桥接模式(Bridge 模式)是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。是一种结构型设计模式。 基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。...

Duktig的博客 400

结构型设计模式---适配器模式

适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼客的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。 适配器模式的使用条件和优缺点。

weixin_53658416的博客 277

【23种设计模式】学习汇总(待完结+思维导图)

文末附带笔记完整体系概览思维导图。本系列详细介绍23种设计模式以其使用场景,部分附带源码讲解。顺带介绍了设计模式相关内容例如UML类图的使用与表示以及软件设计七大原则。

观止study 1272

设计模式之小结

设计模式系统总结: 1.设计模式-创建型软件设计模式(一) 2.设计模式-创建型软件设计模式(二) 3.设计模式-创建型软件设计模式(三) 4.设计模式-结构型软件设计模式(一) 5.设计模式-结构型软件设计模式(二) 6.设计模式-结构型软件设计模式(三) 7.设计模式-结构型软件设计模式(四) 8.设计模式-行为型软件设计模式(一) 9. 设计模式-行为型软件设计模式(二)

yiyele的博客 2万+
上一篇: 【关于理想】别让你的理想显得太掉价,每个人都很值钱
下一篇: 【设计模式】—-(13)模板方法模式(行为型)
白衣染霜陈
博客等级 码龄22年 682粉丝 338原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值