본문 바로가기

JAVA/Design Patterns

(23)
7.어댑터 패턴 / 퍼사드 패턴 어댑터 패턴 데코레이터 패턴은 객체를 래퍼로 감싸서 새로운 역할을 부여함다른 목적으로 객체를 감싼다.실제와 다른 인터페이스를 가진 것처럼 기존시스템에서 새로운 업체에서 제공한 클래스 라이브러리를 사용해야한다고 하면, 사용하는 인터페이스가 기존 업체에서 사용하던 인터페이스가 다르다.기존코드를 바꿔서 해결할 수 없는 상황일경우, 업체에서 공급받은 클래스도 변경할 수 없다면?새로 사용하기로 한 업체에서 사용하는 인터페이스를 기존에 사용하던 인터페이스에 적응시켜주는 클래스를 만들 수 있다.어댑터는 클라이언트로부터 요청을 받아서 새로운 업체에서 제공하는 클래스에서 받아들일 수 있는 형태의 요청으로 변환시켜주는 중개인 역할을 한다. 예) package patterns.adaptor; public interface ..
6.커맨드 패턴 커맨드 패턴=>호출캡슐화 메서드 호출을 캡슐화하면 계산 과정의 각 부분들을 결정화시킬수 있기 때문에, 계산하는 코드를 호출한 객체에서는 어떤 식으로 일을 처리해야하는지에 대해 전혀 신경쓰지 않아도 된다. 정의 - 요구사항을 객체로 캡슐화할 수 있으며, 매개변수를 써서 여러가지 다른 요구사항을 집어넣을 수 있다.요청 내역을 큐에 저장하거나 로그를 기록할 수 있으며 작업취소 기능도 지원 가능하다. 커맨드 객체는 일련의 행동을 특정 리시버하고 연결시킴으로써 요구 사항을 캡슐화한 것.이렇게 하기 위해 행동과 리시버를 한 객체에 집어넣고 execute() 라는 메서드 하나만 외부에 공개하는 방법을 쓴다.이 메서드 호출에 의해 리시버는 일련의 작업이 처리된다.외부에서 볼땐 어떤 객체가 리시버 역할을 하는지, 그 리..
5. 싱글톤 패턴 싱글턴 패턴정의 - 해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴 용도- 스레드 풀, 캐시, 대화상자, 사용자 설정, 레지스트리 설정를 처리하는 객체, 로그 객체, 디바이스 드라이버 등 인스턴스가 2개 이상만들게 되면 프로그램이 이상하게 작동하거나, 자원을 불필요하게 잡아먹거나, 결과에 일관성이 없어지는 심각한 문제가 생길수 있음 고전적인 싱글턴 패턴 public class Singleton { private static Singleton uniqueInstance; //유일한 인스턴스를 저장하기 위한 정적 변수 private Singleton () { } //private으로 선언하여 외부에서 객체생성 못함 Singleton에서만 클래스의 인스턴..
4. 팩토리 메서드 패턴 / 추상 팩토리 패턴 팩토리메서드정의- 객체 생성을 처리하며, 팩토리 메서드를 이용하면 객체를 생성하는 작업을 서브클래스에 캡슐화시킬수 있다.수퍼클래스에 있는 클라이언트 코드와 서브클래스에 있는 객체 생성 코드를 분리시킬수 있다. 팩토리 메서드 선언abstract Product factoryMethod(String type) abstract- 팩토리 메서드는 추상 메서드로 선언하여 서브 클래스에서 객체 생성을 책임지도록 Product- 팩토리 메서드에서 특정제품(객체)를 리턴하며, 그 객체를 보통 수퍼클래스에서 정의한 메서드 내에서 쓰임 factoryMethod- 팩토리 메서드는 클라이언트(수퍼클래스에 있는 orderPizza() 같은 코드)에서 실제로 생성되는 구상 객체가 무엇인지 알수 없게 만드는 역할 String typ..
2.옵저버 패턴 옵저버 패턴정의 - 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 정의한다. 핵심정리- 옵저버 패턴에서는 객체들 사이에 일대다 관계를 정의한다.- Subject 또는 Observable 객체는 동일한 인터페이스를 써서 Observer에게 연락을 한다.- Observable에서는 옵저버들이 Observer 인터페이스를 구현한다는 것을 제외하면 옵저버에 대해 전혀 모르기 때문에 이들 사이의 결합은 느슨한 결합이다.- 옵저버 패턴을 이용하면 주제 객체에서 데이터를 보내거나(푸쉬 방식) 옵저버가 데이터를 가져오는(풀 방식)을 쓸 수 있다.- 옵저버들한테 연락을 돌리는 순서에 절대로 의존하면 안된다.- 자바에서는 범용으로 쓸수 있는 ja..
디자인의 원칙 디자인의 원칙 - 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리 시킨다.(바뀌는 부분은 캡슐화한다)=> 바뀌는 부분은 따로 뽑아서 캡슐화시킨다. 그렇게 하면 나중에 바뀌지 않는 부분에는 영향을 미치지 않는 채로 그 부분만 고치거나 확장할 수 있다. - 구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.(상위형식에 맞춰서 프로그래밍한다) => 변수를 선얼할때는 보통 추상클래스나 인터페이스 같은 상위 형식으로 선언한다.객체를 변수에 대입할 때 상위 형식을 구체적으로 구현한 형식이라면 어떤 객체든 집어넣을 수 있기 때문이다. 변수를 선언하는 클래스에서 실제 객체의 형식을 몰라도 된다. 구현에 맞췄을경우Dog d = new Dog();d.bark(); 상위형식 맞췄을 경우Animal a..
데코레이터 패턴 데코리이터 패턴객체에 추가 요소를 동적으로 더할수 있다.데이코레이터를 사용하면 서브 클래스를 만드는 경우에 비해 훨씬 유연하게 기능을 확장할 수 있다.상속은 기능을 확장하는 방법을 제공한다. 핵심정리- 상속을 통해 확장을 할 수도 있지만 디자인의 유연성 면에서 보면 별로 좋지 않다.- 기존 코드를 수정하지 않고도 행동을 확장하는 방법이 필요하다.- 구성과 위임을 통해서 실행중에 새로운 행동을 추가할 수 있다.- 상속 대신 데코레이터 패턴을 통해 행동을 확장할 수 있다.- 데코레이터 패턴에서는 구상 구성요소를 감싸주는 데코레이터들을 사용한다.- 데코레이터 클래스의 형식은 그 클래스가 감싸고 있는 클래스의 형식을 반영한다.(상속 또는 인터페이스 구현을 통해서 자신을 감쌀 클래스와 같은 형식을 가지게 된다)-..
상태패턴 상태 패턴 예)단일 상품을 판매하는 자판기에 들어갈 소프트웨어를 개발 요청 동전을 넣음 -> 동전없으면 -> 금액을 증가 -> 제품선택가능동전을 넣음 -> 제품선택 가능이면 -> 금액을 증가 -> 제품선택 가능제품선택 -> 동전없으면 -> 아무동작하지 않음 -> 동전없음 유지제품선택 -> 제품선택가능이면 -> 제품주고 잔액감소 -> 잔액있으면 제품선택가능 잔액없으면 동전없음 public class VendingMachine {public static enum State { NOCOIN, SELECTABLE }private State state = State.NOCOIN;public void insertCoin(int coin) {switch(state) {case NOCOIN :increaseCoin(c..