외관 모드 [C \ #]

예제 코드 는 디자인 모델 의 특징 을 최대한 돋 보이 게 하기 위해 미니 코드 를 사용 했다.다른 코드 가 디자인 모델 을 이해 하 는 데 방해 가 되 지 않도록 하 세 요.
정의.
서브 시스템 의 인터페이스 에 일치 하 는 인 터 페 이 스 를 제공 합 니 다. 외관 모델 은 고 층 인 터 페 이 스 를 정의 합 니 다. 이 인 터 페 이 스 는 이 서브 시스템 을 더욱 쉽게 사용 할 수 있 습 니 다.
한 마디 로 하면 외관 모델 은 클 라 이언 트 로 하여 금 각 서브 시스템 간 의 상호작용 논리 에 관심 을 가지 지 않 고 '외관 역할' 을 맡 는 인터페이스 가 어느 것 인지 만 알 면 된다.
구조 지도 (류 웨 이 선생님 의 블 로그)
코드
장면 1
어느 토요일 정오 가 다가 오자 샤 오 밍 은 배가 고 팠 다!그 는 배 를 채 우기 위해 침대 에서 일어나 밥 을 준비 할 수 밖 에 없 었 다.이것 은 결코 쉬 운 일이 아니 라 는 것 을 알 아야 한다!어쨌든 스스로 밥 을 하려 면 먼저 채소 시장 에 가서 채 소 를 사고 채 소 를 씻 은 후에 야 요 리 를 할 수 있다.적어도 한 시간 은 고생 해 야 밥 을 먹 을 수 있다!비록 매우 내 키 지 않 지만, 다른 선택의 여지 가 없다!
class BuyVegetables
{
    /// 
    ///   
    /// 
    public static void Buy()
    {
        Console.WriteLine("     。");
    }
}
class Cleanout
{
    /// 
    ///   
    /// 
    public static void Clean()
    {
        Console.WriteLine("        。");
    }
}
class Cooking
{
    /// 
    ///   
    /// 
    public static void Cook()
    {
        Console.WriteLine("     。");
    }
}

바 쁠 일이 다 끝 났 으 니 밥 을 먹 어도 된다!
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("    ···");
        BuyVegetables.Buy();
        Cleanout.Clean();
        Cooking.Cook();
        Console.WriteLine("    。");
    }
}

이 식 사 는 정말 샤 오 밍 을 비참 하 게 만 들 었 다!!!
장면 2
일주일 이 지 났 어 요.
또 토요일, 또 점심 시간 이 다가 오자 샤 오 밍 은 또 배가 고 팠 습 니 다..............................................................................
하지만 배달 을 주문 하려 면 식당 연락처 가 먼저 있어 야 한다.이것 은 사실 외관 자의 논리 적 입구 가 되 었 다.
class Restaurant
{
    /// 
    ///     
    /// 
    public static void Order()
    {
        Console.WriteLine("     ,    ···");
        BuyVegetables.Buy();
        Cleanout.Clean();
        Cooking.Cook();
        Console.WriteLine("   ,     ···");
    }
}

식당 의 연락처 가 생기 면 간단 해진 다.
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("    ,     ···");
        Restaurant.Order();
        Console.WriteLine("    ,  !");
        Console.WriteLine("    ,        ···");
    }
}

이번 엔 편 해.
총결산
장면 1 에서 고객 (샤 오 밍) 과 밥 을 먹 는 이 일의 상호작용 이 상당히 번 거 로 워 서 전체 절 차 를 그 가 스스로 하려 면 많은 신경 을 써 야 한다!실제 작업 에서 이런 장면 은 매우 흔히 볼 수 있다. 매번 서브 시스템 의 논 리 를 클 라 이언 트 에 결합 하면 클 라 이언 트 는 상당히 비대 하고 불안정 해 질 것 이다.이때 중간 부품 (외관 자), 즉 장면 2 의 '식당' 을 제공 합 니 다. 그러면 샤 오 밍 은 전화 한 통, 장 보기, 채 소 를 씻 기, 요 리 를 하 는 일 을 모두 누군가가 해결 해 주 었 습 니 다.실제 업무 에서 도 하나의 외관 자 를 제공 하여 각 서브 시스템 (또는 서브 기능) 과 의 상호작용 을 책임 질 수 있다.이 외관 자 는 클 라 이언 트 에 게 입구 방법 을 제공 합 니 다. 클 라 이언 트 는 이 입구 방법 만 호출 하면 하고 싶 은 모든 일 을 처리 할 수 있 습 니 다. 그러면 클 라 이언 트 의 복잡 도 를 줄 일 수 있 습 니 다.
보충 토론
어느 날 샤 오 밍 이 라면 라면 을 대충 시 켰 을 뿐 이 라면 식당 은 채 소 를 씻 지 않 고 국 수 를 사서 샤 오 밍 에 게 보 내 면 된다.그럼 어 떡 하지?외관 자의 코드 를 바 꾸 고 안에 있 는 Cleanout.Clean(); 코드 를 지 워 야 합 니까?이것 이 어찌 개폐 원칙 을 위반 한 것 이 아니 겠 는가?예, 이렇게 처리 하면 반드시 개폐 원칙 을 위반 할 것 입 니 다!
어 떡 하지?이때 외관 자 캐릭터 를 추상 화 할 수 있다!
interface IRestaurant
{
    /// 
    ///     
    /// 
    void Order();
}

그리고 구체 적 인 외관 자 - 국수집 을 실현 합 니 다.
class NoodleRestaurant : IRestaurant
{
    public void Order()
    {
        Console.WriteLine("     ,    ···");
        BuyVegetables.Buy();
        Cooking.Cook();
        Console.WriteLine("   ,     ···");
    }
}

이렇게 해서 샤 오 밍 은 면 을 먹고 싶 을 때 new NoodleRestaurant().Order() 를 사용 하면 성공 적 으로 주문 할 수 있다!
이상

좋은 웹페이지 즐겨찾기