공부기록/아키텍처
더블 디스패치
DGL
2021. 10. 31. 23:20
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