반응형
1. 브릿지 패턴이란?
- 클래스의 구현 계층과 추상 계층을 분리하여 각자의 독립적인 변형을 용이하게 한다.
- 구현부에서 추상층을 분리하여 각자 독립적으로 변형이 가능하고 확장이 가능하도록 한다.
- 객체의 확장성을 향상시키기 위한 패턴.
2. 브릿지 패턴을 사용하는 경우
- 클래스의 내용과 클래스에서 처리하는 일이 자주 변화하는 경우
- 기존 시스템에 부수적인 새로운 기능들을 지속적으로 추가 해야하는 경우
- 부모 추상 클래스가 기본 규칙 세트를 정의하고 구체적인 클래스가 추가 규칙을 추가하고 싶은 경우
- 객체에 대한 참조가 있는 추상 클래스가 있고 각 구체적인 클래스에서 정의될 추상 메서드가 있는 경우
3. 브릿지 패턴의 장점
- 새로운 인터페이스를 정의하여 기존 프로그램의 변경없이 기능을 확장할 수 있다.
- 기능 계층, 구현 계층이 분리되어 있기 때문에 독립적으로 확장이 가능한 디자인이다.
- 런타임 시점에 어떤 방식으로 기능을 구현할지 선택할 수 있다.
- 기능을 독립적으로 확장할 수 있다면, 상세한 기능을 외부로부터 숨길 수 있는 은닉 효과도 얻을 수 있다.
4. 브릿지 패턴의 단점
- 계층 구조가 늘어나 복잡도가 증가할 수 있다.
- 구현체의 재사용성이 좋지 않다.
- 추상화와 구현체가 너무 밀접하게 통합되어 있다.
5. 코드 구현
using System;
using System.Collections.Generic;
using System.Threading;
namespace StudyCSharp
{
// 인터페이스
public interface Exercise
{
void Part(); // 운동 부위
void Weight(); // 중량
void Count(); // 개수
}
public class Squat : Exercise
{
public void Part()
{
Console.WriteLine("하체");
}
public void Weight()
{
Console.WriteLine("90kg");
}
public void Count()
{
Console.WriteLine("5~8회");
}
}
public class BenchPress : Exercise
{
public void Part()
{
Console.WriteLine("가슴");
}
public void Weight()
{
Console.WriteLine("70kg");
}
public void Count()
{
Console.WriteLine("8~10회");
}
}
// 추상계층
public abstract class Routine
{
private Exercise _exercise;
public Routine(Exercise exercise)
{
this._exercise = exercise;
}
public void Part()
{
_exercise.Part();
}
public void Weight()
{
_exercise.Weight();
}
public void Count()
{
_exercise.Count();
}
public abstract void ExerciseInfo();
}
// 구현 계층(확장)
public class Monday : Routine
{
public Monday(Exercise exercise) : base(exercise) { }
public override void ExerciseInfo()
{
Console.WriteLine("[벤치프레스]");
Part();
Weight();
Count();
}
}
public class SaturDay : Routine
{
public SaturDay(Exercise exercise) : base(exercise) { }
public override void ExerciseInfo()
{
Console.WriteLine("[스쿼트]");
Part();
Weight();
Count();
}
}
class Program
{
static void Main(string[] args)
{
Routine monday = new Monday(new BenchPress());
Routine saturday = new SaturDay(new Squat());
monday.ExerciseInfo();
Console.WriteLine("---------------------------------");
saturday.ExerciseInfo();
Console.WriteLine("---------------------------------");
}
}
}
<참고 사이트>