디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

[Java] 디자인 패턴: 행동-플루언트 인터페이스

마갤러(220.95) 2024.04.28 15:48:39
조회 82 추천 1 댓글 0

[!] 디자인 패턴 소개:

다른 이름: Fluent API, Method Chaining

1. 소개

플루언트 인터페이스 패턴은 메서드 체이닝을 통해 전반적인 설계를 진행하는 디자인 패턴임. 소프트웨어의 동작을 마치 산문을 읽는 것처럼 보이게 하여 가독성을 올리는 것이 주 목적임.

2. 메서드 체이닝

publicclass ChainingObject {public ChainingObject execute1(){// do somethingreturnthis;}public ChainingObject execute2(){// do somethingreturnthis;}public ChainingObject execute3(){// do somethingreturnthis;}}
publicclass ChainingExample {publicvoidchaining(){ ChainingObject object =new ChainingObject(); object.execute1().execute2().execute3();// method chaining}}

메서드 체이닝이란 메서드가 this를 반환하여, 위와 같이 메서드 뒤에 다른 메서드를 체인처럼 연결하는 기법을 말함. 보다시피 메서드가 ChainingObject를 반환하기 때문에 뒤에 Chaining Object의 다른 기능들을 실행할 수 있음.

3. 예시

publicclass MiniGameConfig {private MiniGameType type;private String id;private String name;public MiniGameConfig setType(MiniGameType type){this.type = type;returnthis;}public MiniGameConfig setId(String id){this.id = id;returnthis;}public MiniGameConfig setName(String name){this.name = name;returnthis;}public MiniGame build(){returnnew MiniGame(this);}}
publicclass MiniGame {private MiniGameConfig config;private final List<MiniGameTeam> teams =new ArrayList<>();publicMiniGame(MiniGameConfig config){this.config = config;}public MiniGame addTeam(MiniGameTeam team){ teams.add(team);returnthis;}public MiniGameTeam getTeam(String teamId){return teams.stream().filter(team -> team.getId().equals(teamId)).findFirst().orElse(nulll);}public MiniGame addPlayer(String teamId, MiniGamePlayer player){getTeam(teamId).addPlayer(player);returnthis;}publicvoidstart(){// do start logic}}
publicclass Application {publicstaticvoidmain(String[] args){ MiniGame game =new MiniGameConfig().setType(MiniGameType.TDM).setId("test_tdm").setName("Test TDM Game").build(); game.addTeam(new MiniGameTeam("RED")).addTeam(new MiniGameTeam("BLUE")).addPlayer("RED",new MiniGamePlayer("Red1")).addPlayer("RED",new MiniGamePlayer("Red2")).addPlayer("BLUE",new MiniGamePlayer("Blue1")).addPlayer("BLUE",new MiniGamePlayer("Blue2")).start();}}

Java Stream API, 빌더 패턴은 메서드 체이닝을 이용하는 대표적인 예시임. 이와 같이 플루언트 인터페이스 패턴은 여러 구현에서 광범위하게 적용될 수 있음.

4. 장점 및 단점

가독성이 올라감. 이런 이유로 API에 적용하기 적합함.

복잡한 객체를 단계별로 작동하게 할 수 있음. 또한 직관적이고 오류가 덜 발생하게 할 수 있음.

코드 상용구(Boilerplate)를 줄일 수 있음.

필수 메서드 호출을 누락하는 등 실수를 해도 컴파일 타임에 문제를 알아차리기 힘듬.

한줄로 쓸 경우 디버깅시 어디서 오류가 발생했는지 알기 어려움.

과도하게 사용하면 오히려 가독성을 떨어트릴 수 있음.

5. 참고 자료

https://en.wikipedia.org/wiki/Fluent_interface

https://java-design-patterns.com/patterns/fluentinterface/

https://ko.wikipedia.org/wiki/%ED%94%8C%EB%A3%A8%EC%96%B8%ED%8A%B8_%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4

작성/수정 일자:2024.04.26

추천 비추천

1

고정닉 0

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 시세차익 부러워 부동산 보는 눈 배우고 싶은 스타는? 운영자 24/05/27 - -
AD 희귀 정령 획득 기회! <아스달 연대기> 출석 이벤트 운영자 24/05/23 - -
공지 마인크래프트 갤러리 이용 안내 [67/1] 운영자 15.03.04 29907 72
91531 TUSK act 4! 마갤러(175.124) 07:52 23 0
91530 밤새 모아둔 아스라이 쌓인 고운 마음도 다 가져가셔요 나무(222.103) 06:47 53 0
91529 간단한 베드락에디션 크리퍼팜 추천좀요 마갤러(116.126) 06:45 22 0
91528 아이템에더 및 코스메틱 코어 자동화 프로그램 [2] 마갤러(121.141) 05:23 100 6
91527 대형마크섭이 스트리머한테 진짜 개꿀이긴 하네 마갤러(121.129) 05:16 60 0
91526 궁금한게 있습니니다. [4] ㅇㅇ(222.234) 05:16 49 0
91525 시계를 볼때마다 4시44분이에요 ㅇㅇ(182.212) 04:44 57 0
91524 요즘 놀이터 정말 재밌음 ㅇㅇ(221.167) 04:32 45 0
91523 모드팩 같이 할 게이 구함 ㅇㅇ(121.129) 03:53 66 0
91522 역시 건축은... ㅇㅇ(221.158) 03:46 48 0
91521 자운 프로젝트... [2] 마갤러(175.127) 03:36 107 0
91520 짤녀 꼴리면 자러감 알렉스말랑뷰갤로그로 이동합니다. 03:34 85 0
91519 마크에 이딴 킬로그도 있었네 [4] 마갤러(121.129) 03:19 119 0
91518 마인크래프트 월드가 다 없어졋음.. [1] 마갤러(125.132) 03:13 75 0
91517 콘서트 끝나고 악놀 완 기운 심할까봐 걱정됐는데 마갤러(175.200) 03:12 65 0
91516 악놀 악어 시점 [2] 마갤러(211.57) 02:37 112 0
91515 ...쓸적... [1] ㅇㅇ(59.15) 02:22 40 0
91514 마크 15주년 망토 질문 마갤러(174.107) 02:11 29 0
91513 [Sem;colon] 컨텐츠 제작팀 Semicolon 팀원 모집함 마갤러(211.57) 02:09 73 0
91512 마법학교 [5] ㅇㅇ(175.200) 02:09 40 0
91511 100일차 [2] 시로카네(121.129) 02:07 56 0
91510 히든 힌트 분석? ㅇㅇ(125.132) 02:02 79 0
91509 지옥 용암지대걸어다니는게이는없나여?? [1] ㅇㅇ(221.166) 02:00 56 0
91508 마붕아 잘자 ㅇㅇ(125.132) 01:54 46 0
91507 제발 간담회.. 소설쓰고있네(221.166) 01:36 81 0
91506 히든 추리 ㅇㅇ(121.129) 01:27 81 0
91505 지금얘기 나오고 있는 루인드 포탈이 뭐임? [2] ㅇㅇ(220.70) 01:15 98 0
91504 뭐지 팬갤러리 해킹당함? [1] ㅇㅇ(220.70) 01:14 120 0
91503 간담회를 여셨으면 해.. [1] 소설쓰고있네(220.70) 01:12 50 0
91502 (개인적인)히든 힌트 추리 마갤러(220.70) 01:11 116 0
91501 핑형 5분 단타 재밌었다 ㅇㅇ(220.70) 01:06 64 0
91500 침대로 레츠고~!! 마갤러(110.35) 01:06 92 0
91499 마쌤들 마인크래프트에서 때때로바뀌는게 뭐임? ㅇㅇ(121.173) 01:06 53 0
91498 다이아 켠왕 잔뜩 벼르고 있는 사람 [2] ㅇㅇ(110.35) 01:05 49 0
91497 모션 부드럽게 하는법 질문! ㅇㅇ(220.70) 01:05 59 0
91496 새 트윗 알렉스말랑뷰갤로그로 이동합니다. 01:04 74 0
91495 지듣노 ㅇㅇ(220.70) 01:04 47 0
91494 찬우 잘자... [8] 마갤러(110.35) 00:59 71 0
91493 이걸가?!?! [1] 마갤러(221.166) 00:59 46 0
91492 지금이라도 켜다오.. [1] ㅇㅇ(175.200) 00:58 50 0
91491 핑맨 녹화버튼인줄 알고 방종버튼 누랐네 [2] 마갤러(219.240) 00:54 144 0
91490 아니 핑맨 ㅋㅋㅋㅋ [2] 마갤러(183.103) 00:53 112 0
91489 핑맨은 전설이다... [6] ㅇㅇ(210.91) 00:53 131 0
91488 옛날에 했던 히든 추리중에 마갤러(210.91) 00:47 59 0
91487 마크런처 마갤러(1.227) 00:43 35 0
91486 여러분, 절대 포기하지 마세요. ㅇㅇ(121.144) 00:41 124 1
91485 같이 국가운영, 전쟁서버할게이 구함~ 마갤러(183.103) 00:38 91 0
91484 소신발언하자면 [3] ㅇㅇ(211.214) 00:32 89 0
91483 이제는 그냥 끝도 없네 ㅋㅋㅋㅋ [5] ㅇㅇ(125.133) 00:32 99 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2