本文转载自微信公众号《太斗闲若如》,转载请联系太斗闲若茹公众号。前言通过研究设计模式,我们知道设计模式根据不同的目的和用途可以分为创建型模式、结构型模式和行为型模式。创建模式主要用于创建对象;结构模式主要用于处理类和对象的组合;行为模式主要用于描述类或对象之间的交互和职责分配。在这篇文章中,我想总结结构模式,讨论。认识结构模型结构模型描述了如何组合类和对象以形成更大的结构。它描述了两种不同的事物:类和对象。据此可分为类结构模式和对象结构模式。类结构模式关心类的组合。多个类可以组合成一个更大的系统。在类结构模式中,一般只有继承和实现关系;对象结构模式关心类和对象的组合。通过关联关系允许一个类定义另一个类的实例对象,然后通过该对象调用它的方法。根据“复合复用原则”,在系统中尽可能使用关联关系而不是继承关系,所以大多数结构模式都是对象结构模式的实例适配器模式:将一个类的接口转换成客户想要的另一个接口,从而实现现有接口的复用。适配器主要有两种实现方式:类适配器和对象适配器。通常,建议首先使用对象适配器。桥接模式:将抽象部分与实现部分分开,使它们可以独立变化。主要用来处理多维变化点的问题。通过对象组合,可以大大减少子类的数量,同时可以独立扩展和改变不同的维度。组合方式:将对象组合成树状结构来表示“集成-部分”层次结构,使用户在使用单个对象和组合对象时具有一致性,即客户端可以透明无区别地操作。装饰模式:动态地给一个对象添加一些额外的职责。在增加功能方面,装饰模式比生成子类更加灵活。如果使用多重继承来完成职责的增加,势必会造成子类数量的“爆发式”增长。另外,因为是静态增加的,不可能动态增加或者删除额外的职责呢?外观模式:为子系统中的一组接口提供一致的接口。外观模式定义了一个高级接口,使该子系统更易于使用。这样,客户端需要直接与复杂的子系统打交道并进行交互,而现在这个过程将完全交给外观对象,极大地方便了客户端的调用。享元模式:利用共享技术有效支持大量细粒度对象。享元模式的关键是将对象的内部状态与外部状态分离,尽可能共享“稳定”的内部状态,而会随着应用场景而变化的状态通过外部状态传入.代理模式:为其他对象提供一个代理来控制对这个对象的访问。主要是在客户端和目标对象之间增加一层间接。通过这个间接层,完成对目标对象的各种控制操作,从而形成不同功能类型的代理,如远程代理、保护代理和虚拟代理。等等···以适配器模式为例,代码分析说到适配器,我们最熟悉的就是电源适配器,也就是手机的充电头。它是适配器模式的一个应用。你可以想象一下,如果你有一根USB数据线连接电脑和手机,连接电脑的一端从电脑接口接收5V电压,连接手机的一端输出5V给手机,它们一切正常。我们常用的家用电压是220V,所以不能直接用USB数据线给手机充电。这时候我们有两个解决办法:1、单独做一个手机充电器,接收220V家用电压,输出5V电压。2、加一个适配器,将220V家用电压转换成类似电脑接口的5V电压,再连接数据线给手机充电。如果你用过早期的手机,就会知道以前的手机厂商采用的是第一种方案:早期的手机充电器是分开做的,充电头和充电线是连在一起的,但是现在的手机都是采用电源适配器和数据线的方案。我现在要说的适配器模式就是把一个类的接口转换成客户想要的另一个接口,让那些因为接口不兼容而不能一起工作的类可以一起工作。适应的意思是适应、适应。通俗地说,适配器模式适用于相关但不兼容的结构。源接口只有经过中间件转换后才能应用于目标接口。这个转换过程就是适配,这个中间件叫做适配器。家用电源和USB数据线之间有一个相关性:家用电源的输出电压,USB数据线的输入电压。但是这两个接口是不兼容的,因为一个输出220V,一个输入5V,需要适配器把输出220V转换成输出5V,才能一起工作。接下来我用一个程序来模拟这个过程:家用电源提供220V电压HomeBattery类:classHomeBattery{intsupply(){//家用电源提供220V输出电压return220;}}USB数据线只接收5V充电电压USBLineClass:classUSBLine{voidcharge(intvolt){//如果电压不是5V,抛出异常if(volt!=5)thrownewIllegalArgumentException("Canonlyreceive5Vvoltage");//如果电压是5V,正常充电System.out。println("正常充电");}}我们先看看适配前,如果用户直接用家里的电源给手机充电:.println("家庭电源提供的电压为"+homeVolt+"V");USBLineusbLine=newUSBLine();usbLine.charge(homeVolt);}}运行结果如下:家庭电源提供的电压电源是220Vjava。lang.IllegalArgumentException:Canonlyreceive5Vvoltage这时候如果加一个电源适配器:AdapterclassclassAdapter{intconvert(inthomeVolt){//适配过程:用电阻、电容等器件降压输出5VintchargeVolt=homeVolt-215;returnchargeVolt;}}然后,用户使用适配器将家庭电源提供的电压转换为充电电压:;System.out.println("家庭用电电源提供的电压为"+homeVolt+"V");Adapteradapter=newAdapter();intchargeVolt=adapter.convert(homeVolt);System.out.println("使用适配器将home电压转换为"+chargeVolt+"V");USBLineusbLine=newUSBLine();usbLine.charge(chargeVolt);}}运行结果如下:家用电源提供的电压为220V用适配器将家用电压转换为5V即可正常充电。这个就是adapter模式,在我们日常开发中经常用到,各种Adapter都会用到,都属于adapter模式的应用。但是adapter模式不推荐多用,因为它比较好未雨绸缪不如修好,如果能提前预防接口不同的问题,就不会出现不匹配的问题,只有遇到源码接口不能改的时候,才考虑使用适配器。比如很多现代的电源插座都增加了专门的充电功能接口,让我们不再需要使用适配器来转换接口。这是社会的又一次进步。以上内容是我的看法。对结构模式做一个简单的总结,会让你对结构模式整体有一些认识和了解。在本文中,我将以结构模式中的适配器模式为例进行代码演示,也能让大家进一步了解结构。类型模式,程序是一个不断完善的过程,希望大家在学习了设计模式后能够学以致用,优化自己的程序。
