Hansel

디자인 패턴 / 전략패턴 본문

CS/소프트웨어공학

디자인 패턴 / 전략패턴

핑슬 2022. 5. 22. 17:45
디자인 패턴?

디자인 패턴이라 하면 일반적으로 Gangs of Four의 디자인 패턴이 가장 먼저 생각날 것이다.

GoFGangs of Four의 약자로 네명의 컴퓨터 공학자들이 제안한 디자인 패턴을 의미한다.

 

소프트웨어 설계를 위한 지식이나 노하우를 공유하기 위한 방법 중 하나이며

설계 중 재사용할 경우에 유용한 것으로 디자인패턴을 정립한다.

 

소프트웨어 설계에 대한 지식이나 노하우가 문제 유형별로 잘 구체화되어있고 동일한 유형의 문제를 해결하는 방법에 대한 지식이나 노하우가 패턴 형태로 충분히 일반화 되어있다.

또한 쉽게 재사용할 수 있도록 객체지향 개념에 따른 설계만을 패턴으로 지정한다.

 

 

전략패턴

전략패턴은 객체들이 할 수 있는 행위 각각에 대한 전략을 생성하고 유사한 행위들을 캡슐화 하는 인터페이스를 통해 객체의 행위를 직접 수정하지 않고 전략만 바꿔주는 패턴이다.

 

예를 들어 핸드폰 클래스가 있다고 치자.

 

어느날 핸드폰의 배터리 용량을 업데이트할 경우가 생겼다.

이 경우 해당 배터리를 직접 분해하여 내부적으로 용량을 업데이트 할 수도 있다.

하지만 이렇게 할 경우 이전의 사용하던 배터리 정보는 영영 사라지며 다시 그 용량이 필요해지면

다시 배터리를 분해해 이전의 용량으로 복원해야한다.

 

따라서 이 방법보다는 우리가 원하는 용량의 배터리(전략)을 가져와 핸드폰에 삽입해주면 

이전의 배터리가 필요할 때 다시 복원할 수 있고 배터리를 교체하는 과정이 매우 간편해진다.

 

다음과 같은 핸드폰이 존재한다고 가정하자

public class Phone {

    private OperatingSystem os;
    private ServiceProvider serviceProvider;
    private Battery battery;
    private boolean running;

    public Phone(OperatingSystem os, ServiceProvider serviceProvider, Battery battery) {
        this.os = os;
        this.serviceProvider = serviceProvider;
        this.battery = battery;
    }

}

핸드폰은 처음에 OS, ISP, 배터리, 작동여부 등의 필드를 가진다.

여기서 OS를 변경하고 싶다면? 

전략패턴을 이용해서 우리는 단순히 OS 구현체만 받아 교체시켜주면 된다.

 

public void setOs(OperatingSystem os) {
    this.os = os;
}

 

 

 

하지만 유의할점은 교체가 가능한 필드들은 특정 구현 클래스가 아닌 인터페이스 혹은 추상클래스이어야 한다.

 

다양한 전략을 취하려면 상속과 구현을 이용한 방식이 필요하다.

 

public interface OperatingSystem {
    void showVersion();
}

 

 

 

이런 전략 패턴을 통해 코드의 변경 없이 우리는 새로운 전략을 도입해 다양한 로직을 단순하게 처리할 수 있고

어떤 구현 클래스가 오더라도 문제 없이 처리할 수 있다.

=> 따라서 확장에 매우 유연한 코드를 작성할 수 있게 된다.

 

'CS > 소프트웨어공학' 카테고리의 다른 글

디자인 패턴 / 데코레이터 패턴  (0) 2022.05.22
디자인 패턴 / 옵저버 패턴  (0) 2022.05.22