반응형
💡 이터레이터 패턴 (Iterator Pattern) 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 접근할 수 있는 방법을 제공한다. ■ 예제 : 레스토랑 합병 Steak 레스토랑과 Burger 레스토랑의 합병이 결정되었다. 두 레스토랑이 합병하면서 메뉴를 통일화하고 판매하기로 했다. (1) 문제인식 1. 두 레스토랑이 합의한 메뉴 항목 : MenuItem /** * 두 가게의 합의한 메뉴 */ public class MenuItem { String name; // 메뉴명 String description; // 메뉴설명 boolean vegetarian; // 베지테리언 여부 Long price; // 가격 public MenuItem(String name, String..
💡 상태 패턴 , 스테이트 패턴 (state pattern) 객체의 내부 상태가 바뀜에 따라서 객체의 행동을 바꿀 수 있다. 마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있다. ■ 예제 : 뽑기 자판기 (1) 요구사항 "다음과 같은 방식으로 작동하는 뽑기 기계의 자바코드를 작성해주세요. 나중에 다른 기능을 추가할 가능성도 있으니 최대한 유연하고 관리하기 용이한 디자인으로 해줬으면 합니다." 상태 다이어그램을 바탕으로 상태를 정의하자. 상태정의 No Coin : 돈이 넣어져있지 않은 상태 Has Coin : 돈 넣어진 상태 Sold : 판매중의 상태 Sold Out : 매진 상태 (2) 문제인식 1. 다음과 같이 뽑기 자판기를 작성하면 될 것 같다. public class GachaMachine..
💡 파사드 패턴 (Facade Patter) 어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공한다. 퍼사드에서 고수준 인터페이스를 정의하기 때문에 서브시스템을 더 쉽게 사용할 수 있다. ■ 예제 : 홈씨어터 홈씨어터에는 앰프, 스크린, 조명, 프로젝터, 팝콘 기계 등이 존재한다. 클래스가 매우 많다. 이 클래스들은 서로 복잡하게 연결되어 있고, 제대로 쓰려면 많은 비용이 든다. 영화를 보려면 popconPopper.on(); // 팝콘 기계를 켠다. popconPopper.pop(); // 팝콘 튀긴다. light.dim(20); // 조명을 20% 로 조절한다. screen.down(); // 스크린을 내린다 amp.on(); // 앰프를 켠다 streamingPlayer.play()..
💡 어댑터 패턴 (Adapter Pattern) 한 클래스의 인터페이스를 클라이언트에서 사용하고자하는 다른 인터페이스로 변환한다. 어댑터를 이용하면 인터 페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있다. Wrapper 클래스가 다른 인터페이스를 가지더라도 같이 이용할 수 있게 래핑 클래스를 만드는 것. 전기 콘센트를 생각하면 이해하기 쉽다. 호환되지 않는 인터페이스를 사용하는 클라이언트를 그대로 활용할 수 있다. Wrapper 로 이용함으로서 클라이언트와 구현된 인터페이스를 분리시킬 수 있으며, 향후 인터페이스가 바뀌더라도 어댑터에 캡슐화되기 때문에 클라이언트는 바꿀 필요가 없어진다. ■ 예제 : 오리 어플리케이션에 칠면조 추가하기 요구사항 오리 어플리케이션의 현재 시스템에는..
💡 팩토리 메소드 패턴 (Factory Method Pattern) 객체를 생성하기위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들어지는 서브클래스에서 정하게 만든다. 즉, 팩토리 메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡기는 것 💡 추상 팩토리 패턴 (Abstract Factory Pattern) 인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체를 구상 클래스를 지정하지 않고도 생성 1. 간단한 팩토리 (Simple Factory) 1) 문제인식 다음과 같이 new 키워드를 이용하면 인터페이스가 아닌 특정 구현을 사용하게 된다. Pizza pizza = new CheesePizza(); // Pizza pizza : 인터페이스를 써서 유연하게 만드려고 한다..
1. 커맨드 패턴 정의 💡 커맨드 패턴 (command pattern) 요구사항을 객체로 캡슐화 할 수 있으며, 매개변수를 써서 여러 가지 다른 요구 사항을 집어넣을수 있다. 또한 요청 내역을 큐에 저장하거나 로그로 기록할수 도있으며 작업취소 기능도 지원가능 하다. 커맨드 객체는 일련의 행동을 특정 리시버하고 연결시킴으로써 요구사항을 캡슐화한다. 이렇게 하기 위해 행동과 리시버를 한 객체에 집어넣고 메소드 하나만 외부에 공개하는 방법을 사용한다. 식당을 예로 들면 1. 손님이 웨이터에게 주문을 한다. 2. 점원이 고객의 주문을 주문서에 적는다. 3. 점원은 주문서를 주방에 전달하여 주문을 요청한다. 4. 요리사는 주문서에 적힌 주문대로 음식을 자신의 노하우로 만든다. 손님 = Client 점원 = Inv..