2021.06.03 - [Back-End/Java_Spring] - [디자인패턴] 프록시 패턴(Proxy Pattern) _ AOP
디자인 패턴_Detail_3
Decorator Pattern
- 기존 뼈대(클래스)는 유지하되, 이후 필요한 형태로 꾸밀 때 사용
- 예시 : 에스프레소에 물, 우유, 초콜릿 등을 넣듯이 원본을 유지하면서 첨가하여 확장
- 확장이 필요한 경우 상속의 대안으로도 활용
- SOLID 중 개방 폐쇄 원칙(OCP)과 의존 역전 원칙(DIP)를 따른다
ICar
package design.decorator;
public interface ICar {
int getPrice();
void showPrice();
}
- 기본이 되는 인턴페이스 작성
Audi
package design.decorator;
public class Audi implements ICar {
private int price;
public Audi(int price) {
this.price = price;
}
@Override
public int getPrice() {
return price;
}
@Override
public void showPrice() {
System.out.println("아우디의 가격은 " + this.price + "원입니다.");
}
}
- 뼈대가 되는 기본 구현 클래스 작성
AudiDecrator
package design.decorator;
public class AudiDecorator implements ICar{
protected ICar audi;
protected String modelName;
protected int modelPrice;
public AudiDecorator(ICar audi, String modelName, int modelPrice) {
this.audi = audi;
this.modelName = modelName;
this.modelPrice = modelPrice;
}
@Override
public int getPrice() {
return audi.getPrice() + modelPrice;
}
@Override
public void showPrice() {
System.out.println(modelName + "의 가격은" + getPrice() + "원 입니다.");
}
}
- 기본 클래스를 가져와 추가 작업을 진행하는 데코레이터 클래스 작성
A3 ~ A5
package design.decorator;
public class A3 extends AudiDecorator{
public A3(ICar audi, String modelName) {
super(audi, modelName, 1000);
}
}
===================================================
package design.decorator;
public class A4 extends AudiDecorator{
public A4(ICar audi, String modelName) {
super(audi, modelName, 2000);
}
}
===================================================
package design.decorator;
public class A5 extends AudiDecorator{
public A5(ICar audi, String modelName) {
super(audi, modelName, 3000);
}
}
- 데코레이터를 상속 받아 기본 클래스를 유지한 채 추가 작업을 수행하는 클래스를 작성
Main
package design;
import design.decorator.A3;
import design.decorator.A4;
import design.decorator.A5;
import design.decorator.Audi;
import design.decorator.ICar;
public class Main {
public static void main(String[] args) {
// 기본 클래스
ICar audi = new Audi(1000);
audi.showPrice();
// 데코레이터 클래스
ICar audi3 = new A3(audi,"A3");
audi3.showPrice();
ICar audi4 = new A4(audi,"A4");
audi4.showPrice();
ICar audi5 = new A5(audi,"A5");
audi5.showPrice();
}
}
출력 결과
아우디의 가격은 1000원입니다.
A3의 가격은2000원 입니다.
A4의 가격은3000원 입니다.
A5의 가격은4000원 입니다.
Observer Pattern
- 관찰자 패턴이라고도 말함
- 변화가 일어났을 때 미리 등록 된 다른 클래스에 통보해주는 패턴을 구현
- 많이 사용되는 곳은 Event Listener
IButtonListener
package design.observer;
public interface IButtonListener {
void clickEvent(String event);
}
- 클릭 이벤트 추상메서드를 가진 인터페이스 작성
Button
package design.observer;
public class Button {
private String name;
private IButtonListener buttonListener;
public Button(String name) {
this.name = name;
}
public void click(String message) {
buttonListener.clickEvent(message);
}
// 클릭이벤트를 달아주는 메서드
public void addListener(IButtonListener iButtonListener) {
this.buttonListener = iButtonListener;
}
}
Main
package design;
import design.observer.Button;
import design.observer.IButtonListener;
public class Main {
public static void main(String[] args) {
Button button = new Button("버튼");
// 이너클래스로 구현한 버튼리스너를 추가해 줌
button.addListener(new IButtonListener() {
@Override
public void clickEvent(String event) {
System.out.println(event);
}
});
button.click("메시지 전달 : click 1");
button.click("메시지 전달 : click 2");
button.click("메시지 전달 : click 3");
button.click("메시지 전달 : click 4");
}
}
출력 결과
메시지 전달 : click 1메시지 전달 : click 2메시지 전달 : click 3메시지 전달 : click 4
반응형
'공부 기록' 카테고리의 다른 글
[디자인패턴]전략 패턴(Strategy Pattern) (0) | 2021.06.03 |
---|---|
[디자인패턴]파사드 패턴(Facade Pattern) (0) | 2021.06.03 |
[디자인패턴] 프록시 패턴(Proxy Pattern) _ AOP (0) | 2021.06.03 |
[디자인패턴]싱글톤 패턴(Singleton Pattern), 어댑터 패턴(Adapter Pattern) (0) | 2021.05.28 |
[디자인패턴]Gof의 디자인패턴 (Gang of Four) (0) | 2021.05.28 |
댓글