zoukankan      html  css  js  c++  java
  • Java设计模式之外观模式

     一、简介

        外观模式(Facade),隐藏内部各子系统的细节与复杂性,向客户端提供一个同一的调用接口,使得复杂系统易于被访问和使用。

         外观模式,简单点讲就是把复杂的各个子系统组合成一个接口,提供给客户使用。如上图,主要涉及3个重要角色:

    1、子系统角色:实现子系统的逻辑功能。对于客户端来说是未知的,子系统之间可以有交互。

    2、门户角色:核心角色。供客户端调用,熟悉内部子系统功能。根据客户需求对子系统进行功能对组合,抽象为一个接口。

    3、客户角色:通过调用Facade接口来完成要实现的功能

    二、实战

        假设有一栋别墅,里面有很多门,比如卧室门、大厅门、厨房门,主人出远门之前必须要把这些门关上,一般的做法就是一个一个关上,如果采用外观模式,可以提供一个总开关,统一对所有门进行开关控制。

    首先定义一个关门操作的接口:

    public interface Door {
        public void closeDoor();
    }
    

      

    卧室门、大厅门、厨房门分别创建一个类,实现Door接口:

    public class BedroomDoor implements Door {
        public void closeDoor() {
            System.out.println("closing bedroom door.");
        }
    }
    
    public class KitchenDoor implements Door {
        public void closeDoor() {
            System.out.println("closing kitchen door.");
        }
    }
    
    public class HallDoor implements Door {
        public void closeDoor() {
            System.out.println("closing hall door.");
        }
    }
    

    门面类,对各种门的关门操作进行组合或者合并,只提供唯一的接口

    public class DoorFacade {
        
        Door bd = new BedroomDoor();
        Door kd = new KitchenDoor();
        Door hd = new HallDoor();
        
        public void closeDoor() {
            bd.closeDoor();
            kd.closeDoor();
            hd.closeDoor();
        }
    }
    

      

    客户端,通过调用门面类的接口即可将所有的门关闭

    public class Client {
        public static void main(String[] args) {
            DoorFacade facade = new DoorFacade();
            facade.closeDoor();
        }
    }
    

      

    运行结果: 

     三、优点

     1、松散耦合:使得客户端和子系统之间解耦,让子系统内部的模块功能更容易扩展和维护;

     2、简单易用:客户端根本不需要知道子系统内部的实现,或者根本不需要知道子系统内部的构成,它只需要跟Facade类交互即可;

    3、更好地划分访问层次:有些方法是对系统外的,有些方法是系统内部相互交互的使用的。子系统把那些暴露给外部的功能集中到门面中,这样就可以实现客户端的使用,很好的隐藏了子系                                              统内部的细节。

  • 相关阅读:
    js将url转换二维码
    百度地图api使用
    js字符串转日期兼容性
    Object.keys的使用
    Web App和Native App的比较
    数组转为对象
    常用meta整理
    git merge和git rebase的区别
    GitHub 翻译之 'Hello-world' 翻译
    js数据类型
  • 原文地址:https://www.cnblogs.com/will-shun/p/7436746.html
Copyright © 2011-2022 走看看