Head First 디자인 모드 - 명령 모드

명령 모드 정의: 다른 요청, 대기 열 또는 로 그 를 사용 하여 다른 대상 을 매개 변수 화 할 수 있 도록 '요청' 을 대상 으로 봉 합 니 다.명령 모드 에서 도 취소 가능 한 동작 을 지원 합 니 다.
정 의 를 처음 봤 을 때 추상 적 이 었 다. '요청' 이 무엇 인지.
"하나의 기술 은 종종 하나의 문제 의 출현 과 함께 나타난다." 우 리 는 왜 이 모델 이 나 타 났 는 지 생각해 야 한다.이 모델 은 도대체 어떤 좋 은 점 이 있 습 니까?
책 에서 먼저 제기 한 수 요 는 "회 사 는 가전제품 자동화 리모컨 의 API 를 설계 하려 고 한다. 회 사 는 일부 업 체 (예 를 들 어 전등, 텔레비전) 가 있 고 리모컨 도 하나 있다. 리모컨 은 7 개의 프로 그래 밍 가능 한 슬롯 (각 슬롯 마다 다른 전기 장 치 를 지정 할 수 있다) 이 있 고 모든 슬롯 에 해당 하 는 스위치 버튼 이 있 으 며 취소 버튼 도 있다."
수 요 를 받 았 을 때 제조 업 체 클래스 가 7 개 라면 좋 겠 습 니 다. 저 는 직접 명령 을 버튼 에 기록 하 겠 습 니 다.그러나 제조 업 체 류 는 7 개 뿐만 아니 라 10 여 개, 심지어 백 개 에 달 할 수 있다.리모컨 을 몇 개 썼 다 면 스마트 리모컨 이 라 고 할 수 있 을 까?그래서 이렇게 디자인 하면 안 돼 요.게다가 대상 을 향 한 사상 도 이렇게 하 는 것 을 제창 하지 않 는 다.그럼 어 떡 하지?
책 에서 식당 으로 명령 모드 를 끌 어 내 고 식당 에서
고객 은 주문 서 를 작성 하여 종업원 에 게 건 네 주 었 다.
종업원 은 주문 서 를 요리사 에 게 건 네 주 었 다.
주방장 이 주문 서 를 보고 정식 을 차 렸 다.
이 가운데 종업원 은 고객 이 무엇 을 원 하 는 지 알 고 주문 을 통 해 요리사 에 게 무엇 을 하 는 지 알려 주 었 다.종업원 은 요리사 가 어떻게 하 든 요리사 가 음식 을 만 들 줄 만 알 았 다.
우 리 는 이렇게 생각 할 수 있다. 종업원 은 요리사 가 음식 을 할 줄 안다 (종업원 이 주문 서 를 들 고 요리사 에 게 알 린 다). 종업원 은 "주문 이 왔 다" (종업원 이 orderUp () 을 호출 했다) 고 소 리 쳤 고 요리 사 는 소 리 를 듣 고 주문 서 를 보고 음식 을 준비 했다 (받 은 명령 에 따라 준비 했다).어떤 종업원 이 든 어떤 요리사 든 종업원 이 주문 서 를 요리사 에 게 준 후에 요리사 도 무엇 을 하 는 지 알 게 되 었 다. 요리 사 는 누가 주문 하 든 누가 보 냈 든 간 에.이렇게 주문 하면 고객 과 요리사 가 격 리 된다.
여기 서 우 리 는 고객 을 '요청 을 보 내 는 대상' 으로 생각 하고 요리 사 를 '요청 을 받 고 집행 하 는 대상' 으로 생각 하 며 주문 은 '요청 을 포함 하 는 대상' 이 아니다.
우리 의 요구 로 돌아 가면, 이때 우 리 는 제조 업 체 류 (등, 텔레비전) 를 요리사 (요청 을 받 고 실행 하 는 대상) 로 삼 을 수 있 는 지, 리모컨 을 주문 (요청 을 포함 하 는 대상) 으로 삼 을 수 있 는 지, 이곳 의 '요청' 은 바로 우리 의 명령 이다.
여기 서 명령 모드 가 나 타 났 습 니 다. 우 리 는 등 을 제어 하려 면 제어등 의 명령 을 써 야 합 니 다.텔레비전 을 제어 하려 면 텔레비전 을 제어 하 라 는 명령 을 써 야 한다.그래서 명령 에는 '수신 및 실행 요청 대상' 이 포함 되 어 있 습 니 다.그런 후에 우 리 는 많은 명령 을 써 야 하지만, 우리 의 리모컨 에는 모든 명령 이 포함 되 어 있 을 수 없다.그래서 여기 서 우 리 는 명령 인 터 페 이 스 를 만 들 려 고 합 니 다. 이 인터페이스 에서 실행 하 는 방법 (execute () 이 있 습 니 다. 모든 명령 은 이 인 터 페 이 스 를 실현 한 다음 에 실행 방법 에서 '수신 자' 가 해 야 할 동작 을 완성 해 야 합 니 다.
관련 코드 는 다음 과 같 습 니 다: 등 류 (제조 업 체 클래스)
public class Light {

    public void off() {
        System.out.println("Light is off!");
    }

    public void on() {
        System.out.println("Light is on!");
    }

}

명령 인터페이스
/**
*    
**/
public interface Command{
    public void execute();
}

명령 인터페이스의 제어등 명령 을 실현 하 다
/**
*      (  )
**/
public class LightOnCommand implements Command{
    //          
    Light light;
    public LightOnCommand(Light light){
        this.light=light;
    }

    //      execute()  
    public void execute(){
        //  
        light.on();
    }
}

제어 장치 (리모컨)
public class SimpleRemoteControl{
    //    
    Command command;
    public SimpleRemoteControl(){}

    //      
    public void setCommand(Command command){
        this.command=command;
    }

    //    ,         
    public void buttonWasPressed(){
        //         
        this.command.execute();
    }
}

테스트 고객
public class RemoteControlTest{
    public static void main(String[] agrs){
        //    (   )
        Light light = new Light();
        //        (        )
        LightOnCommand lightOnCommand = new LightOnCommand (light);
        //       (   )
        SimpleRemoteControl simpleRemoteControl = new SimpleRemoteControl();

        //           
        simpleRemoteControl.setCommand(lightOnCommand );
        //    (  )
        simpleRemoteControl.buttonWasPressed();
    }
}

출력 결과: Light is on!
이로써 명령 모드 는 이미 원형 을 실현 했다.리모컨 은 7 개의 장치 만 제어 할 수 있 고 명령 모드 로 우 리 는 리모컨 을 바 꾸 지 않 아 도 편리 하 게 장 치 를 바 꿀 수 있다.
이 는 확장 개방, 수정 폐쇄 라 는 디자인 원칙 에 따 른 것 이다.인터페이스 프로 그래 밍 에 대해 프로 그래 밍 을 실현 하지 마 세 요.

좋은 웹페이지 즐겨찾기