극적 비포◯ 애프터로 배우는 디자인 패턴~facade pattern~



카레를 만드는 클래스를 생각한다.



양파,

감자를 벗고 자르고,

카레루를 빗질.

그런 요리를 실현하는 클래스 군을 만들어 생각해 보겠습니다.

before



우선 facade pattern을 사용하지 않고 써 보겠습니다.

소스 코드



class Onion {
    cut() {
        console.log('玉ねぎが刻まれました');
    }
}
class Potato {
    peel() {
        console.log('じゃがいもの皮をむきました');
    }
    cut() {
        console.log('じゃがいものをきりました');        
    }
}
class CurryBase {
    dissolve() {
        console.log('ルーを溶かしました');
    }
}

class Main {
    static cookingStart() {

        /** 玉ねぎ2個を刻む */
        const onion1 = new Onion();
        onion1.cut();
        const onion2 = new Onion();
        onion2.cut();

        /** じゃがいも2個を剥いて切る */
        const potato1 = new Potato();
        potato1.peel();
        potato1.cut();
        const potato2 = new Potato();
        potato2.peel();
        potato2.cut();

        /** カレーのルーを溶かす */
        const curryBase = new CurryBase();
        curryBase.dissolve();
    }
}
Main.cookingStart();

클래스 다이어그램





이것을 보면,

사용하는 쪽의 클래스 (Main 클래스)

사용되는 쪽의 클래스를 3개나 알고 있습니다.

사용하는 쪽과 사용되는 측의 의존성이 높다고 할 수 있습니다.

이 경우, 사용되는 측의 클래스의 메소드명 등을 수정했을 때,

사용하는 쪽의 클래스도 수정하지 않으면 안됩니다.

after



이번에는 facade pattern을 사용하여 써 보겠습니다.

소스 코드


class Onion {
    cut() {
        console.log('玉ねぎが刻まれました');
    }
}
class Potato {
    peel() {
        console.log('じゃがいもの皮をむきました');
    }
    cut() {
        console.log('じゃがいものをきりました');        
    }
}
class CurryBase {
    dissolve() {
        console.log('ルーを溶かしました');
    }
}

class Chef {
    cook() {

        /** 玉ねぎ2個を刻む */
        const onion1 = new Onion();
        onion1.cut();
        const onion2 = new Onion();
        onion2.cut();

        /** じゃがいも2個を剥いて切る */
        const potato1 = new Potato();
        potato1.peel();
        potato1.cut();
        const potato2 = new Potato();
        potato2.peel();
        potato2.cut();

        /** カレーのルーを溶かす */
        const curryBase = new CurryBase();
        curryBase.dissolve();        
    }
}

class Main {
    static cookingStart() {
        const chef = new Chef();
        chef.cook();
    }
}

Main.cookingStart();

클래스 다이어그램





뭐야?

이전에 Main 클래스는 3개의 클래스를 알 필요가 있었지만,

지금은 하나(Chef 클래스)만 알고 있으면 OK가 되었습니다.

장인(facade) 덕분에 상당히 느슨하게 결합된 설계가 되었습니다.

Potato나 CurryBase등의 클래스의 메소드명등을 수정해도,

사용하는 측의 클래스 (Main)는 수정할 필요가 없습니다.

훌륭합니다.

요약



facade pattern은

사용하는 쪽과 사용되는 쪽을 느슨하게 결합

디자인 패턴이었습니다.

그렇게함으로써,

클래스 수정의 영향을 사용하는 쪽이 좋지 않기 때문에,

수정에 강해집니다.

좋은 웹페이지 즐겨찾기