C\#디자인 모드 프로 그래 밍 에서 외관 모드 Facade Pattern 의 응용 분석
홈 극장 에는 조명,스크린,프로젝터,플레이어,DVD 플레이어 등 몇 가지 기본 적 인 도구 가 있 습 니 다.
4.567917.조명 은 조명 을 끄 고 조명 을 켤 수 있 습 니 다4.567917.프로젝터,프로젝터 를 켜 고 닫 을 수 있 습 니 다4.567917.화면 을 열 고 닫 을 수 있 습 니 다4.567917.공 방 기 는 볼 륨 을 끄 고 볼 륨 을 켤 수 있 습 니 다4.567917.DVD 재생 기 는 재생 기 를 켜 고 재생 기 를 닫 을 수 있 습 니 다가장 일반적인 방식 으로 영 화 를 보 는 것 을 실현 한다.유형 도 는 다음 과 같다.
아 날로 그 에 따 르 면 영 화 를 보 려 면 클 라 이언 트 에서 다음 과 같은 조작 을 해 야 한다.먼저 프로젝터 를 켜 고 공 방 기 를 켜 고 화면 을 켜 고 DVD 플레이 어 를 켜 고 조명 을 켜 야 한다.이렇게 많은 조작 을 한 후에 야 영 화 를 볼 수 있다.영 화 를 닫 을 때 도 프로젝터 를 끄 고 공 방 기 를 끄 고 화면 을 끄 고 DVD 플레이 어 를 끄 고 조명 을 꺼 야 한다.오,이 건 너무 복잡 해!!!클 라 이언 트 에 그렇게 많은 조작 이 있 습 니 다.만약 에 일부 사용자 가 그 중의 도 구 를 어떻게 사용 하 는 지 모 르 면 그 는 영 화 를 볼 수 없습니다!
위 에서 사실은 현재 소프트웨어 개발 시스템 에서 흔히 볼 수 있 는 현상 을 나타 낸다.클 라 이언 트 프로그램 은 복잡 한 시스템 의 내부 서브 시스템 과 직접적인 관 계 를 가지 기 때문에 클 라 이언 트 프로그램 은 서브 시스템 의 변화 에 따라 변화 한다.위의 이 문 제 를 해결 하려 면 반드시 고객 프로그램 과 서브 시스템 간 의 상호작용 인 터 페 이 스 를 간소화 하고 고객 프로그램 과 서브 시스템 간 의 결합 을 해제 해 야 하 며 외관 모델 은 이 문 제 를 해결 할 수 있다.
외관 모드(Facade)의 정의:서브 시스템 의 인터페이스 에 일치 하 는 인 터 페 이 스 를 제공 하여 서브 시스템 의 인 터 페 이 스 를 방문 합 니 다.
이 모드 는 고 층 인 터 페 이 스 를 정의 합 니 다.이 인 터 페 이 스 는 이 서브 시스템 을 더욱 쉽게 사용 할 수 있 습 니 다.쉽게 말 하면 외관 모델 은 하나 이상 의 복잡 한 조작 을 숨 기 고 클 라 이언 트 가 사용 할 수 있 도록 일치 하 는 인터페이스 만 표시 하 는 것 이다.주의해 야 할 것 은 외관 모델 은 단지 당신 에 게 더욱 직접적 이 고 쉬 운 조작 방식 을 제공 하 는 것 일 뿐 원래 의 서브 시스템 을 격 리 시 키 지 않 았 기 때문에 만약 에 서브 시스템 류 의 더 높 은 기능 이 필요 하 다 면 원래 의 서브 시스템 을 사용 할 수 있 는 것 이 외관 모델 의 큰 장점 이다.외관 모드 를 통 해 서브 시스템 의 여러 인터페이스 에 고 층 인 터 페 이 스 를 구축 하고 이 고 층 인 터 페 이 스 를 클 라 이언 트 에 게 제공 하면 클 라 이언 트 와 복잡 한 서브 시스템 간 의 결합 을 해제 할 수 있다.
위의 그림 을 통 해 알 수 있 듯 이 외관 모델 은 간단 한 인터페이스(OpenMovie 와 CloseMovie)를 클 라 이언 트 에 제공 하고 클 라 이언 트 와 서브 시스템 간 에 디 결합 을 실현 했다.다음은 코드 를 통 해 위의 이 데 모 를 실현 합 니 다.
재생 도구 의 코드:
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();
}
}
}
상기 사례 에서 알 수 있 듯 이 클 라 이언 트 에서 서브 시스템 의 내용 을 사용 할 수 있다.즉,외관 모델 은 서브 시스템 과 클 라 이언 트 를 분리 시 키 지 않 고 깨끗 한 인 터 페 이 스 를 클 라 이언 트 에 게 제공 했다.클 라 이언 트 가 복잡 한 서브 시스템 의 인 터 페 이 스 를 방문 하려 면 똑 같이 방문 할 수 있다.예 를 들 어 위 에 있 는 데모 에 와 이 드 스크린 과 일반 등 모드 를 설정 했다.외관 모델 의 구조 총화
외관 모델 의 실현 을 본 후에 외관 모델 중의 클래스 간 의 관 계 를 정리 하 는 데 도움 을 주기 위해 위 에서 실현 코드 중의 유형 도 를 제시 합 니 다.
그러나 외관 모델 에 대해 말하자면 일반적인 클래스 설명 이 하나 도 없다.다음은 외관 모델 의 설명성 대상 도 를 보 여 줌 으로 써 외관 모델 에 대한 이 해 를 깊이 있 게 한다.
위의 대상 그림 에는 두 개의 캐릭터 가 있다.
외관(Facade)역할:클 라 이언 트 가 이 역할 을 호출 하 는 방법.이 캐릭터 는 관련 된 하나 또는 여러 개의 서브 시스템 의 기능 과 책임 을 알 고 이 캐릭터 는 클 라 이언 트 가 보 낸 요청 에서 해당 하 는 서브 시스템 으로 위임 할 것 이다.
서브 시스템(subsystem)역할:하나 이상 의 서브 시스템 을 동시에 포함 할 수 있 습 니 다.모든 서브 시스템 은 하나의 단독 클래스 가 아니 라 하나의 클래스 의 집합 이다.모든 서브 시스템 은 클 라 이언 트 에 의 해 직접 호출 되 거나 겉치레 역할 에 의 해 호출 될 수 있다.서브 시스템 에 있어 외관 은 다른 클 라 이언 트 일 뿐 서브 시스템 은 외관 의 존 재 를 모른다.
외관 의 장단 점
장점:
외관 모델 은 고객 에 게 서브 시스템 구성 요 소 를 차단 하여 인 터 페 이 스 를 간소화 하고 고객 이 처리 하 는 대상 수 를 줄 이 며 서브 시스템 의 사용 을 더욱 간단하게 한다.
외관 모델 은 서브 시스템 과 고객 간 의 소나무 결합 관 계 를 실현 하고 서브 시스템 내부 의 기능 구성 요 소 는 긴밀 하 게 결합 된다.소나무 결합 은 서브 시스템 의 구성 요소 변 화 를 고객 에 게 영향 을 주지 않 습 니 다.
단점:
새로운 서브 시스템 을 추가 하려 면 외관 류 나 클 라 이언 트 의 소스 코드 를 수정 해 야 할 수도 있 습 니 다.그러면'개-폐 원칙'에 어 긋 납 니 다.(그러나 이것 도 불가피 합 니 다)
필드 사용
다음 상황 에서 외관 모드 사용 을 고려 할 수 있 습 니 다.
외부 복잡 한 서브 시스템 은 간단 한 인 터 페 이 스 를 제공한다.
서브 시스템 의 독립 성 을 제공 하 다
계층 화 구조 에서 외관 모델 로 시스템 의 모든 층 의 입 구 를 정의 할 수 있 습 니 다.그 중 3 층 구조 가 바로 이런 예 이다.
총결산
여기 서 외관 모델 에 대한 소 개 는 끝 났 습 니 다.외관 모델 은 서브 시스템 의 인터페이스 에 통 일 된 인 터 페 이 스 를 제공 합 니 다.이 모델 은 고 층 인 터 페 이 스 를 정의 합 니 다.이 고 층 인 터 페 이 스 는 서브 시스템 을 더욱 쉽게 사용 할 수 있 습 니 다.또한 외관 모델 은 층 구조의 분 리 를 해결 하고 시스템 의 결합 도 를 낮 추 며 신 구 시스템 의 상호작용 에 인터페이스 기능 을 제공 할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.