1. 의미 facade 사전적 의미 → (건물의) 정면; 앞면. 복잡한 서브 시스템(라이브러리, 프레임워크) 의존성을 최소화하는 방법 모든 기능들을 숨긴다 특정한 기능을 감싸고 있는 인터페이스 클라이언트가 사용해야 하는 복잡한 서브 시스템 의존성을 간단한 인터페이스로 추상화 복잡한 클래스나 메소드를 클라이언트가 직접 사용하지 않고 우리가 만든 facade 만을 이용하도록 함 2. 작성방법 아래 메일 전송 샘플 코드를 퍼사드 패턴으로 적용해본다. 2.1. 적용전 class Client { public static void main(String[] args) { String to = "keesun@whiteship.me"; String from = "whiteship@whiteship.me"; String ..
1. 의미 기존 코드를 변경하지 않고 부가 기능을 추가하는 패턴 상속이 아닌 위임을 사용해서 보다 유연하게(런타임) 부가 기능을 추가하는 것도 가능하다. 2. 작성 방법 2.1. 기존 코드에 부가기능 추가 시, 상속의 한계 CommentService : 댓글 서비스 TrimmingCommentService : CommentService상속, Trim 부가기능 추가 SpamFilteringCommentService : CommentService상속, SpamFilter 부가기능 추가 Trim기능과, SpamFilter 기능을 모두 사용하고 싶다면 새로운 서비스를 추가해야하는 상황이 발생 -> 유연하지 않는 코드 public class CommentService { public void addComment(..
1. 의미 그룹 전체와 개별 객체를 동일하게 처리할 수 있는 패턴 클라이언트 입장에서는 '전체'나 '부분'이나 모두 동일한 컴포넌트로 인식할 수 있는 계층 구조를 만든다.(Part-Whole Hierarchy) 2. 예제 가방 내부에 존재하는 아이템의 가격 계산 작성. 2.1. 패턴 적용 이전 public class Item { private String name; private int price; public Item(String name, int price) { this.name = name; this.price = price; } public String getName() { return name; } public int getPrice() { return price; } } public class..
1. 의미 추상적인 것과 구체적인 것을 분리하여 연결하는 패턴 하나의 계층 구조일 때보다 각기 나누었을 때 독립적인 계층 구조를 발전시킬 수 있다. 2. 예제 2.1. 하나의 계층 구조 public interface Champion { void move(); void skillQ(); void skillW(); void skillE(); void skillR(); } public class KDAAri implements Champion { @Override public void move() { System.out.println("KDA Ari move"); } @Override public void skillQ() { System.out.println("KDA Ari Q"); } @Override pu..
1. 의미 기존 코드를 클라이언트가 사용하는 인터페이스의 구현체로 바꿔주는 패턴 인터페이스를 따르지 않는 기존 코드를 재사용 할수 있음. 2. 예제 2.1. security package 예제로security 패키지 안에 로그인 관련 기능을 라이브러리 형식으로 제공해주고 있음. /** * 회원 정보 */ public interface UserDetails { String getUserName(); String getPassword(); } /** * 화원 관련 처리 */ public interface UserDetailsService { UserDetails loadUser(String username); } public class LoginHandler { private final UserDetails..
1. 프로토타입 패턴? 기존 인스턴스를 복제하여 새로운 인스턴스를 생성하는 방법 2. 목적 아래 PrototypeClient에서 GithubIssue를 새로 생성할때 처음부터 객체를 만드는것이 아니라 기존에 있는 인스턴스를 복제하여 바뀐부분만 수정하여 만들고자 함. public class GithubIssue { private final GithubRepository githubRepository; private Integer id; private String title; public GithubIssue(GithubRepository githubRepository) { this.githubRepository = githubRepository; } public Integer getId() { return..