> Java > java지도 시간 > 저는 5년 동안 일해왔지만 아직도 파사드 모델을 이해하지 못합니다!

저는 5년 동안 일해왔지만 아직도 파사드 모델을 이해하지 못합니다!

풀어 주다: 2023-08-28 15:11:34
앞으로
896명이 탐색했습니다.


자, 테마를 입력해 보겠습니다. 오늘은 디자인 패턴에 외관 모드. 门面模式用贴切的生活故事,以及真实项目场景来讲设计模式,最后用一句话来总结这个设计模式。

故事

开发的朋友都知道,后端开发通常都是:

controller---servie---dao/mapper/repository

但是,我问过很多人,熟悉门面模式不?有的工作五年了都不知道。

今天老田,就带你来看看门面模式。

门面模式概述

门面模式(Facade Pattern

적절한 인생 이야기와 실제 프로젝트 시나리오로 이야기합니다

디자인 패턴

, 그리고 마지막으로 이 디자인 패턴을 한 문장으로 요약합니다. 🎜🎜

🎜Story🎜 🎜

🎜개발 친구들은 모두 백엔드 개발이 일반적으로 다음과 같다는 것을 알고 있습니다: 🎜

controller---servie---dao/mapper/repository🎜

🎜 하지만 저는 많은 사람들에게 물어봤는데, 파사드 모델에 대해 잘 알고 있나요? 5년 동안 일했는데도 모르는 사람도 있어요. 🎜🎜오늘은 Lao Tian이 파사드 모드를 보여드리겠습니다. 🎜

🎜외관 모드 개요🎜 🎜

🎜Facade 모드(외관 패턴)은 모양 모드라고도 하며 하위 시스템 인터페이스 그룹에 액세스하기 위한 통합 인터페이스를 제공합니다. 주요 특징은 서브시스템을 보다 쉽게 ​​사용할 수 있도록 상위 수준의 인터페이스를 정의한다는 점이며 구조적 디자인 패턴에 속합니다. 🎜🎜영어:🎜

하위 시스템의 인터페이스 집합에 통합 인터페이스를 제공합니다. Facade는 하위 시스템을 더 쉽게 사용할 수 있도록 하는 상위 수준 인터페이스를 정의합니다.

실제로 우리 모두는 일상적인 코딩 작업에서 의도적으로 광범위하게 Facade 패턴을 사용합니다. 아니면 의도치 않게. 상위 수준 모듈이 여러 하위 시스템(2개 이상의 클래스 개체)을 예약해야 할 때마다 이러한 하위 시스템을 캡슐화하기 위해 의식적으로 새 클래스를 만들고 상위 수준 모듈이 이러한 기능을 간접적으로 더 쉽게 호출할 수 있도록 간소화된 인터페이스를 제공합니다. 하위 시스템.

Cases in life

파사드 모델에 관해서는 삶의 사례가 많습니다.

사례 1: 업무를 처리하기 위해 은행에 가면 프론트 데스크가 여러분을 맞이할 것입니다. 그러면 프론트 데스크에서 어떤 업무를 해야 하는지 물어보고 하나씩 안내해 줄 것입니다. 그래서 우리는 돌아다니면서 해당 비즈니스 창구를 찾을 필요가 없습니다. 이 프론트 데스크 직원은 외관 모델에 해당합니다.

사례 2: 집을 지을 때 시공업체가 없으면 시멘트 작업자, 전기 기술자, 장식 작업자 등을 직접 찾아야 합니다. 그러나 계약자가 있는 경우에는 이러한 작업을 수행할 필요가 없습니다. 배선을 수리하려면 전기 기술자가 필요하다고 계약자에게 직접 알릴 수 있습니다. 이 계약자는 외관 모델로 이해될 수 있습니다.

사례 3: controller,也可以理解为门面模式,比如说获取用户账户信息,先查UserService获取用户信息,然后查UserAccountService백엔드에서 개발한 사용자 계정 정보.

Facade 모드에 적용 가능한 시나리오

소프트웨어 시스템에서 Facade 모드는 다음과 같은 응용 시나리오에 적합합니다.

  • 복잡한 모듈이나 하위 시스템에 대한 외부 액세스를 위한 간단한 인터페이스를 제공합니다.
  • 하위 시스템의 독립성을 향상시키고 싶을 때.
  • 부득이한 일시적인 사유로 인해 하위 시스템에 버그나 성능 관련 문제가 발생할 수 있는 경우 Facade 모드를 통해 상위 수준의 인터페이스를 제공하여 클라이언트와 하위 시스템 간의 직접적인 상호 작용을 격리하여 코드 오염을 방지할 수 있습니다.

Facade 모드의 일반적인 작성 방법

간단한 Facade 모드를 구현하려면 코드를 사용하는 것이 더 좋습니다. 데모부터 시작하는 것이 가장 좋기 때문입니다.

비즈니스 시나리오: 이제 세 가지 서비스의 해당 메소드를 호출해야 합니다.

public class ServiceA {
    public void doA(){
        System.out.println("do ServiceA");
    }
}
public class ServiceB {
    public void doB(){
        System.out.println("do ServiceB");
    }
}

public class ServiceC {
    public void doC(){
        System.out.println("do ServiceC");
    }
}
로그인 후 복사

파사드 모드가 도입되지 않으면 클라이언트는 이를 다음과 같이 호출합니다.

public class Client {
    public static void main(String[] args) {
        ServiceA serviceA=new ServiceA();
        ServiceB serviceB=new ServiceB();
        ServiceC serviceC=new ServiceC();

        serviceA.doA();
        serviceB.doB();
        serviceC.doC();
    }
}
로그인 후 복사

매번 클라이언트는 많은 양의 서비스를 생성해야 합니다. 서비스 객체가 많다면 이 코드가 어색하지 않을까요? 반복되는 코드가 많을 겁니다.

실행 결과

do ServiceA
do ServiceB
do ServiceC
로그인 후 복사
로그인 후 복사

지금 참여합시다门面模式:

public class Facade {
    //是不是很像我们controller里注入各种service?
    private ServiceA serviceA = new ServiceA();
    private ServiceB serviceB = new ServiceB();
    private ServiceC serviceC = new ServiceC();

    public void doA() {
        serviceA.doA();
    }

    public void doB() {
        serviceB.doB();
    }

    public void doC() {
        serviceC.doC();
    }
}
로그인 후 복사

클라이언트는 다음과 같습니다.

public class Client {
    public static void main(String[] args) {
        //轻轻松松的搞定,只需要创建门面这个对象即可
        Facade facade=new Facade();
        facade.doA();
        facade.doB();
        facade.doC();
    }
}
로그인 후 복사

실행 결과:

do ServiceA
do ServiceB
do ServiceC
로그인 후 복사
로그인 후 복사

외관 패턴 UML 다이어그램


저는 5년 동안 일해왔지만 아직도 파사드 모델을 이해하지 못합니다!

이 UML과 결합됨 다이어그램을 통해 은행 프론트 데스크 직원과 계약업체의 사례를 검토하면 외관 패턴을 이해하기가 더 쉽습니다.

파사드 모드의 캐릭터

위 그림에서 볼 수 있듯이 파사드 모드에는 주로 2개의 캐릭터가 포함되어 있습니다.

  • 외관 문자(외관): 파사드 역할이라고도 하며 시스템의 통합된 외부 인터페이스입니다. Facade):也叫作门面角色,是系统对外的统一接口。
  • 子系统角色(Service):可以同时有一个或多个Service。每个Service都不是一个单独的类,而是一个类的集合。Service们并不知道Facade的存在,对于Service们而言,Facade 只是另一个客户端而已(即FacadeServiceAServiceBServiceC
하위 시스템 역할(서비스 ) : 하나 이상의 서비스</code >. 각<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px; background-color: rgba(27, 31, 35, 0.05) ; font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">Service는 별도의 클래스가 아니지만, 수업 모음. 서비스 사람들은 모릅니다Facade의 존재, 서비스용, Facade는 또 다른 클라이언트입니다(예: 외관ServiceA, ServiceB, ServiceC투명).

외관 패턴 확장

장점

● 시스템 상호의존성 감소 생각해 보세요. Facade 모드를 사용하지 않으면 외부 액세스가 하위 시스템으로 직접 들어가고, 둘 사이에는 강한 결합 관계가 있고, 당신이 살면 나도 살 것입니다. 강력한 의존성은 시스템 설계의 결과입니다. 받아들일 수 없는 일이지만, 파사드 패턴의 출현은 이 문제를 매우 잘 해결합니다. 모든 종속성은 파사드 객체에 있으며 하위 시스템과는 아무런 관련이 없습니다. 🎜🎜● 유연성 향상 의존성은 줄어들고 유연성은 자연스럽게 높아집니다. 서브시스템이 내부적으로 어떻게 변경되더라도 파사드 객체에 영향을 주지 않는 한 자유롭게 이동할 수 있습니다. 🎜

● 提高安全性   想让你访问子系统的哪些业务就开通哪些逻辑,不在门面上开通的方法,你休想访问到 。

缺点

  • 当增加子系统和扩展子系统行为时,可能容易带来未知风险。
  • 不符合开闭原则。
  • 某些情况下,可能违背单一职责原则

大神们是如何使用的

Spring中也是有大量使用到门面模式,比如说

org.springframework.jdbc.support.JdbcUtils
로그인 후 복사

再来看看其中的方法

public static void closeConnection(@Nullable Connection con) {
    con.close();
}
public static Object extractDatabaseMetaData(DataSource dataSource, DatabaseMetaDataCallback action)
   throws MetaDataAccessException {
    Connection con = null;
  try {
   con = DataSourceUtils.getConnection(dataSource);
   DatabaseMetaData metaData = con.getMetaData();
   if (metaData == null) {
      //.....
   }
   return action.processMetaData(metaData);
  }
}
......
로그인 후 복사

都是给我封装好了方法,对于我们开发者来说,我只面向JdbcUtils这一个类就好了,我不用去管ConnectionResultSet等是怎么创建的,需要的时候,我调用JdbcUtils的对应方法即可获得对应的对象。

Mybatis中也是用到了门面模式,比如:

org.apache.ibatis.session.Configuration
로그인 후 복사

Configuration中以new开头的方法,比如:

public Executor newExecutor(Transaction transaction) {
    return newExecutor(transaction, defaultExecutorType);
}
public MetaObject newMetaObject(Object object) {
    return MetaObject.forObject(object, objectFactory, objectWrapperFactory, reflectorFactory);
}

public ParameterHandler newParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {
    ...
    return parameterHandler;
}

public ResultSetHandler newResultSetHandler(Executor executor, MappedStatement mappedStatement, RowBounds rowBounds, ParameterHandler parameterHandler,
      ResultHandler resultHandler, BoundSql boundSql) {
   ...
    return resultSetHandler;
}

public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement){
   ...
}
로그인 후 복사

对于调用这些方法的地方,他并不知道是怎么new出来的对象,只管使用就行了。

Tomcat中也有门面模式,比如:

org.apache.catalina.connector.RequestFacade
로그인 후 복사

从名字就知道它用了门面模式。它封装了非常多的request操作,也整合了很多servlet-api以外的内容,给用户使用提供了很大便捷。同样,Tomcat针对ResponseSession也封装了对应的ResponseFacade类和StandardSessionFacade类,感兴趣的小伙伴可以深入了解一下。

PS:基本上所有以Facade结尾的类,都是使用到了门面模式。

참고자료: Tom의 디자인 패턴 강좌

Summary

알겠습니다. 이 글을 읽고 나면 Facade 모드가 실제로 매우 간단하다고 생각하시나요? 직장에서도 사용할 수 있나요? 사용할 수 있는지 생각해 보세요. 동시에 면접 시 자랑할 수도 있습니다.

위 내용은 저는 5년 동안 일해왔지만 아직도 파사드 모델을 이해하지 못합니다!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:Java后端技术全栈
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿