[effective java] (6) Skeletal Implementation

orca·2022년 11월 11일
0

effective java

목록 보기
6/8

Favor Skeletal Implementation in Java

Interface와 Abstract Class의 장점을 모두 취하는 방법인 Skeletal Implementation을 구현해보자

인터페이스를 통해 구현체에게 필요한 메서드를 강제하고,
구현체에 공통된 메서드는 추상클래스가 상속받도록 해서 불필요한 코드의 중복은 줄이자

Interface로 뼈대를 만들기

구현체에게 필요한 메서드를 명시한 인터페이스 뼈대를 만든다

public interface Invending {
    void start();
    void chooseProduct();
    void stop();
    void process();
}

Abstract Class로 필요한 구현하기

인터페이스의 구현체로서 공통되는 구현을 정의하는 추상 클래스 만들기

public abstract class AbstractVending implements Invending{
    @Override
    public void start() {
        System.out.println("Start Vending Machine");
    }

    @Override
    public void stop() {
        System.out.println("Stop Vending Machine");
    }

    @Override
    public void process() {
        start();
        chooseProduct();
        stop();
    }
}

SubClass로 마무리

서브 클래스를 작성하고 그 안에 추상 클래스를 상속받는 위임자 클래스를 만든다
그리고 위임자 클래스는 호출을 AbstractVending으로 전달함
공통되지 않아서 위 추상 클래스에서 구현하지 않은 chooseProduct 구현

public class CandyVending implements Invending{
    AbstractVendingDelegator delegator = new AbstractVendingDelegator();

    @Override
    public void start() {
        delegator.start();
    }

    @Override
    public void chooseProduct() {
        delegator.chooseProduct();
    }

    @Override
    public void stop() {
        delegator.stop();
    }

    @Override
    public void process() {
        delegator.process();
    }

    private class AbstractVendingDelegator extends AbstractVending{
        @Override
        public void chooseProduct() {
            System.out.println("Produce diiferent candies");
            System.out.println("Choose a type of candy");
            System.out.println("pay for candy");
            System.out.println("collect candy");
        }
    }
}
public class DrinkVending implements Invending{
    AbstractVendingDelegator delegator = new AbstractVendingDelegator();

    @Override
    public void start() {
        delegator.start();
    }

    @Override
    public void chooseProduct() {
        delegator.chooseProduct();
    }

    @Override
    public void stop() {
        delegator.stop();
    }

    @Override
    public void process() {
        delegator.process();
    }

    private class AbstractVendingDelegator extends AbstractVending{
        @Override
        public void chooseProduct() {
            System.out.println("Produce diiferent soft drinks");
            System.out.println("Choose a type of soft drinks");
            System.out.println("pay for drinks");
            System.out.println("collect drinks");
        }
    }
}

Skeletal Implementation 의 장점과 결론

  1. 서브클래스는 필요한 다른 클래스를 extends 할 수 있음
  2. 추상 클래스에 호출을 위임해서 중복된 코드는 제거 할 수 있음
  3. 서브클래스가 다른 인터페이스를 구현해야 할 경우 그렇게 할 수 있음

인터페이스 동일한 메서드가 있는 경우, 항상 추상 클래스를 생성하자

0개의 댓글