JAVA 20

[디자인패턴] Visitor 패턴

Visitor 패턴 데이터구조를 돌아다니면서 처리한다. 데이터의 구조와 처리를 분리한다. 데이터 구조를 돌아다니는 '방문자'를 정의해서, 이 방문자가 '처리'를 담당하도록 한다. 데이터 구조는, 문을 두드리는 '방문자'를 받아들이기만 하면 된다. FileTreatmentException 예외처리 File 엔트리에 무언가를 추가(add)하고자 할 때 발생되는 예외 더블 디스패치 (Double Dispatch) Visitor와 Acceptor는 서로 대응관계에 있으며, 서로가 서로를 호출한다. ConcreteVisitor 역할의 추가는 간단하다. 구체적인 처리는 ConcreteVisitor 역할에 맡길 수 있고, 그 처리를 위한 ConcreteElement 역할을 수정할 필요는 전혀 없기 때문이다. Conc..

JAVA 2022.06.16

[디자인패턴] Command 패턴

Command 패턴 - 명령을 클래스로 표현하기 - 실행하고자 하는 일이 생겼을 때에는, 일반적으로 메소드를 호출하는 방식이 아닌 명령을 나타내는 클래스의 인스턴스를 생성한다. 장점 - history를 관리하고 싶을 때, Command 클래스의 인스턴스의 집합을 살펴보면 된다. - 명령의 집합을 보관해두면, 똑같은 명령을 재사용할 수도 있고 기존의 명령을 활용해 새로운 명령을 생성시킬 수도 있다. Adapter의 사용 필요없는 메소드도 빈칸으로 모두 구현해줘야하는 인터페이스의 하위 클래스 대신에, 필요한 메소드만 구현해주어도 되는 Adapter를 활용한다. (원하는 메소드만 Override(재정의)하는 방식) 연습문제 22-1) 예제 프로그램에 '그림그리기 색을 설정'하는 기능을 추가하십시오. 이것은 마..

JAVA 2022.06.16

[디자인패턴] Proxy 패턴

Proxy 패턴 - 대리인 - 본인을 대신해서 일을 처리하는 사람.. 예제 프로그램을 보니 간단하다. Proxy(대리인 역할)이 할 수 있는 역할은 다 하고, 대리인이 하기 어려운 무거운 일을 호출할 때까지는 최대한 지연시키는 방식인 듯 Proxy와 Real Subject를 분리하는 이유? 디자인패턴의 이유는 다 똑같다. 추후 수정 및 유지보수를 수월하게 하기 위해서.. 연습문제 21-1) 예제 프로그램에서 PrinterProxy 클래스는 Printer 클래스를 알고있습니다. 즉, PrinterProxy 클래스 안에 Printer라는 클래스 이름이 직접 쓰여 있습니다. PrinterProxy 클래스가 Printer 클래스를 '몰라도 상관없도록' 수정하십시오. Printable 인터페이스로 인스턴스를 아래..

JAVA 2022.06.02

[디자인패턴] State 패턴

State 패턴 '상태'를 클래스로 표현한 패턴이다. 클래스를 교체함으로써 '상태의 변화'를 나타내고, 따라서 새로운 상태를 추가해야할 때 어떻게 추가하면 되는 지가 명확해진다. 예제 프로그램) 경비 시스템 State패턴을 사용하지 않는 패턴과 State패턴의 수도코드를 보여주는데, 내가 평소에 전자로 짜는 편이라 많이 찔린다.. 연습문제 19-1) Context를 인터페이스가 아닌 추상 클래스로 표현하고 state 필드를 Context 클래스로 표현하는 편이 패턴의 취지에 맞을텐데, 예제 프로그램에서는 Context의 역할을 Context 인터페이스로 구현하고 state 필드는 SafeFrame 클래스에서 표현하고 있습니다. 그 이유는 무엇입니까? 자바는 다중상속이 불가능하다. 만약 Context 역할..

JAVA 2022.05.25

[디자인 패턴] Observer 패턴 (관찰자)

Observer 패턴 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 주로 분산 이벤트 핸들링 시스템을 구현하는 데 사용된다. + 발행/구독 모델이라고도 칭한다. 신기한 점 1. 사실 관찰하는 것이 아니라, 상태변화를 '통지받는다'. 신기한 점 2. 교환 가능성이 있다. 더보기 RandomNumberGenerator 클래스는, 현재 자신을 관찰하고 있는 것이 DigitObserver의 인스턴스인지 GraphObserver의 인스턴스인지 모른다. 다만, 이들이 Observer 인터페이스를 구현하고 있다는 것만 안다. 한편, DigitObserver 클래스는, 자신이 관..

JAVA 2022.05.18

[디자인패턴] façade 패턴

Facade 패턴 교수님이 이걸 페싸-드 라고 읽어야한대서 너무 웃겼다. 페케이드라고 하면 절대 안된단다. 페싸-드를 무한반복하시는.. 웃참 강의 페싸-드 패턴을 아주 잘 설명해주는 그림이다. = 복잡한 내부는 숨기고, 높은 레벨의 API를 외부에 제공한다. 예제) Facade 패턴을 활용해 제공받은 이메일로 웹페이지를 만드는 간단한 프로그램이다. 소스파일 디렉터리 구조는 이러하다. 다이어그램) PageMaker 클래스가 Facade역할을 한다. 알아둘 점) Facade 패턴 또한 재귀적인 구조가 가능하다. 하나의 창구는 또 다른 하나의 서브시스템이 될 수 있다는 말이다. 연습문제 15-1) 클래스 설계자는 미래의 확장이나 프로그램의 개선에 대비해서 PageMaker 클래스만을 pagemaker 패키지의..

JAVA 2022.05.12

[디자인패턴] Decorator 패턴

Decorator 패턴? 중심이 되는 객체에, 장식과 같은 부가적인 기능을 하나씩 입혀서 목적에 어울리는 객체로 만들고자 생겨난 패턴이다. Decorator 패턴의 객체들은 장식을 할 수 있는 동시에, 장식이 될 수 있는 가능성이 있다. (장식자이면서, 장식의 대상이 된다.) 언뜻 보면 Composite패턴과 비슷할 정도로 재귀적인 구조를 가진다. 그러나 객체가 다른 객체에 포함될 수 있는 Composite 패턴과 달리, Decorator 패턴은 객체는 다른 객체에 의해 덧붙여진다는, 즉 기능추가가 된다는 점에서 다르다. 다이어그램 Decorator 패턴의 핵심 클래스 : Border.class public abstract class Border extends Display { protected Disp..

JAVA 2022.04.28

[디자인패턴] Composite 패턴

컴포지트 패턴(Composite pattern)이란? 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴 이런식으로 재귀적 호출이 일어나는 편이다. 예를 들어 만약 전체 파일 size를 알고 싶다면, Leaf 노드에 있는 getSize함수를 계속해서 호출해 전체 값을 알 수 있다. 이런 식으로 자기 자신이 계속 호출되는 원리이다. 이 패턴을 쓸 때 노드의 개념을 사용한다는 것이 인상깊었다. 예제 soure file >> 연습문제 11-1) 파일 시스템 이외에 Composite 패턴이 적용되는 예를 생각해보십시오. - HTML의 리스트(ul, ol, dl) 과 테이블 등 - Swing 11-2) 예제 프로그램에 Entry의 (하위 클래스의) 인스턴스에서 '풀 패스'를 얻는 기능을 추가하려..

JAVA 2022.04.12

[디자인패턴] 전략 패턴(Strategy Pattern)

전략 패턴(Strategy Pattern) - 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 방법 - 알고리즘을 구현한 부분이 모두 교환 가능하도록 함 - 알고리즘(전략, 작전, 책략)을 교체해서 동일한 문제를 다른 방법으로 해결하는 패턴 예제 프로그램 컴퓨터에서 '가위 바위 보'를 실행하는 프로그램. 두가지 전략을 쓴다. 전략1) Winning strategy : 이기면 다음에도 같은 손을 내린다. 전략2) Prob Strategy : 직전에 냈던 손에서 다음 낼 손을 확률적으로 계산한다. 다이어그램) Source Code) Hand.class 더보기 public class Hand { public static final int HANDVALUE_GUU = 0; // 바..

JAVA 2022.04.07

[디자인패턴] Prototype - 복사해서 인스턴스 만들기

6-1) 예제 프로그램에서는 MessageBox 클래스와 UnderlinePen 클래스에 같은 동작을 하는 createClone 메소드가 정의되어 있습니다. 같은 동작을 하는 메소드가 하나의 프로그램에 복수로 정의되어 있는 것은 관리상 권장할 만한 것이 아니므로 이 메소드를 공유하고 싶다고 합시다. 어떻게 하면 될까요? 크게 두가지 방법이 있다. 1. Template Method 패턴 Product 인터페이스를 Product 클래스로 해서, createClone 메소드를 Product 클래스 내부에서 구현한다. 2. UnderlinePen 클래스와 MessageBox 클래스 공통의 상위 클래스로 ConcreteProduct 클래스를 정의 -> ConcreteProduct 클래스는 Product 인터페이스..

JAVA 2022.03.31