[디자인패턴] 프록시패턴

이나겸's avatar
Nov 12, 2024
[디자인패턴] 프록시패턴
💡
프록시패턴은 대상 원본 객체의 대리자가 되어 대신 처리하게 함

[Doorman이 Animal을 만났을때 쫓아냄 동작을 하기 전에 “ 안녕”이라고 인사하도록 구현하기]

1. 잘못된 코드

💡
Doorman 클래스에 “안녕” 호출문을 추가하는건 기존 코드를 수정하는 것
⇒ OCP 위배
 
package ch02; // 추상 클래스 => 상속 가능 public abstract class Animal { public abstract String getName(); } package ch02; // 쥐 Object // Animal 상속 public class Mouse extends Animal { private String name = "쥐"; // 부모와의 동일 메소드 오버라이드 public String getName() { return name; } } package ch02; // 고양이 Object // Animal 상속 public class Cat extends Animal { private String name = "고양이"; // 부모와의 동일 메소드 오버라이드 public String getName() { return name; } } package ch02; // srp (Single Responsibility Principle) // 하나의 클래스는 하나의 책임을 가지는게 좋다 (의무가 아니라 권장) public class Doorman { // DIP (Dependency Inversion Principle, 의존성 역전 원칙) // 구체적인것(Mouse, Cat)에 의존하지말고 추상적인것(Animal)에 의존하라 // 이 클래스의 책임 public void 쫓아내(Animal animal) { System.out.println("안녕"); System.out.println(animal.getName() + " 쫓아내"); } } package ch02; public class App { public static void main(String[] args) { Doorman doorman = new Doorman(); Cat cat = new Cat(); Mouse mouse = new Mouse(); doorman.쫓아내(cat); doorman.쫓아내(mouse); } }
 

2. 좋은 코드

💡
DoormanProxy 클래스를 생성하고 Doorman의 대리자로 만들고 “안녕” 인사를 대신 동작하게해서 해결
 
package ch02; // 추상 클래스 => 상속 가능 public abstract class Animal { public abstract String getName(); } package ch02; // 쥐 Object // Animal 상속 public class Mouse extends Animal { private String name = "쥐"; // 부모와의 동일 메소드 오버라이드 public String getName() { return name; } } package ch02; // 고양이 Object // Animal 상속 public class Cat extends Animal { private String name = "고양이"; // 부모와의 동일 메소드 오버라이드 public String getName() { return name; } } package ch02; // srp (Single Responsibility Principle) // 하나의 클래스는 하나의 책임을 가지는게 좋다 (의무가 아니라 권장) public class Doorman { // DIP (Dependency Inversion Principle, 의존성 역전 원칙) // 구체적인것(Mouse, Cat)에 의존하지말고 추상적인것(Animal)에 의존하라 // 이 클래스의 책임 public void 쫓아내(Animal animal) { System.out.println(animal.getName() + " 쫓아내"); } } package ch02; public class DoormanProxy { // Doorman에 의존할거니까 불러오기 private Doorman doorman; // 생성자 public DoormanProxy(Doorman doorman) { this.doorman = doorman; } public void hello(Animal animal) { System.out.println("안녕"); // doormanProxy가 안녕하고 doorman.쫓아내(animal); // doorman이 쫓아내기 } } package ch02; public class App { public static void main(String[] args) { Doorman doorman = new Doorman(); // DoormanProxy는 Doorman이 필요하니까 의존성 주입(파라미터 안) DoormanProxy doormanProxy = new DoormanProxy(doorman); Cat cat = new Cat(); Mouse mouse = new Mouse(); doormanProxy.hello(cat); doormanProxy.hello(mouse); } }
Share article

Nakyeom's Study