Design Pattern

[Design Pattern] 13. Pacade Pattern(퍼사드 패턴) C#

o0zrone 2023. 4. 2. 19:36
728x90

복잡한 여러 클래스들을 단순한 퍼사드 하나로 제공하여 간결하게 만드는 패턴입니다.

 

구조 패턴(Structural Design Patterns)중 하나이죠.

 

장점

  • 복잡한 하위 시스템을 간결하게 만들 수 있습니다.

단점

  • Facade 객체가 모든 걸 다하게 만들어 오히려 악효과가 날 수 있습니다.

 

C#으로 Console 프로젝트를 하나 생성해서 할 것입니다.

 

목표는 컴퓨터 실행입니다. 각 프로세서, 램, 디스크를 만들어 컴퓨터를 실행 시키겠습니다.

 

프로젝트의 tree구조는 아래와 같습니다.

Memento (Project)

|- Program.cs (Main)

|- Processor.cs (Subsystem class)

|- RAM.cs (Subsystem class)

|- Disk.cs (Subsystem class)

|- Computer.cs (Facade class)

 

 

RAM.cs

using System;

namespace Facade
{
    public class RAM
    {
        public void Load(long position, byte[] data)
        {
            Console.WriteLine($"RAM: Load data at {position}");
        }
    }
}

RAM에서 메모리를 읽어오는 Load메소드를 만들어 줍니다.

 

Processor.cs

using System;

namespace Facade
{
    public class Processor
    {
        public void Freeze()
        {
            Console.WriteLine("Processor: Freeze");
        }

        public void Jump(long position)
        {
            Console.WriteLine($"Processor: Jump to {position}");
        }

        public void Execute()
        {
            Console.WriteLine("Processor: Execute");
        }
    }
}

Processor는 정지(Freeze), 이동(Jump), 실행(Excute)를 만들어 줍니다.

 

Disk.cs

using System;

namespace Facade
{
    public class Disk
    {
        public byte[] Read(long position, int size)
        {
            Console.WriteLine($"Disk: Read {size} bytes at {position}");
            return new byte[size];
        }
    }
}

Disk에서 읽올 수 있게 Read 메소드를 구성해줍니다.

 

Computer.cs

namespace Facade
{
    public class Computer
    {
        private readonly Processor _processor;
        private readonly RAM _ram;
        private readonly Disk _disk;

        public Computer()
        {
            _processor = new Processor();
            _ram = new RAM();
            _disk = new Disk();
        }

        public void Start()
        {
            _processor.Freeze();
            _ram.Load(0, _disk.Read(0, 1024));
            _processor.Jump(0);
            _processor.Execute();
        }
    }
}

하위에 포함된 클래스들(Subsystem classes)을 컴퓨터를 실행시키는 메소드 하나로 묶어 줍니다.

 

Program.cs

namespace Facade
{
    public class Facade
    {
        static void Main(string[] args)
        {
            var myComputer = new Computer();
            myComputer.Start();
        }
    }

}

컴퓨터를 만들고 실행(Start)시켜줍니다.

컴퓨터 안에 각 RAM, Disk, Processor를 동작시켜 줍니다.

원하는대로 결과가 출력됨을 확인하실 수 있습니다.

 

실행 결과

 

 

복잡한 시스템 묶어 실행시켜 보다 간결하게 실행할 수 있어 편리한 패턴입니다.

남용하면 의미가 없어지니 주의하여 사용하시면 좋겠습니다.