프록시패턴은 대상 원본 객체의 대리자가 되어 대신 처리하게 함
[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