1. 특정 메서드를 구현하고 상속을 하면, 이후에 해당 클래스를 상속받아 사용하는 클래스들에게 당연하게도 기능이 상속된다.
그럴 경우 상속받은 클래스는 구현된 기능과 어울리지 않는 속성의 클래스 일 수 있는데, 해당 메서드를 접근 가능하게 되어 문제가 발생한다.
-> 상속으로 코드 재사용 생각할 경우 문제
오리 클래스에 fly() 메서드 구현하고 상속했을때, 추후 장남감 오리 클래스 만들어서 오리 클래스 상속받으면, 장난감 오리도 fly() 메서드를 사용할 수 있는 문제가 발생한다.
안 그러고 상속받아서 사용하려면 일일이 fly()메서드를 빈 메서드로 오버라이드 해야 한다.
2. (1) 문제 해결하기 위하여 클래스를 상속받은 클래스마다 interface를 사용해서 내용 구현하는 방법을 사용한다면?
-> 문제점1. 코드 중복(재사용 불가) 문제 발생함. ex) 천둥오리, 파오리, 그냥 오리 전부 "꽥꽥" 이라고 울더라도,
각 오리 클래스마다 인터페이스 사용하여 같은 내용을 구현해야 하여서 코드의 중복이 발생한다. (오리 클래스 개수에 비례)
문제점2. 문제점1로 인하여 추후 오리들이 "꽥꽥"이 아니라 "덕덕" 이라고 울게 된다면 오리 클래스들 인터페이스 구현 메서드 전부 찾아서 수정해야 한다.( 오리 클래스 개수에 비례)
3. 인터페이스(FlyBehavior)를 구현한 행동 클래스(FlyWithWings)를 만들고, Duck 클래스의 멤버변수에 넣는다. (composite/구성)
구성(composite)를 이용하여 시스템을 만들면 유연성을 크게 향상시킬 수 있다. 단순히 알고리즘군을 별도의 클래스의 집합으로 캡슐화할 수 있도록
만들어 주는 것 뿐 아니라, 구성요소로 사용하는 객체에서 올바른 행동 인터페이스를 구현하기만 하면 실행시에 행동을 바꿀 수도 있다.
public abstract class Duck {
protected FlyBehavior flyBehavior;
protected void swim() {
System.out.println("모든 오리는 수영할 수 있다.");
}
protected abstract void display();
protected void performFly() throws Exception {
if(this.flyBehavior == null) {
throw new Exception("초기화 안 됨 에러");
}
this.flyBehavior.fly();
}
protected void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
}
package duck;
public class MallardDuck extends Duck{
MallardDuck(){
this.flyBehavior = new FlyWithWings();
}
@Override
protected
void display() {
}
}
package duck;
public interface FlyBehavior {
public abstract void fly();
}
package duck;
public class FlyWithWings implements FlyBehavior{
@Override
public void fly() {
System.out.println("이 객체는 날개를 가지고 날아다닙니다.");
}
}
package duck;
public class FlyNoWay implements FlyBehavior{
@Override
public void fly() {
System.out.println("이 객체는 날 수 없습니다.");
}
}
package duck;
public class main {
public static void main(String[] args) throws Exception {
Duck duck = new MallardDuck();
duck.performFly();
duck.setFlyBehavior(new FlyNoWay());
duck.performFly();
}
}
'java > 디자인패턴' 카테고리의 다른 글
어뎁터 패턴 (adapter pattern) (0) | 2023.02.03 |
---|---|
프록시, 데코레이터 패턴 (0) | 2022.10.09 |
전략 패턴, 템플릿 콜백 패턴 (0) | 2022.10.08 |
전략 패턴 (0) | 2022.10.03 |
템플릿 메서드 패턴 (0) | 2022.10.02 |
댓글