클래스를 확장하지 않고 클래스의 행동을 변경할 수 있도록 하는 기법이다. 구체적인 클래스와 알고리즘 사이의 결합도를 낮추는 디자인 패턴이다.
상속을 대체하는 패턴이다.
게임의 무기 사용을 예시로 들어보자.
public interface IWeapon
{
void Attack();
}
public class Sword : IWeapon
{
public void Attack()
{
//.. 검을 휘두른다
}
}
public class Gun : IWeapon
{
public void Attack()
{
//.. 총을 쏜다
}
}
public class Player
{
public void Attack(IWeapon weapon)
{
weapon.Attack();
}
}

이런 식으로 플레이어가 무기를 변경한다고 해도 무기들의 IWeapon의 정의만 알고 있으면 플레이어의 코드 변경 없이 교체가 가능하다.