어댑터 패턴 정의

한 클래스의 인터페이스를 다른 클래스의 인터페이스로변환시켜주는 기능을 제공하는 패턴

퍼사드 패턴 정의

여러 클래스의 인터페이스들을 하나의 통합 클래스로 통합한 패턴 

필요한 상황

어댑터 패턴

- 새로운 인터페이스를 이미 개발되어 있는 인터페이스로 변환시키고 싶을 때 (Array -> List 적용 등..)

퍼사드 패턴

- 나열되어 있는 여러 인터페이스를 통합하여 동시 실행 등 다양한 기능을 제공하고 싶을 때 (매크로 기능..)

Class 다이어그램

어댑터 패턴

퍼사드 패턴

코드

어댑터 패턴

서로 다른 인터페이스 코드

public interface VoltOf110
{
    void volt110On();
    void volt110Off();
}

public interface VoltOf220
{
    void volt220On();
    void volt220Off();
}

기존의 VoltOf110 인터페이스로 구현된 코드

public class DVDPlayer : VoltOf110
{
    public void volt110Off()
    {
        System.Console.WriteLine("DVD Player Off by 110Volt Adapter");
    }
    
    public void volt110On()
    {
        System.Console.WriteLine("DVD Player On by 110Volt Adapter");
    }
}

110Volt To 220 Volt 클래스

public class Converter110To220 : VoltOf220
{
    VoltOf110 iVoltOf110;

    public Converter110To220(VoltOf110 iVoltOf110)
    {
        this.iVoltOf110 = iVoltOf110;
    }

    public void volt220Off()
    {
        iVoltOf110.volt110Off();
    }

    public void volt220On()
    {
        iVoltOf110.volt110On();
    }
}

220 volt 사용 클래스 코드

public class Controller
{
	VoltOf220 ivoltOf220;
	public Controller(VoltOf220 ivoltOf220)
	{
		this.ivoltOf220 = ivoltOf220;
	}
	
	public void turnOn()
	{
		ivoltOf220.volt220On();
	}
	
	public void turnOff()
	{
		ivoltOf220.volt220Off();
	}
}

메인 코드

DVDPlayer dvdPlayer = new DVDPlayer();
Converter110To220 converter110To220 = new Converter110To220(dvdPlayer);
Controller controller = new Controller(converter110To220);
controller.turnOn();
controller.turnOff();

퍼사드 패턴

다양한 인터페이스 코드

public interface Something1
{
    void doSomeThing1();
}

public interface Something2
{
    void doSomeThing2();
}

public interface Something3
{
    void doSomeThing3();
}

public interface Something4
{
    void doSomeThing4();
}

다양한 인터페이스 구현 코드

public class Something1_object : Something1
{
    public Something1_object()
    {
    }
    
    public void doSomeThing1()
    {
        System.Console.WriteLine("DoOne");
    }
}

public class Something2_object : Something2
{
    public Something2_object()
    {
    }
    
    public void doSomeThing2()
    {
        System.Console.WriteLine("DoTwo");
    }
}

public class Something3_object : Something3
{
    public Something3_object()
    {
    }
    
    public void doSomeThing3()
    {
        System.Console.WriteLine("DoThree");
    }
}

public class Something4_object : Something4
{
    public Something4_object()
    {
    }
    
    public void doSomeThing4()
    {
        System.Console.WriteLine("DoFour");
    }
}

모든 인터페이스를 통합 실행하는 클래스 코드

public class AllInOne
{
    Something1 isomething1;
    Something2 isomething2;
    Something3 isomething3;
    Something4 isomething4;

    public AllInOne(
    Something1 isomething1,
    Something2 isomething2,
    Something3 isomething3,
    Something4 isomething4)
    {
        this.isomething1 = isomething1;
        this.isomething2 = isomething2;
        this.isomething3 = isomething3;
        this.isomething4 = isomething4;
    }

    public void doAll()
    {
        this.isomething1.doSomeThing1();
        this.isomething2.doSomeThing2();
        this.isomething3.doSomeThing3();
        this.isomething4.doSomeThing4();
    }
}

메인코드

Something1_object something1 = new Something1_object();
Something2_object something2 = new Something2_object();
Something3_object something3 = new Something3_object();
Something4_object something4 = new Something4_object();
AllInOne allInOne = new AllInOne(something1, something2, something3, something4);
allInOne.doAll();

코드 설명

어댑터 패턴

서로 다른 인터페이스 코드 : 기존 110 volt 인터페이스와 새롭게 교체할 220 volt의 인터페이스이다.

기존의 VoltOf110 인터페이스로 구현된 코드 : 기존 110 volt의 인터페이스를 상속받아 구현한 클래스이다.

110 Volt To 220 Volt 클래스 : 기존의 110 volt 구현체를 받아서 220 volt의 구현 함수로 매칭시켜준다.

메인 코드 : 어뎁터 패턴의 사용 방법을 보여준 코드이다.

퍼사드 패턴

다양한 인터페이스 코드 : 서로 다른 인터페이스를 보여준다.

다양한 인터페이스 구현 코드 : 서로 다른 인터페이스들의 구현체들을 보여준다.

모든 인터페이스를 통합 실행하는 클래스 코드 : 서로 다른 인터페이스를 모두 생성자에서 등록한 후 하나의 함수로 실행시켜 준다.

메인 코드 : 퍼사드 패턴의 사용 방법을 보여준 코드이다.

설명 보충을 위한 그림 자료

어댑터 패턴

110 volt 어뎁터, 110 volt To 220 volt 변환 어뎁터, 220 volt 콘센트이다.

어뎁터 패턴은 이처럼 기존에 맞기 않는 인터페이스 규격을 맞춰주는 패턴이다. 

퍼사드 패턴

퍼사드 패턴은 복잡하게 산재되어 있는 인터페이스들을 취합하여 실행하고 관리를 도와주는 패턴이다. 

어뎁터 패턴과 달리 하나의 인터페이스를 다룬다기보다는 여러 인터페이스를 받아서 좀 더 고도화시키는 패턴이다. 매크로 기능이랑 비슷하다.

필요에 따라 추가 설명

x

정리 및 결론

어댑터 패턴은 기존에 규격에 맞지 않는 경우 사용하는 패턴이다. 내 개인적인 생각으로 이 패턴은 매우 많이 쓰면 관리가 힘들 것 같다. 어댑터 패턴은 단방향?으로 구조여서 변환해야 할 클래스가 늘어날수록 코드가 많아질 것이다. 따라서 어댑터 패턴을 적용하기 전에 한 번쯤 몇 개의 클래스를 변환시켜야 하는지 판단해야 할 것 같다.

퍼사드 패턴은 여러 개로 산재되어 있는 인터페이스 구현체들을 가져와서 하나로 통합하는 패턴이다. 매크로 기능?? 을 수행할 때 필요할 것 같다. 하지만 굳이..? 커맨드 패턴에서 이미 매크로 같은 기능을 구현했는데 이 부분은 잘 모르겠다. 지금 알 수 있는 다른 점은 커맨드 패턴은 하나의 커맨드 인터페이스로 구현된 다양한 구현체를 다룰 때 사용했고, 퍼사드 패턴은 여러개의 인터페이스를 다룰때 사용했다.

'Program > SW Design Patterns' 카테고리의 다른 글

Mediator 패턴 (C++)  (0) 2024.07.31
CH8 스테이트 패턴  (0) 2023.12.04
CH6 커맨드 패턴  (0) 2023.03.07
CH5 데코레이터 패턴  (1) 2023.03.05
CH4 팩토리 패턴  (0) 2023.03.04

+ Recent posts