여러 객체들 간의 통신을 조정해주는 mediator을 두고, 모든 통신은 mediator을 통해서만 일어나도록 만드는 패턴
1. 코드 (주식의 거래 예시)
Stock: 주식을 나타내는 객체
public class Stock {
private String name;
private int price;
public Stock(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return this.name;
}
public int getPrice() {
return this.price;
}
}
BuyGroup: 매수자의 그룹을 관리하는 클래스
- 비싼 가격에 매수하는 사람이 거래 우선순위를 가진다.
- 구매(add)를 하면 리스트에 들어가고 mediator에게 중재를 요구
public class BuyGroup {
private Mediator mediator;
public PriorityQueue<Stock> buyerList;
public BuyGroup() {
buyerList = new PriorityQueue<Stock>(10, new Comparator<Stock>() {
@Override
// 비싼 가격에 산 사람이 우선권 가짐
public int compare(Stock arg0, Stock arg1) {
if (arg0.getPrice() == arg1.getPrice()) {
return 0;
}
return arg0.getPrice() < arg1.getPrice() ? 1 : -1;
}
});
}
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public void add(Stock stock) {
buyerList.add(stock);
mediator.deal();
}
}
SellGroup : 매도자의 그룹을 관리하는 클래스
- 싼 가격에 매도하는 사람이 거래 우선순위를 가진다.
- 판매(add)를 하면 리스트에 들어가고 mediator에게 중재를 요구
public class SellGroup {
private Mediator mediator;
public PriorityQueue<Stock> sellerList;
public SellGroup() {
sellerList = new PriorityQueue<Stock>(10, new Comparator<Stock>() {
@Override
// 싼 가격에 판 사람이 우선권
public int compare(Stock arg0, Stock arg1) {
if (arg0.getPrice() == arg1.getPrice()) {
return 0;
}
return arg0.getPrice() > arg1.getPrice() ? 1 : -1;
}
});
}
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public void add(Stock stock) {
sellerList.add(stock);
mediator.deal();
}
}
Mediator : 주식 거래의 중재를 해주는 클래스
- 매수 금액 >= 매도 금액 인 경우에 거래 가능
public class Mediator {
private BuyGroup buyGroup;
private SellGroup sellGroup;
public Mediator(BuyGroup buyGroup, SellGroup sellGroup) {
this.buyGroup = buyGroup;
this.sellGroup = sellGroup;
buyGroup.setMediator(this);
sellGroup.setMediator(this);
}
public void deal() {
if (buyGroup.buyerList.size() == 0) {
System.out.println("매수자가 없습니다.");
return;
}
if (sellGroup.sellerList.size() == 0) {
System.out.println("매도자가 없습니다.");
return;
}
Stock buyer = buyGroup.buyerList.peek();
Stock seller = sellGroup.sellerList.peek();
if (buyer.getPrice() < seller.getPrice()) {
System.out.println("거래 가능한 경우가 없습니다.");
return;
}
buyGroup.buyerList.remove();
sellGroup.sellerList.remove();
System.out.println(buyer.getName() +"와 " + seller.getName() + "의 거래가 성사되었습니다.");
}
}
Main: 주식을 사고 파는 명령을 하는 테스트 클래스
public class Main {
public static void main(String[] args) {
BuyGroup buyGroup = new BuyGroup();
SellGroup sellGroup = new SellGroup();
Mediator mediator = new Mediator(buyGroup, sellGroup);
buyGroup.add(new Stock("buyer1", 7));
buyGroup.add(new Stock("buyer2", 7));
sellGroup.add(new Stock("seller1", 10));
sellGroup.add(new Stock("seller2", 6));
}
}
2. 특징
- 로직이 한군데에서 관리 된다.
- mediator와 mediator을 호출하는 객체가 위임의 관계로 되어 있음.
- mediator을 호출하는 객체들(buyGroup, sellGroup)은 재사용이 가능하나, mediator는 재사용이 힘들다.
- mediagtor을 호출하는 객체들은 서로 어떤 상태인지 알 필요가 없다.
3. 해당 패턴을 고려해볼만한 상황
- 여러 객체들이 서로 통신이 필요하고 통신하는 과정의 로직이 복잡한 경우
- 이미 있는 기능들을 상황에 맞게 융합하여 사용이 필요한 경우
'디자인 패턴 > Java언어로 배우는 디자인패턴 입문 책 정리' 카테고리의 다른 글
Memento 패턴 (0) | 2021.03.08 |
---|---|
Observer 패턴 (0) | 2021.02.21 |
Facade 패턴 (0) | 2021.02.12 |
Chain Of Responsibility 패턴 (0) | 2021.02.11 |
Visitor 패턴 (0) | 2021.02.07 |