반응형

가정) 홈 씨어터(극장)으로 예제를 작성하겠습니다.

 

로직

1. 전등을 어둡게 조절한다.

2.스크린을 내린다.

3.프로젝터를 켠다.

4.프로젝트로 DVD신호가 입력되도록 한다.

5.앰프를 켠다.

6.볼륨을 중간으로 설정한다.

7.DVD를 키고 재생한다..... 등

 

light.on();
screen.down();

.
.
.
등등

.

.

그런데,, 아직 끝난게 아닙니다.

영화가 끝나면 어떤식으로 꺼야할까요?

시스템을 업그레이드하면 또 어떤식으로 작동되어야할까요?

.

.

이런경우에 퍼스드를 사용하면 됩니다.

 

퍼사드는 인터페이스를 단순화 시킬 뿐 아니라 클라이언트와 구성요소들로 이루어진

서브시스템을 분리시키는 역할도 합니다.

 

퍼사드와 어댑터는 모두 여러 개의 클래스를 감쌀 수 있습니다.

하지만,

퍼사드는 인터페이스를 단순화시키기 위한 용도로 쓰이는 반면,

어댑터는 인터페이스를 다른 인터페이스로 변환하기 위한 용도로 쓰입니다.

.

.

 

 

예제구현

 

public class HomeTheaterFacade {
	Amplifier amp;
	Tuner tuner;
	StreamingPlayer player;
	CdPlayer cd;
	Projector projector;
	TheaterLights lights;
	Screen screen;
	PopcornPopper popper;
 
	public HomeTheaterFacade(Amplifier amp, 
				 Tuner tuner, 
				 StreamingPlayer player, 
				 Projector projector, 
				 Screen screen,
				 TheaterLights lights,
				 PopcornPopper popper) {
 
		this.amp = amp;
		this.tuner = tuner;
		this.player = player;
		this.projector = projector;
		this.screen = screen;
		this.lights = lights;
		this.popper = popper;
	}
 
	public void watchMovie(String movie) {
		System.out.println("영화 볼 준비");
		popper.on();
		popper.pop();
		lights.dim(10);
		screen.down();
		projector.on();
		projector.wideScreenMode();
		amp.on();
		amp.setStreamingPlayer(player);
		amp.setSurroundSound();
		amp.setVolume(5);
		player.on();
		player.play(movie);
	}

 

public class Amplifier {
	String description;
	Tuner tuner;
	StreamingPlayer player;
	
	public Amplifier(String description) {
		this.description = description;
	}
 
	public void on() {
		System.out.println(description + " on");
	}
 
	public void off() {
		System.out.println(description + " off");
	}
 
	public void setStereoSound() {
		System.out.println(description + " stereo mode on");
	}
 
	public void setSurroundSound() {
		System.out.println(description + " surround sound on (5 speakers, 1 subwoofer)");
	}
 
	public void setVolume(int level) {
		System.out.println(description + " setting volume to " + level);
	}

	public void setTuner(Tuner tuner) {
		System.out.println(description + " setting tuner to " + player);
		this.tuner = tuner;
	}
  
	public void setStreamingPlayer(StreamingPlayer player) {
		System.out.println(description + " setting Streaming player to " + player);
		this.player = player;
	}
 
	public String toString() {
		return description;
	}
}
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Amplifier amp = new Amplifier("Amplifier");
        Tuner tuner = new Tuner("AM/FM Tuner", amp);
        StreamingPlayer player = new StreamingPlayer("Streaming Player", amp);
        CdPlayer cd = new CdPlayer("CD Player", amp);
        Projector projector = new Projector("Projector", player);
        TheaterLights lights = new TheaterLights("Theater Ceiling Lights");
        Screen screen = new Screen("Theater Screen");
        PopcornPopper popper = new PopcornPopper("Popcorn Popper");

        HomeTheaterFacade homeTheater =
                new HomeTheaterFacade(amp, tuner, player,
                        projector, screen, lights, popper);

        homeTheater.watchMovie("Raiders of the Lost Ark");
        homeTheater.endMovie();
    }
}

 

.

.

.

 

퍼사드패턴 : 어떤 서브시스템의 일련의 인터페이스에 통합된 인터페이스를 제공합니다.
퍼사드에서 고수준 인터페이스를 정의하기 때문에 서브세스템을 더 쉽게 사용 할 수 있습니다.

 

.

.

 

 

디자인원칙 
- 최소 지식 원칙 : 정말 친한 친구하고만 얘기하라.

 

결합도를 낮추는 방법

 

다음 네 종류의 객체의 메소드만을 호출하면 됩니다.

 

1. 객체 자체

2. 메소드에 매개면수로 전달된 객체

3. 그 메소드에서 생성하거나 인트턴스를 만든 객체

4. 그 객체에 속하는 구성요소

 

 

 

//원칙을 따르지 않는경우

public float getTemp() {
	Thermometer thermometer = station.getThermometer();
    return thremometer.getTemperature();
}

//원칙을 따르는 경우
puvlic float getTemp() {
	return station.getTemperature();
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

+ Recent posts