C\#디자인 모드 프로 그래 밍 에서 외관 모드 Facade Pattern 의 응용 분석

8683 단어 C#디자인 모드
인 스 턴 스 도입
홈 극장 에는 조명,스크린,프로젝터,플레이어,DVD 플레이어 등 몇 가지 기본 적 인 도구 가 있 습 니 다.
4.567917.조명 은 조명 을 끄 고 조명 을 켤 수 있 습 니 다4.567917.프로젝터,프로젝터 를 켜 고 닫 을 수 있 습 니 다4.567917.화면 을 열 고 닫 을 수 있 습 니 다4.567917.공 방 기 는 볼 륨 을 끄 고 볼 륨 을 켤 수 있 습 니 다4.567917.DVD 재생 기 는 재생 기 를 켜 고 재생 기 를 닫 을 수 있 습 니 다가장 일반적인 방식 으로 영 화 를 보 는 것 을 실현 한다.유형 도 는 다음 과 같다.
201621994222971.jpg (640×309)
아 날로 그 에 따 르 면 영 화 를 보 려 면 클 라 이언 트 에서 다음 과 같은 조작 을 해 야 한다.먼저 프로젝터 를 켜 고 공 방 기 를 켜 고 화면 을 켜 고 DVD 플레이 어 를 켜 고 조명 을 켜 야 한다.이렇게 많은 조작 을 한 후에 야 영 화 를 볼 수 있다.영 화 를 닫 을 때 도 프로젝터 를 끄 고 공 방 기 를 끄 고 화면 을 끄 고 DVD 플레이 어 를 끄 고 조명 을 꺼 야 한다.오,이 건 너무 복잡 해!!!클 라 이언 트 에 그렇게 많은 조작 이 있 습 니 다.만약 에 일부 사용자 가 그 중의 도 구 를 어떻게 사용 하 는 지 모 르 면 그 는 영 화 를 볼 수 없습니다!
위 에서 사실은 현재 소프트웨어 개발 시스템 에서 흔히 볼 수 있 는 현상 을 나타 낸다.클 라 이언 트 프로그램 은 복잡 한 시스템 의 내부 서브 시스템 과 직접적인 관 계 를 가지 기 때문에 클 라 이언 트 프로그램 은 서브 시스템 의 변화 에 따라 변화 한다.위의 이 문 제 를 해결 하려 면 반드시 고객 프로그램 과 서브 시스템 간 의 상호작용 인 터 페 이 스 를 간소화 하고 고객 프로그램 과 서브 시스템 간 의 결합 을 해제 해 야 하 며 외관 모델 은 이 문 제 를 해결 할 수 있다.
외관 모드(Facade)의 정의:서브 시스템 의 인터페이스 에 일치 하 는 인 터 페 이 스 를 제공 하여 서브 시스템 의 인 터 페 이 스 를 방문 합 니 다.
이 모드 는 고 층 인 터 페 이 스 를 정의 합 니 다.이 인 터 페 이 스 는 이 서브 시스템 을 더욱 쉽게 사용 할 수 있 습 니 다.쉽게 말 하면 외관 모델 은 하나 이상 의 복잡 한 조작 을 숨 기 고 클 라 이언 트 가 사용 할 수 있 도록 일치 하 는 인터페이스 만 표시 하 는 것 이다.주의해 야 할 것 은 외관 모델 은 단지 당신 에 게 더욱 직접적 이 고 쉬 운 조작 방식 을 제공 하 는 것 일 뿐 원래 의 서브 시스템 을 격 리 시 키 지 않 았 기 때문에 만약 에 서브 시스템 류 의 더 높 은 기능 이 필요 하 다 면 원래 의 서브 시스템 을 사용 할 수 있 는 것 이 외관 모델 의 큰 장점 이다.외관 모드 를 통 해 서브 시스템 의 여러 인터페이스 에 고 층 인 터 페 이 스 를 구축 하고 이 고 층 인 터 페 이 스 를 클 라 이언 트 에 게 제공 하면 클 라 이언 트 와 복잡 한 서브 시스템 간 의 결합 을 해제 할 수 있다.
201621994349141.jpg (685×401)
위의 그림 을 통 해 알 수 있 듯 이 외관 모델 은 간단 한 인터페이스(OpenMovie 와 CloseMovie)를 클 라 이언 트 에 제공 하고 클 라 이언 트 와 서브 시스템 간 에 디 결합 을 실현 했다.다음은 코드 를 통 해 위의 이 데 모 를 실현 합 니 다.
201621994410364.jpg (738×423)
재생 도구 의 코드:

using System;
namespace Facade 
{ 
  /// <summary> 
  ///     
  /// </summary> 
  public class Projector 
  { 
    public void OpenProjector() 
    { 
      Console.WriteLine("     "); 
    }
    public void CloseProjector() 
    { 
      Console.WriteLine("     "); 
    }
    public void SetWideScreen() 
    { 
      Console.WriteLine("          "); 
    }
    public void SetStandardScreen() 
    { 
      Console.WriteLine("          "); 
    } 
  } 
}
     
     
using System;
namespace Facade 
{ 
  /// <summary> 
  ///     
  /// </summary> 
  public class Amplifier 
  { 
    public void OpenAmplifier() 
    { 
      Console.WriteLine("     "); 
    }
    public void CloseAmplifier() 
    { 
      Console.WriteLine("     "); 
    } 
  } 
}
       
        
using System;
namespace Facade 
{ 
  /// <summary> 
  ///    
  /// </summary> 
  public class Screen 
  { 
    public void OpenScreen() 
    { 
      Console.WriteLine("    "); 
    }
    public void CloseScreen() 
    { 
      Console.WriteLine("    "); 
    } 
  } 
}
        
        
using System;
namespace Facade 
{ 
  /// <summary> 
  /// DVD    
  /// </summary> 
  public class DVDPlayer 
  { 
    public void OpenDVDPlayer() 
    { 
      Console.WriteLine("   DVD    "); 
    }
    public void CloseDVDPlayer() 
    { 
      Console.WriteLine("   DVD    "); 
    } 
  } 
}
        
       
using System;
namespace Facade 
{ 
  /// <summary> 
  ///    
  /// </summary> 
  public class Light 
  { 
    public void OpenLight() 
    { 
      Console.WriteLine("    "); 
    }
    public void CloseLight() 
    { 
      Console.WriteLine("    "); 
    } 
  } 
}
외관 클래스 의 코드:

namespace Facade 
{ 
  /// <summary> 
  ///        
  /// </summary> 
  public class MovieFacade 
  { 
    /// <summary> 
    ///                    
    /// </summary> 
    private Projector projector; 
    private Amplifier amplifier; 
    private Screen screen; 
    private DVDPlayer dvdPlayer; 
    private Light light;
    public MovieFacade() 
    { 
      projector = new Projector(); 
      amplifier = new Amplifier(); 
      screen = new Screen(); 
      dvdPlayer = new DVDPlayer(); 
      light = new Light(); 
    }
    /// <summary> 
    ///      
    /// </summary> 
    public void OpenMovie() 
    { 
      //       
      projector.OpenProjector(); 
      //      
      amplifier.OpenAmplifier(); 
      //      
      screen.OpenScreen(); 
      //    DVD 
      dvdPlayer.OpenDVDPlayer(); 
      //      
      light.OpenLight(); 
    }
    /// <summary> 
    ///      
    /// </summary> 
    public void CloseMovie() 
    { 
      //      
      projector.CloseProjector(); 
      //     
      amplifier.CloseAmplifier(); 
      //     
      screen.CloseScreen(); 
      //   DVD 
      dvdPlayer.CloseDVDPlayer(); 
      //     
      light.CloseLight(); 
    } 
  } 
}
클 라 이언 트 코드:

using System;
namespace FacadeTest 
{ 
  class Program 
  { 
    static void Main(string[] args) 
    { 
      Facade.MovieFacade movie = new Facade.MovieFacade(); 
      Facade.Projector projector = new Facade.Projector();
        
      //        
      movie.OpenMovie();
      Console.WriteLine();
       
      //                
      projector.SetWideScreen(); 
      //              
      projector.SetStandardScreen(); 
      Console.WriteLine();
      
      //          
      movie.CloseMovie();
      Console.ReadKey(); 
    } 
  } 
}
상기 사례 에서 알 수 있 듯 이 클 라 이언 트 에서 서브 시스템 의 내용 을 사용 할 수 있다.즉,외관 모델 은 서브 시스템 과 클 라 이언 트 를 분리 시 키 지 않 고 깨끗 한 인 터 페 이 스 를 클 라 이언 트 에 게 제공 했다.클 라 이언 트 가 복잡 한 서브 시스템 의 인 터 페 이 스 를 방문 하려 면 똑 같이 방문 할 수 있다.예 를 들 어 위 에 있 는 데모 에 와 이 드 스크린 과 일반 등 모드 를 설정 했다.
외관 모델 의 구조 총화
외관 모델 의 실현 을 본 후에 외관 모델 중의 클래스 간 의 관 계 를 정리 하 는 데 도움 을 주기 위해 위 에서 실현 코드 중의 유형 도 를 제시 합 니 다.
201621994508122.png (626×363)
그러나 외관 모델 에 대해 말하자면 일반적인 클래스 설명 이 하나 도 없다.다음은 외관 모델 의 설명성 대상 도 를 보 여 줌 으로 써 외관 모델 에 대한 이 해 를 깊이 있 게 한다.
201621994528100.png (433×292)
위의 대상 그림 에는 두 개의 캐릭터 가 있다.
외관(Facade)역할:클 라 이언 트 가 이 역할 을 호출 하 는 방법.이 캐릭터 는 관련 된 하나 또는 여러 개의 서브 시스템 의 기능 과 책임 을 알 고 이 캐릭터 는 클 라 이언 트 가 보 낸 요청 에서 해당 하 는 서브 시스템 으로 위임 할 것 이다.
서브 시스템(subsystem)역할:하나 이상 의 서브 시스템 을 동시에 포함 할 수 있 습 니 다.모든 서브 시스템 은 하나의 단독 클래스 가 아니 라 하나의 클래스 의 집합 이다.모든 서브 시스템 은 클 라 이언 트 에 의 해 직접 호출 되 거나 겉치레 역할 에 의 해 호출 될 수 있다.서브 시스템 에 있어 외관 은 다른 클 라 이언 트 일 뿐 서브 시스템 은 외관 의 존 재 를 모른다.
외관 의 장단 점
장점:
외관 모델 은 고객 에 게 서브 시스템 구성 요 소 를 차단 하여 인 터 페 이 스 를 간소화 하고 고객 이 처리 하 는 대상 수 를 줄 이 며 서브 시스템 의 사용 을 더욱 간단하게 한다.
외관 모델 은 서브 시스템 과 고객 간 의 소나무 결합 관 계 를 실현 하고 서브 시스템 내부 의 기능 구성 요 소 는 긴밀 하 게 결합 된다.소나무 결합 은 서브 시스템 의 구성 요소 변 화 를 고객 에 게 영향 을 주지 않 습 니 다.
단점:
새로운 서브 시스템 을 추가 하려 면 외관 류 나 클 라 이언 트 의 소스 코드 를 수정 해 야 할 수도 있 습 니 다.그러면'개-폐 원칙'에 어 긋 납 니 다.(그러나 이것 도 불가피 합 니 다)
필드 사용
다음 상황 에서 외관 모드 사용 을 고려 할 수 있 습 니 다.
외부 복잡 한 서브 시스템 은 간단 한 인 터 페 이 스 를 제공한다.
서브 시스템 의 독립 성 을 제공 하 다
계층 화 구조 에서 외관 모델 로 시스템 의 모든 층 의 입 구 를 정의 할 수 있 습 니 다.그 중 3 층 구조 가 바로 이런 예 이다.
총결산
여기 서 외관 모델 에 대한 소 개 는 끝 났 습 니 다.외관 모델 은 서브 시스템 의 인터페이스 에 통 일 된 인 터 페 이 스 를 제공 합 니 다.이 모델 은 고 층 인 터 페 이 스 를 정의 합 니 다.이 고 층 인 터 페 이 스 는 서브 시스템 을 더욱 쉽게 사용 할 수 있 습 니 다.또한 외관 모델 은 층 구조의 분 리 를 해결 하고 시스템 의 결합 도 를 낮 추 며 신 구 시스템 의 상호작용 에 인터페이스 기능 을 제공 할 수 있다.

좋은 웹페이지 즐겨찾기