본문 바로가기

디자인 패턴/Java언어로 배우는 디자인패턴 입문 책 정리

Mediator 패턴

여러 객체들 간의 통신을 조정해주는 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