본문 바로가기

공부기록/아키텍처

더블 디스패치

 

import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Post> posts = Arrays.asList(new Text(), new Picture());
        List<SNS> sns = Arrays.asList(new Facebook(), new Twitter(), new Instagram());

        posts.forEach(post -> sns.forEach(s -> post.postOn(s)));
    }

    interface Post {

        void postOn(SNS sns);
    }

    static class Text implements Post {

        public void postOn(SNS sns) {
            sns.post(this);
        }
    }

    static class Picture implements Post {

        public void postOn(SNS sns) {
            sns.post(this);
        }
    }

    interface SNS {
        void post(Text text);
        void post(Picture picture);
    }

    static class Facebook implements SNS {

        public void post(Text text) {
            System.out.println("FACEBOOK UPLOADING");
            System.out.println("TEXT by facebook");
        }

        public void post(Picture picture) {
            System.out.println("FACEBOOK UPLOADING");
            System.out.println("PICTURE by facebook");
        }
    }

    static class Twitter implements SNS {
        public void post(Text text) {
            System.out.println("TWITTER UPLOADING");
            System.out.println("TEXT by twitter");
        }

        public void post(Picture picture) {
            System.out.println("TWITTER UPLOADING");
            System.out.println("PICTURE by twitter");
        }
    }
    static class Instagram implements SNS {
        public void post(Text text) {
            System.out.println("INSTAGRAM UPLOADING");
            System.out.println("TEXT by instagram");
        }

        public void post(Picture picture) {
            System.out.println("INSTAGRAM UPLOADING");
            System.out.println("PICTURE by instagram");
        }
    }
}

 

Text, Picture를 FaceBook, Twitter, Instagram에 post하는데

 

SNS를 기존 코드의 수정없이 늘릴 수 있다.(OCP)

 

postOn메서드에서 자기자신을 넘기는 것이 특징이다.

 

visitor 패턴에 사용된다고 하는데..

 

a type의 항목들이 있고, b type의 항목들이 있고, 

 

두 타입이 연관이 있어서 매개변수로 같이 쓰이는데,

 

하나의 타입만 확장할 수 있게 한다면, 매우 좋은 방법인 것 같다.

 

다음에는 visitor 패턴을 봐야겠다 ㅎㅎ(사실 어딘가 책에서 보긴했지만.. 기억이 ㅠ)

 

 

https://www.youtube.com/watch?v=s-tXAHub6vg