디시인사이드 갤러리

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

갤러리 본문 영역

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

마갤러(220.95) 2024.04.28 15:48:39
조회 81 추천 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/20 - -
AD 희귀 정령 획득 기회! <아스달 연대기> 출석 이벤트 운영자 24/05/23 - -
공지 마인크래프트 갤러리 이용 안내 [66/1] 운영자 15.03.04 29819 72
90848 무릎에 좆냥이 한마리 올려놓고 마크하고싶구나 [1] ㅇㅇ(14.36) 02:24 76 0
90847 신세카이 생성 완료 마갤러(125.128) 02:24 37 0
90846 새 트윗 알렉스말랑뷰갤로그로 이동합니다. 02:20 49 0
90845 콘서트 포스터 어디에 보낼지 모르겠어서 여기다 올려봐... 무지1(211.209) 02:07 25 0
90844 맵 제작에 도움되는 취미, 그리고 탈출맵에 관한 짧은 생각 마갤러(110.11) 02:05 39 0
90843 합동컨텐츠 너무 기대중임. 마갤러(220.123) 02:03 27 0
90842 이거 켤때마다 왜 이래 제발 도와줘... 마갤러(1.240) 02:03 24 0
90841 마붕아 잘자 ㅇㅇ(220.120) 01:59 43 0
90840 이거 제거할 수 있음?? 마갤러(183.107) 01:43 45 0
90839 맛있는거 많이 버무린 약탈생존 하실분! [1] 깨굴(49.169) 01:43 30 0
90838 살생마피아3 [2] 마갤러(39.121) 01:42 33 0
90837 도드랑거리 BGM 윤팔(115.22) 01:29 55 0
90836 마인크래프트 나무곡괭이는 제조법아는데 [4] 마갤러(222.236) 01:22 88 0
90835 복귀 뉴비 렐름야생 첫 집 마갤러(221.167) 01:19 46 0
90834 마인크래프트 제조하는거 어려우면 영포티임? [2] 마갤러(59.21) 01:18 84 0
90833 빠나나가 되었습니다 ; [17] 응애여나(121.66) 01:15 115 13
90832 와 아프리카 검색어 1위 핑맨 마갤러(123.212) 01:15 87 0
90831 마인크래프트는 어느장르에 속함? [7] 마갤러(14.38) 01:13 134 0
90830 전 핑맨 박물관 찾고 있는거 이렇게 추리했는데 어떤가? 마갤러(14.42) 01:12 60 0
90829 일일컨텐츠 서바이벌 컨텐츠 추천해주셈!! 마갤러(61.74) 01:11 31 0
90828 양띵/늪지대 팀별 상징색 마갤러(221.152) 01:10 95 0
90827 지듣노 ㅇㅇ(220.95) 01:06 42 0
90826 마크체험판 해봤는데 유입은 아예 못하는겜이네 [4] 마갤러(182.221) 01:03 115 0
90825 새 트윗 알렉스말랑뷰갤로그로 이동합니다. 00:56 67 0
90824 악어티비랑 합동 컨텐츠 솔직한 생각 ㅇㅇ(61.108) 00:43 81 0
90823 님들 마크 런처 아이콘 투명인데 이거 어케 고침? 마갤러(172.226) 00:40 24 0
90822 그레이싯<<이새끼 요즘 말 많은 것 같은데 실물 사진 푼다 ㅋㅋㅋ 1sg(125.249) 00:37 131 0
90821 여러분, 절대 포기하지 마세요. [1] ㅇㅇ(219.254) 00:34 110 1
90820 소소하게 RPG서버 만드시면서 경험 쌓으실 분 구합니다 ㅇㅇ(180.69) 00:30 36 0
90819 디테일연습1 [1] 마갤러(175.192) 00:20 91 0
90818 명작 [엘리트] 탐구가 마붕이(222.108) 00:17 81 0
90817 지금 핑맨 [2] 마갤러(115.21) 00:13 107 0
90816 [배포] 마인크래프트 팀전 pvp 미니게임 맵 '숲의 왕국' korolla(61.101) 00:08 175 6
90815 새 트윗 알렉스말랑뷰갤로그로 이동합니다. 00:05 65 0
90814 (질문) 갑자기 든 의문 마갤러(222.106) 00:04 22 0
90813 예전에 양띵이 플레이 했던 마인크래프트 스토리 맵 수많은 별들 중에 [3] 마갤러(61.101) 00:04 67 7
90812 파이팅 [3] GREY(222.106) 00:03 121 0
90811 [1.20.4] 악어의놀이터를 봤다면? 라라팜!! ㅇㅇ(175.127) 00:02 82 0
90810 제 디스코드 프사 그려주실분 구합니다 [1] 쪼꼬모찌(222.106) 05.25 67 0
90809 어떤 영상일까.. [2] ㅇㅇ(183.108) 05.25 44 0
90808 유리엘라 [3] 마갤러(121.152) 05.25 73 6
90807 [성인, JE, BE 다 가능] 반야생 할게이들! 오픈한지 3주정도.. [2] ㅇㅇ(180.231) 05.25 79 0
90806 어제 양생 마갤러(221.167) 05.25 53 0
90805 내 도결남 팬아트 [4] 멜티 MeltyLand030(115.21) 05.25 84 1
90804 멤버십 관련 질문 [2] 마갤러(121.139) 05.25 46 0
90803 마소가 환불안해줌 마갤러(121.161) 05.25 32 0
90802 렐름 같이할게이!!! (성인) 마갤러(118.39) 05.25 62 0
90801 띵숲 2일차 멤버시점 [5] 마갤러(221.167) 05.25 71 1
90800 PS } 곧 제작될 국방부 전용 사이트 [2] 개추ㅋㅋㅋㅋ(175.192) 05.25 103 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2