设计模式(4)——外观模式

Facade模式

一、定义

为子系统中的一组接口提供一个统一接口。Facade模式定义了一个更高层的接口,使子系统更加容易使用。

二、例子1

      大致意思是说:使用一种比原有方式更简单的办法与系统交互。例如,我们把一个很文件的文件,放在了第二抽屉里,而第二个抽屉的钥匙放在了第一个抽屉里,我们要想取出这个文件,第一步肯定要拿到第一个抽屉的钥匙,然后打开它再拿出第二个抽屉的钥匙,最后打开第二个抽屉取出文件。

 我就上面说的那个情形写一下实现代码,首先我们要实现二个子系统,呵呵,把抽屉比喻成系统,(DrawerOneDrawerTwo):

子系统1

[java]  view plain copy print ?
  1. class DrawerOne {  
  2.   
  3.     public void open() {  
  4.   
  5.         System.out.println("第一个抽屉被打开了");  
  6.   
  7.         getKey();  
  8.   
  9.     }  
  10.   
  11.     public void getKey() {  
  12.   
  13.         System.out.println("得到第二个抽屉的钥匙");  
  14.   
  15.     }  
  16.   
  17. }  

子系统2

[java]  view plain copy print ?
  1. class DrawerTwo {  
  2.   
  3.     public void open() {  
  4.   
  5.         System.out.println("第二个抽屉被打开了");  
  6.   
  7.         getFile();  
  8.   
  9.     }  
  10.   
  11.     public void getFile() {  
  12.   
  13.         System.out.println("得到这个重要文件");  
  14.   
  15.     }  
  16.   
  17. }  

不使用Façade模式的情况

[java]  view plain copy print ?
  1. public class Client {  
  2.   
  3.     public static void main(String[] args) {  
  4.   
  5.         DrawerOne darwerOne = new DrawerOne();  
  6.   
  7.         DrawerTwo darwerTwo = new DrawerTwo();  
  8.   
  9.         darwerOne.open();  
  10.   
  11.         darwerTwo.open();  
  12.   
  13.     }  
  14.   
  15. }  

由于没有使用Façade模式,可以看到要想得到这个文件要首先打开第一个抽屉,然后再打开第二个抽屉,在我们实际所开发的系统中,有时候客户要实现某一操作,并不需要知道实现这一操作的详细步骤,而是简单地点击某一个按钮就可以得到自己想要的结果。

使用Façade模式进行改进建立一个FacadeDrawer类:

[java]  view plain copy print ?
  1. class DrawerFacade {  
  2.   
  3.     DrawerOne darwerOne = new DrawerOne();  
  4.   
  5.     DrawerTwo darwerTwo = new DrawerTwo();  
  6.   
  7.     public void open() {  
  8.   
  9.         darwerOne.open();  
  10.   
  11.         darwerTwo.open();  
  12.   
  13.     }  
  14.   
  15. }  

修改Client类:

[java]  view plain copy print ?
  1. public class DrawerClient{  
  2.   
  3.    public static void main(String []args){  
  4.   
  5.       DrawerFacade drawer=new DrawerFacade();  
  6.   
  7.       drawer.open();  
  8.   
  9.    }  
  10.   
  11. }  

输出结果如下:

第一个抽屉被打开了

得到第二个抽屉的钥匙

第二个抽屉被打开了

得到这个重要文件

正如上面所说,客户端client,它并不需要关心子系统,而是关心DrawerFacade所留下来的和外部交互的接口,而子系统在DrawerFacade的聚合

三、例子2

A系统有A1, A2, A3等类。客户端需要调用A系统的的A1.doSomething1();A2.doSomething2();A3.doSomething3()三个方法来完成某功能。Facade模式的实现模型就是:

A1

[java]  view plain copy print ?
  1. class A1 {  
  2.     public void doSomething1() {}  
  3. }  

A2

[java]  view plain copy print ?
  1. class A2 {  
  2.     public void doSomething2() {}  
  3. }  

A3

[java]  view plain copy print ?
  1. class A3 {  
  2.     public void doSomething3() {}  
  3. }  

Facade:

[java]  view plain copy print ?
  1. public class Facade {  
  2.     public void doSomething() {  
  3.         A1 a1 = new A1();  
  4.         A1 a2 = new A2();  
  5.         A1 a3 = new A3();  
  6.   
  7.         a1.doSomething1();  
  8.         a2.doSomething2();  
  9.         a3.doSomething3();  
  10.     }  
  11. }  

Client:

[java]  view plain copy print ?
  1. public class Client {  
  2.     public static void main(String[] args) {  
  3.         Facade facade = new Facade();  
  4.         facade.doSomething();  
  5.     }  
  6. }  

四、适用性

Facade模式主要适用于以下几种情况:

1.  为一个复杂子系统提供一个简单接口。

当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。Facade 可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过facade层。

2.提高子系统的独立性

客户程序与抽象类的实现部分之间存在着很大的依赖性。引入facade 将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。

3.在层次化结构中,可以使用Facade模式定义系统中每一层的入口。

当你需要构建一个层次结构的子系统时,使用facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过facade进行通讯,从而简化了它们之间的依赖关系。

4.希望使用原系统的功能,而且还希望增加一些新的功能。

五、Facade的几个要点

  从客户程序的角度来看,Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果——内部子系统的任何变化不会影响到Façade接口的变化。  

 Façade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Façade很多时候更是一种架构设计模式。 

 Façade设计模式并非一个集装箱,可以任意地放进任何多个对象。Façade模式中组件的内部应该是“相互耦合关系比较大的一系列组件”,而不是一个简单的功能集合。  

  注意区分Façade模式、Adapter模式、Bridge模式与Decorator模式。Façade模式注重简化接口,Adapter模式注重转换接口,Bridge模式注重分离接口(抽象)与其实现,Decorator模式注重稳定接口的前提下为对象扩展功能。

  • 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、付费专栏及课程。

余额充值