티스토리 뷰

728x90
반응형

소프트웨어 개발에 있어서 바뀌지 않는 것 : 변화

나중에 어떻게 바뀔 것인지 생각해라

 

디자인패턴
소프트웨어 디자인 과정에서 자주 발생하는 문제들에 대한 전형적인 해결책
훌륭한 객체지향 디자인 품질을 갖추고 있는 시스템을 개발하는 방법을 제공
구상 (Concreate) 클래스란?
추상 (Abstract) 클래스와 대조적으로 모든 메서드를 구현한 클래스

 

구성(Composition) : A has B (캡슐화, 느슨한 결합)
상속(Inheritance) : A is B

 

전략 패턴
알고리즘을 캡슐화하고 이를 교환하여 사용하는 패턴
전략 패턴은 코드의 유연성과 재사용성을 높여주며, 알고리즘의 변경이나 추가에 용이
비슷한 작업을 수행하지만 다양한 알고리즘을 적용해야 하는 경우에 전략 패턴을 사용하여 코드를 구현

 

Context: 전략 패턴을 사용하는 클래스로, 전략 객체를 가지고 있습니다. 전략 객체는 Context에서 사용될 알고리즘을 캡슐화한 것입니다. 

Strategy: 전략을 나타내는 인터페이스나 추상 클래스입니다. 전략 패턴에서는 여러 알고리즘을 대체할 수 있는 이러한 추상화된 형태를 사용합니다. 

ConcreteStrategy: 실제 전략을 구현한 클래스입니다. Strategy 인터페이스를 구현하여 각각의 알고리즘을 구현합니다.

 

 

상속을 활용해 코드를 재사용하거나 오버라딩

 

인터페이스를 활용해 달라질 수 있는 fly(), quack()을 분리

하지만 공통된 코드를 재사용할 수 없다. 매번 구상 클래스에서 동일한 fly(), quack()을 구현해야한다.

 

특정 행동만을 목적으로 하는 클래스의 집합을 만든다.

행동을 실제로 구현한 것은 Duck 서브클래스에 국한되지 않는다.

Duck 서브클래스를 건드리지 않고도 행동 클래스를 수정하거나 추가할 수 있다.

 

행동을 Duck 클래스에서 정의한 메서드를 써서 구현하지 않고 다른 클래스에 위임한다.

인터페이스 변수를 추가하여 서브클래스에서 실행 시 특정 행동 형식에 대한 레퍼런스를 다형적으로 설정한다.

public class Duck {
    Quackable quackBehavior;	//인터페이스를 구현하는 레퍼런스
    
    public void performQuack() {
    	quackBehavior.quack();	//행동을 직접 처리하지 않고 참조되는 객체에 행동을 위임
    }
}

 

서브클래스에서 행동 클래스를 설정

public class MallardDuck extends Duck{
	public MallardDuck() {
		quackBehavior = new Quack();		//인스턴스 변수 상속
		flyBehavior = new FlyWithWings();	//행동 클래스에 위임
	}
	
	public void display() {
		System.out.println("I'm Mallard Duck.");
	}
}

 

동적으로 행동을 지정하는 방법 : 서브클래스에서 세터 메서드를 호출

public abstract class Duck {
	FlyBehavior flyBehavior;		//행동 인터페이스
	QuackBehavior quackBehavior;	//변경되는 부분을 분리하여 캡슐화
	
	public abstract void display();		//자손 클래스에서 구현해야하는 추상메소드
	
	public void performFly() {
		flyBehavior.fly();		//행동 클래스에 위임
	}
	
	public void performQuack() {
		quackBehavior.quack();
	}
	
	public void swim() {
		System.out.println("All ducks can swim.");
	}
	
	public void setFlyBehavior(FlyBehavior fb) {		//동적으로 행동 위임
		this.flyBehavior = fb;
	}
	
	public void setQuackBehavior(QuackBehavior qb) {
		this.quackBehavior = qb;
	}
}

public static void main(String[] args) {
    Duck mallard = new MallardDuck();
    mallard.display();
    mallard.performFly();		//위임받은 행동 인터페이스의 구현체가 동작
    mallard.performQuack();
    System.out.println();

    Duck model = new ModelDuck();
    model.display();
    model.performFly();
    model.setFlyBehavior(new FlyRocketPowered());	//동적으로 행동클래스 위임 변경
    model.performFly();
}

 

A has B : "A에는 B가 있다" 

각 오리에는 Flyable, Quackable 이 있으며, 각각 행동을 위임 받는다.

올바른 행동 객체로 구성됨으로써 행동을 부여받는 것.

 

Strategy Pattern

알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다.

스트래티지를 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.

 

디자인 원칙

1. 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리시킨다.

2. 구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.

3. 상속보다는 구성을 활용한다.

 

 

 

728x90
반응형
반응형
300x250