디자인 패턴을 kotlin으로 써 보았다 어댑터 편

「Java 언어로 배우는 디자인 패턴 입문」 에 대해 배우고 자바와 함께 kotlin으로 작성해보기로 결정했습니다.
이번에는 Adapter에 대해 써 보겠습니다.

Adapter란?



벌써 제공되고 있는 것과 필요한 것의 사이의 어긋남을 메우는 것 같은 디자인 패턴으로, Wrapper 패턴이라고도 불린다는 것.
원래의 클래스를 감싸고 필요한 사양에 맞추는 역할의 패턴.

Adapter 패턴의 2 종류의 실장


  • 클래스에서 상속을 사용하는 패턴
  • 인스턴스에서 위양을 사용한 패턴
    의 2 종류가 소개되고 있습니다만, 이번은 1번의 클래스로 계승을 이용한 패턴을 실장해 보고 싶습니다.

  • 클래스에서 상속을 사용하는 패턴



    Era 클래스



    이 클래스는 원래 제공되고 있던 클래스로 합니다.
    kotlin에서는 상속하는 경우, class는 java의 final 취급을 위해, open로 해 상속할 필요가 있다고 하는 것으로 class 정의의 전에 open을 지정한다
    참고:
    htps //w w. 아 t r t. 이. jp / ai t / archi c0s / 1804/24 / 네 ws008. HTML

    Era.java
    class Era{
        private int year;
        public Era(int year) {
            this.year = year;
        }
    
        public int yearToReiwa() {
            return year - 2018;
        }
    
        public int yearToHeisei() {
            return year - 1988;
        }
    }
    

    Era.kt
    open class Era(private val year: Int){
        fun yearToReiwa(): Int = this.year - 2018
        fun yearToHeisei(): Int = this.year - 1988
    }
    

    Print 인터페이스



    여기는 사양으로 필요하며 요구되는 요구 사항을 충족하는 인터페이스입니다.
    kolin에서는 Java로 말하는 void를 지정하는 경우 Unit를 사용한다

    Print.java
    interface Print{
        public abstract void printAsReiwa();
        public abstract void printAsHeisei();
    }
    

    Print.kt
    interface Print{
        fun printAsReiwa(): Unit
        fun printAsHeisei(): Unit
    }
    

    PrintEra 클래스



    이 클래스는 Adapter가 되어, Era 클래스를 랩 해, 필요한 요건을 채우는 클래스가 됩니다.
    포인트는 Era 클래스의 구현을 바꾸지 않고 요구되는 사양을 구현할 수 있는 점입니다.
    상속하는 경우 「:Era」와 같이 지정해, 상속처의 생성자를 호출하는 경우는 「:Era(year)」로 호출할 수 있다

    PrintEra.java
    class PrintEra extends Era implements Print{
        public PrintEra(int year) {
            super(year);
        }
        public void printAsHeisei() {
            System.out.println("平成" + yearToHeisei() + "年");
        }
        public void printAsReiwa() {
            if(yearToReiwa() == 1) System.out.println("令和元年");
            else System.out.println("令和" + yearToReiwa() + "年");  
        }
    }
    

    PrintEra.kt
    class PrintEra(private val year: Int) :Era(year), Print{
        override fun printAsHeisei(): Unit = println("平成" + yearToHeisei() + "年")
        override fun printAsReiwa() {
            if (yearToReiwa() == 1) println("令和元年") else println("令和" + yearToReiwa() + "年")
        }
    }
    

    Main 클래스



    상기 클래스를 실제로 동작시키는 Main 클래스입니다.

    AdapterSample.java
    public class AdapterSample {
        public static void main(String[] args) {
            Print p = new PrintEra(2019);
            p.printAsHeisei();
            p.printAsReiwa();
        }
    }
    

    AdapterSample.kt
    fun main(args: Array<String>){
        val p: Print = PrintEra(2019)
        p.printAsHeisei()
        p.printAsReiwa()
    }
    

    실행 결과
    平成31年
    令和元年
    

    클래스 다이어그램





    소감


  • 원래 준비되어 있던 클래스를 바꾸지 않고 새롭게 요구되는 요건에 맞추어 구현할 수 있으므로, 원래의 메소드를 부수지 않고 구현할 수 있는 것을 배웠다.
  • 또, main 클래스로부터는 원래의 Era 클래스의 메소드를 구현한 Adapter 클래스의 구현이 전혀 보이지 않기 때문에, 재이용성도 올라간다는 것.
  • kotlin이라고 상속에 정의에 슈퍼 클래스의 생성자의 호출을 할 수 있으므로 코드의 행수가 적게 된다

  • 참고



    아래를 참고로 하겠습니다. 매우 읽기 쉽고 이해하기 쉬웠습니다.

    Java 프로그래머를위한 Kotlin 입문

    좋은 웹페이지 즐겨찾기