디시인사이드 갤러리

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

갤러리 본문 영역

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

마갤러(220.95) 2024.04.28 15:48:39
조회 79 추천 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
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 SNS로 싸우면 절대 안 질 것 같은 고집 있는 스타는? 운영자 24/05/06 - -
AD 나혼렙 어라이즈 그랜드 론칭! 운영자 24/05/09 - -
공지 마인크래프트 갤러리 이용 안내 [65/1] 운영자 15.03.04 29388 72
87407 히든 주작 대놓고 해서 이번 마크도 오늘까지네 마갤러(211.234) 15:38 12 1
87406 난 이번 히든보단 멋사가 더 히든같은데 특공노(175.208) 15:37 34 0
87405 권왕이 나오기전에 생각했었는데 마갤러(175.208) 15:36 15 0
87404 히든 앞으로 새로운 거 나왔음 좋겠다! [2] 마갤러(119.194) 15:30 31 0
87403 [1.20.1] 가장 "핫"한서버 보글보글서버 24시 야생 ㅇㅇ(119.197) 15:29 33 0
87402 님들 아프리카티비는 [2] ㅇㅇ(218.156) 15:27 33 0
87401 악어의 놀이터2 악놀 언제가 마지막날인가용?! 띵도 참여하겠지? [3] ㅇㅇ(221.163) 15:23 41 0
87400 그 와중에 활로 사냥하면서 히든 깼노.. [13] 마갤러(59.7) 15:21 57 0
87399 금괴!!조건달성했는데 ㅇㅇ(223.222) 15:20 28 0
87398 근데 용기사는 펫은 아닐거같긴 함 [1] ㅇㅇ(180.67) 15:16 40 0
87397 서버 초반에 레시피 같은거 얻었는데 민트앵무새(180.67) 15:14 29 0
87396 악놀 번지에서 벨로시티로 바뀌었노 [2] 마갤러(58.123) 15:13 38 0
87395 권왕 페르소나 전왕 서리왕좌 마갤러(175.208) 15:13 42 0
87394 마인크래프트 레고 선물용으로 추천좀 부탁해 마갤러(112.150) 15:10 33 0
87393 닉키님 한강은 [9] 이도원(122.199) 15:08 51 0
87392 히든 추가 되었음? [18] ㅇㅇ(175.205) 15:03 70 0
87391 인정할건 인정하겠습니다 Jadenblue(119.194) 15:02 50 1
87390 자유로운 히든 추리 ㅇㅇ(121.148) 15:00 37 0
87389 마인크래프트 혼자 야생 할건데 마갤러(222.111) 14:59 26 0
87388 악놀2 [1] 마갤러(49.174) 14:55 35 0
87387 서적배달부 [1] 마갤러(220.123) 14:53 53 4
87386 히든직업 마갤러(125.136) 14:51 29 0
87385 만약에 네크로멘서가 있다면 뭔가 죽음 관련 기믹 느낌 마갤러(221.163) 14:30 31 0
87384 야 씨발 경험치 물약 어케 만드냐 [2] 마갤러(112.158) 14:29 35 0
87383 13일 밤의 늪지대 (리텍22) C418(112.221) 14:27 30 0
87382 지금 내가 가진돈으로.. [1] 민트앵무새(119.194) 14:25 41 0
87381 이것도 가능성 있나? [1] ㅇㅇ(125.135) 14:24 35 0
87380 뉴비인데 rpg 서버 추천 부탁드려요 마갤러(211.60) 14:15 32 0
87379 별풍선, 치지직, 투네이션, 트윕 후원 연동 플러그인 주문제작 [2] 마갤러(218.50) 14:15 88 0
87378 진동민 단타켜 2트 ㅇㅇ(222.117) 14:12 37 0
87377 커스텀 그림이 가능하다는 것을 잊었다. 마갤러(121.156) 14:09 99 0
87376 노가다하는 맛이 살아나는 리소스팩 마갤러(223.222) 14:09 79 1
87375 경찰학과 있잖아.. 아기고양이(125.135) 14:04 62 0
87374 아니 꼬우면 dm 보내라고 했잖아 [1] (175.205) 14:02 62 0
87373 상가와 아파트 마갤러(180.67) 14:01 84 2
87372 아프리카tv에서 뭘 보고왔는데 히든 추가되었음? [5] 마갤러(221.163) 13:59 69 0
87371 마크로 봉래제 열면 모두가 코스어가될수있음 [2] 마갤러(175.208) 13:58 72 0
87370 작은 미로! [2] ㅇㅇ(182.222) 13:44 92 0
87369 플러그인으로 아이템 액자 커스텀 할수 있는 플러그인 없음 [2] ㅇㅇ(222.117) 13:44 52 0
87368 악놀 4대명검 [3] ㅇㅇ(175.124) 13:43 85 0
87367 마크 버섯 안자라는데 뭐냐 [9] ㅇㅇ(222.109) 13:40 82 0
87366 [리프월드] 라따뚜이와피자를 만들기 와 다양한 컨텐츠 마갤러(211.179) 13:33 62 0
87365 업뎃 현재 [1] ㅇㅇ(211.49) 13:31 55 0
87364 갤러리 방역 마려움 [6] NotApply(125.136) 13:26 68 0
87363 멤버십 콩콩화면 스포 마갤러(211.178) 13:17 72 0
87362 이거 근들근들해도 될려나? [5] ㅇㅇ(59.7) 13:14 84 0
87361 개쩌는 현실경제 서버 같이 만들 사람? (1.20.x) ㅇㅇ(218.50) 13:13 85 0
87360 이벤트 관련 [3] 칼바람(59.7) 13:12 83 0
87359 랜덤스폰 ㅇㅇ(121.148) 13:09 35 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2