본문 바로가기

Design Pattern11

상태 패턴 (State Pattern) 상태 패턴은 객체의 내부 상태가 바뀜에 따라서 객체의 행동을 바꿀 수 있습니다. 마치 객체의 클랙스가 바뀌는 것과 같은 결과를 얻을 수 있습니다. 상태를 별도의 클래스로 캡슐화한 다음 현재 상태를 나타내는 객체에게 행동을 위임하므로 내부 상태가 바뀔 때 행동이 달라지게 된다는 사실을 쉽게 알 수 있습니다. 상태 패턴 클래스 다이어그램 Context 객체에 수많은 조건문을 넣는 대신에 상태 패턴을 사용할 수 있습니다. 참고 에릭 프리먼, 엘리자베스 롭슨, 케이시 시에라, 버트 베이츠. 『헤드퍼스트 디자인패턴 개정판』. 한빛미디어, 2022 https://velog.io/@y_dragonrise/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%83%81%ED%83%.. 2023. 11. 6.
반복자 패턴 (Iterator Pattern) 반복자 패턴은 컬렉션의 구현 방법을 노출하지 않으면서 집합체 내의 모든 항목에 접근하는 항목을 제시합니다. 장점 모든 항목에 접근하는 작업을 컬렉션 객체가 아닌 반복자 객체가 맡게 된다. 모든 집합체에서 쓸 수 있는 다형적 코드를 만들 수 있다. 유의점 반복자에는 특별한 순서가 정해져 있지 않습니다. Iterator public interface Iterator { //수행할 항목이 있는지 여부 확인 boolean hasNext(); //다음 항목을 선택 IteratorItem next(); } Iterator 자바의 모든 컬렉션 유형에서 Iterable 인터페이스를 구현합니다. 어떤 클래스에서 Iterable을 구현하면 그 클래스는 iterator() 메소드를 구현합니다. 그 메소드는 Iterator .. 2023. 10. 30.
템플릿 메소드 패턴 (Template Method Pattern) 템플릿 메소드 패턴은 알고리즘의 골격을 정의합니다. 알고리즘의 일부 단계를 서브클래스에서 구현할 수 있으며, 알고리즘의 구조는 그대로 유지하면서 특정 단계를 서브클래스에서 재정의할 수도 있습니다. 커피와 홍차 예제 public abstract class CaffeineBeverage { final void prepareRecipe() { boilWater(); brew(); pourInCup(); addCondiments(); } abstract void brew(); abstract void addCondiments(); private void boilWater() { //물 끓이기 } private void pourInCup() { //컵에 따르기 } } public class Coffee exten.. 2023. 10. 26.
퍼사드 패턴 (Facade Pattern) 퍼사드 패턴은 서브시스템에 있는 일련의 인터페이스를 통합 인터페이스로 묶어 줍니다. 또한 고수준 인터페이스도 정의하므로 서브시스템을 더 편리하게 사용할 수 있습니다. 어댑터 패턴에선 어떤 클래스의 인터페이스를 클라이언트가 원하는 인터페이스로 변환하는 방법을 배웠습니다. 퍼사드 패턴에선 인터페이스를 단순하게 바꾸려고 인터페이스를 변경합니다. 홈시어터 예시 public class HomeTheaterFacade { PopcornPoppper popper; Projector projector; StreamingPlayer player; public void watchMovie(String movie) { popper.on(); popper.pop(); projector.on(); player.on(); pla.. 2023. 10. 24.
어댑터 패턴 (Adapter Pattern) 어댑터 패턴은 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환합니다. 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게 도와줍니다. 터키를 오리처럼 작동하게 하는 어댑터 public interface Duck { void quack(); void fly(); } public interface Turkey { void gobble(); void fly(); } public class TurkeyAdapter implements Duck{ Turkey turkey; @Override public void quack() { turkey.gobble(); } @Override public void fly() { turkey.fly(); } } 클라이언트에서 어댑터를 .. 2023. 10. 23.
커맨드 패턴 (Command Pattern) 커맨드 패턴을 쓰면 작업을 요청하는 쪽과 그 작업을 처리하는 쪽을 분리할 수 있어요. 커맨드 객체를 추가해서 커맨드 객체는 틍정 작업 요청을 캡슐화해줍니다. 설명이 어려우니 일단 코드부터 봐볼까요? //커맨드 인터페이스 public interface Command { void execute(); } //조명을 켤 때 필요한 커맨드 클래스 public class LightOnCommand implements Command { Light light; public void lightOnCommand(Light light) { this.light = light; } @Override public void execute() { light.on(); } } //인보커(Invoker) public class Simp.. 2023. 9. 27.