자, 테마를 입력해 보겠습니다. 오늘은 디자인 패턴에 외관 모드
. 门面模式
。用贴切的生活故事,以及真实项目场景来讲设计模式
,最后用一句话来总结这个设计模式。
开发的朋友都知道,后端开发通常都是:
controller---servie---dao/mapper/repository
但是,我问过很多人,熟悉门面模式不?有的工作五年了都不知道。
今天老田,就带你来看看门面模式。
门面模式(Facade Pattern
디자인 패턴
🎜 하지만 저는 많은 사람들에게 물어봤는데, 파사드 모델에 대해 잘 알고 있나요? 5년 동안 일했는데도 모르는 사람도 있어요. 🎜🎜오늘은 Lao Tian이 파사드 모드를 보여드리겠습니다. 🎜controller---servie---dao/mapper/repository🎜
외관 패턴
)은 모양 모드라고도 하며 하위 시스템 인터페이스 그룹에 액세스하기 위한 통합 인터페이스를 제공합니다. 주요 특징은 서브시스템을 보다 쉽게 사용할 수 있도록 상위 수준의 인터페이스를 정의한다는 점이며 구조적 디자인 패턴에 속합니다. 🎜🎜영어:🎜하위 시스템의 인터페이스 집합에 통합 인터페이스를 제공합니다. Facade는 하위 시스템을 더 쉽게 사용할 수 있도록 하는 상위 수준 인터페이스를 정의합니다.
실제로 우리 모두는 일상적인 코딩 작업에서 의도적으로 광범위하게 Facade 패턴을 사용합니다. 아니면 의도치 않게. 상위 수준 모듈이 여러 하위 시스템(2개 이상의 클래스 개체)을 예약해야 할 때마다 이러한 하위 시스템을 캡슐화하기 위해 의식적으로 새 클래스를 만들고 상위 수준 모듈이 이러한 기능을 간접적으로 더 쉽게 호출할 수 있도록 간소화된 인터페이스를 제공합니다. 하위 시스템.
파사드 모델에 관해서는 삶의 사례가 많습니다.
사례 1: 업무를 처리하기 위해 은행에 가면 프론트 데스크가 여러분을 맞이할 것입니다. 그러면 프론트 데스크에서 어떤 업무를 해야 하는지 물어보고 하나씩 안내해 줄 것입니다. 그래서 우리는 돌아다니면서 해당 비즈니스 창구를 찾을 필요가 없습니다. 이 프론트 데스크 직원은 외관 모델에 해당합니다.
사례 2: 집을 지을 때 시공업체가 없으면 시멘트 작업자, 전기 기술자, 장식 작업자 등을 직접 찾아야 합니다. 그러나 계약자가 있는 경우에는 이러한 작업을 수행할 필요가 없습니다. 배선을 수리하려면 전기 기술자가 필요하다고 계약자에게 직접 알릴 수 있습니다. 이 계약자는 외관 모델로 이해될 수 있습니다.
사례 3: controller
,也可以理解为门面模式,比如说获取用户账户信息,先查UserService
获取用户信息,然后查UserAccountService
백엔드에서 개발한 사용자 계정 정보.
소프트웨어 시스템에서 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과 결합됨 다이어그램을 통해 은행 프론트 데스크 직원과 계약업체의 사례를 검토하면 외관 패턴을 이해하기가 더 쉽습니다.
위 그림에서 볼 수 있듯이 파사드 모드에는 주로 2개의 캐릭터가 포함되어 있습니다.
외관
): 파사드 역할이라고도 하며 시스템의 통합된 외부 인터페이스입니다. Facade
):也叫作门面角色,是系统对外的统一接口。Service
):可以同时有一个或多个Service
。每个Service
都不是一个单独的类,而是一个类的集合。Service
们并不知道Facade
的存在,对于Service们而言,Facade
只是另一个客户端而已(即Facade
对ServiceA
、ServiceB
、ServiceC
서비스
) : 하나 이상의 서비스</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
투명). ● 提高安全性 想让你访问子系统的哪些业务就开通哪些逻辑,不在门面上开通的方法,你休想访问到 。
违背单一职责原则
。在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
这一个类就好了,我不用去管Connection
、ResultSet
等是怎么创建的,需要的时候,我调用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
针对Response
和Session
也封装了对应的ResponseFacade
类和StandardSessionFacade
类,感兴趣的小伙伴可以深入了解一下。
PS
:基本上所有以Facade
结尾的类,都是使用到了门面模式。
참고자료: Tom의 디자인 패턴 강좌
알겠습니다. 이 글을 읽고 나면 Facade 모드가 실제로 매우 간단하다고 생각하시나요? 직장에서도 사용할 수 있나요? 사용할 수 있는지 생각해 보세요. 동시에 면접 시 자랑할 수도 있습니다.
위 내용은 저는 5년 동안 일해왔지만 아직도 파사드 모델을 이해하지 못합니다!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!