设计模式(6)——适配器模式

一. 概述

  将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

二. 解决的问题

  即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

三. 模式中的角色

3.1目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。

3.2需要适配的类(Adaptee):需要适配的类。

3.3适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。 

代码结构

Target

[java]  view plain copy print ?
  1.    
  2. public interface Target {    
  3.     void adapterMethod();  
  4. }  

Adaptee

[java]  view plain copy print ?
  1. public class Adaptee {  
  2.    
  3.     public void adapteeMethod() {  
  4.         Syste.out.ptintln("Adaptee method!");  
  5.     }  
  6. }  

Adapter

对象适配器:

[java]  view plain copy print ?
  1. public class Adapter implements Target {  
  2.    
  3. //引入被适配者  
  4. private Adaptee adaptee;  
  5.       
  6.     public Adapter(Adaptee adaptee) {  
  7.         this.adaptee = adaptee;  
  8.     }  
  9.    
  10.         public void adapterMethod() {  
  11.                System.out.println("Adapter method!");  
  12.     }  
  13. }  

类适配器:

[java]  view plain copy print ?
  1.  Public class Adapter extends Adapteee implements Target {  
  2.         public void adapterMethod() {  
  3.                System.out.println("Adapter method!");  
  4.     }  
  5. }  

Client

[java]  view plain copy print ?
  1. public class Test {  
  2.    
  3.     public static void main(String[] args) {  
  4.         Target target = new Adapter(new Adaptee());          
  5.         target.adapterMethod();  
  6.     }  
  7. }  

result

Adapter method!

四、例子

PS2接口

[java]  view plain copy print ?
  1. /** 
  2.  * PS2接口,圆口 
  3.  */  
  4. public interface PS2Port {  
  5.     public void workWithPS2();  
  6. }  

usb接口

[java]  view plain copy print ?
  1. /** 
  2.  * USB接口,U口 
  3.  */  
  4. public interface USBPort {  
  5.     public void workWithUSB();  
  6. }  

PS2ToUSB转换器

[java]  view plain copy print ?
  1. /** 
  2.  * 对象适配器 
  3.  * 将PS2接口装换成USB接口 
  4.  * 所以此类类型是USB接口(implements USBPort) + 成员变量ps2Port 
  5.  */  
  6. public class PS2ToUSB implements USBPort {  
  7.   
  8.     private PS2Port ps2Port;  
  9.   
  10.     public PS2ToUSB(PS2Port ps2Port) {  
  11.         this.ps2Port = ps2Port;  
  12.     }  
  13.   
  14.     @Override  
  15.     public void workWithUSB() {  
  16.         System.out.println("转换的关键在这里,本来是");  
  17.         ps2Port.workWithPS2();  
  18.         System.out.println("经过你的转换,现在是USB工作中");  
  19.     }  
  20.   
  21. }  

场景类

[java]  view plain copy print ?
  1. public class Client {  
  2.   
  3.     public static void main(String[] args) {  
  4.         //1.我现在有一个PS2接口  
  5.         PS2Port ps2Port = new WorkPiece();  
  6.         //2.但是我需要的是一个USB接口啊,对我(client)来说,我只认识USB接口  
  7.         //3.经过PS2ToUSB的转换,PS2接口变成了USB接口  
  8.         USBPort ps2ToUsbPort = new PS2ToUSB(ps2Port);  
  9.         ps2ToUsbPort.workWithUSB();  
  10.   
  11.     }  
  12.   
  13. }  

其中的WorkPiece 只是一个PS2接口的一个子类

[java]  view plain copy print ?
  1. public class WorkPiece implements PS2Port {  
  2.   
  3.         public void workWithPS2() {  
  4.             System.out.println("PS2工作中");  
  5.         }  
  6.   
  7.     }   

五. 模式总结

5.1 优点

  1. 通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑。
  2. 复用了现存的类,解决了现存类和复用环境要求不一致的问题。
  3. 将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。
  4. 一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。

5.2 缺点

    对于对象适配器来说,更换适配器的实现过程比较复杂。

5.3 适用场景

  1. 系统需要使用现有的类,而这些类的接口不符合系统的接口。
  2. 想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
  3. 两个类所做的事情相同或相似,但是具有不同接口的时候。
  4. 旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。
  5. 使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。

5.4 “对象”适配器和“类”适配器。

1)对象适配器:使用对象组合,以修改的接口包装被适配者,被适配者的任何子类都可以搭配着适配器使用。

2)类适配器:使用继承,不需要重新实现整个被适配者。

6. 适配器应用举例

手机电源适配器

 

在java 中有一种叫做“缺省适配模式”的应用,它和我们所讲的适配器模式是完全的两种东西。缺省适配模式是为一个接口提供缺省的实现,这样子类型就可以从缺省适配模式中进行扩展,避免了从原有接口中扩展时要实现一些自己不关心的接口。在java.awt.event 中的XXXAdapter 就是它的很好的例子

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值