ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA]객체 지향 디자인 패턴 - Mediator Pattern(중재자 패턴)
    프로그래밍/Java 2022. 3. 28. 20:35
    반응형

    Mediator Pattern이란?

    • 중간에 중재자 역할을 하는 객체를 두어 어떤 특정 클래스의 내용이 변경되었을 때 어떤 특정 범위에 객체들에게 영향을 미칠 때 사용
    • N:M의 관계에서 1:M의 관계로 변경 하고 싶을 때 사용하는 패턴이다.

     

    Mediator Pattern Structure(장식자 패턴 구조)이란?

    • 중간에 Mediator 객체를 둔다 
    • 양쪽으로 N개의 객체 와 M개의 객체를 둔 인터페이스를 둔어 연결 시켜 준다.
    • N개의 객체에서 변화가 있을 때 mediator에게 호출 M개의 객체에 변경 사항을 알려준다
    • mediator는 M개의 객체 모두에게 이 변경 사항을 알려주어야 한다.

     

     

    Mediator Pattern Example

    출처. 얄팍한 코딩사전

    • Mediator안에 Mode라는 객체 들을 담을 Listeners를 만들어 둔다 
    • addListener는 Listeners에 Listener들의 객체를 담는다 
    • onMediaChange는 Listeners에 담겨있는 모든객체의 onModeChange를 호출한다.
    • ModeSwitch객체는 Mediator객체와 toggleMode라는 메서드를 갖는다.
    • toggleMode메서드는 mediator OnModeChange메서드를 호출한다.

    Mediator 클래스

    public class ModeMediator {
    	ArrayList<ModeListener> listeners = new ArrayList<>();
    	
    	public void addListener(ModeListener listener) {
    		listeners.add(listener);
    	}
    	
    	public void onModeChange(Mode mode) {
    		for(ModeListener listener : listeners) {
    			listener.onModeChange(mode);
    		}
    	}
    }

    ModeListener 및 객체 클래스들

    public interface ModeListener {
    	public void onModeChange (Mode mode);
    }
    
    public class ListView implements ModeListener{
    
    	@Override
    	public void onModeChange(Mode mode) {
    		System.out.println("리스트 뷰 " + (mode == Mode.LIST ? "보여줌" : "감춤"));
    	}
    }
    
    public class GalleryView implements ModeListener{
    
    	@Override
    	public void onModeChange(Mode mode) {
    		System.out.println("갤러리 뷰 " + (mode == Mode.GALLERY ? "보여줌" : "감춤"));
    	}
    }
    
    public class DataDownloader implements ModeListener{
    
    	@Override
    	public void onModeChange(Mode mode) {
    		System.out.println((mode == Mode.LIST ? "리스트" : "갤러리") + "뷰용 데이터 다운로드");
    	}
    }

    ModeSwitch 클래스

    public class ModeSwitch {
    	Mode mode = Mode.LIST;
    	
    	ModeMediator modeMediator;
    
    	public void setModeMediator(ModeMediator modeMediator) {
    		this.modeMediator = modeMediator;
    	}
    	
    	public void toggleMode() {
    		mode = mode == Mode.LIST ? Mode.GALLERY : Mode.LIST;
    		
    		if(modeMediator != null) {
    			modeMediator.onModeChange(mode);
    		}
    	}	
    }
    
    enum Mode {LIST, GALLERY}

    Main 클래스 호출

    public class main {
    
    	public static void main(String[] args) {
    		ModeSwitch modeSwitch = new ModeSwitch();
    		ModeMediator modeMediator = new ModeMediator();
    			
    		modeSwitch.setModeMediator(modeMediator);
    	
    		modeMediator.addListener(new ListView());
    		modeMediator.addListener(new GalleryView());
    		modeMediator.addListener(new DataDownloader());
    		
    		modeSwitch.toggleMode();
    		//리스트 뷰 감춤
    		//갤러리 뷰 보여줌
    		//갤러리뷰용 데이터 다운로드
    		
    		modeSwitch.toggleMode();
    		//리스트 뷰 보여줌
    		//갤러리 뷰 감춤
    		//리스트뷰용 데이터 다운로드
    	}
    
    }

     

    Mediator Pattern 사용이유?

    • N:M으로 복잡해져 있는 관계를 정리 할 때 사용한다.
    • 설정이나 어떤 내용이 변경되어 해당 객체 그룹안에 모든 객체에 영향을 미치고 싶을 때 사용한다.
    반응형

    댓글

Designed by Tistory.