๋ฐฑ์—”๋“œ(Back-End) ๊ฐœ๋ฐœ/Java

[JAVA] ๋””์ž์ธ ํŒจํ„ด - ๋ธŒ๋ฆฟ์ง€ ํŒจํ„ด(Bridge)

rabo93 2025. 5. 28. 13:17

๋ธŒ๋ฆฟ์ง€ ํŒจํ„ด(Bridge Pattern)

  • ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค์™€ ๊ตฌํ˜„์„ ๋‹ด๋‹นํ•˜๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ๊ตฌ๋ณ„
  • ๋ธŒ๋ฆฌ์ง€ ํŒจํ„ด์€ ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜์—ฌ ๊ธฐ์กด ํ”„๋กœ๊ทธ๋žจ์˜ ๋ณ€๊ฒฝ ์—†์ด ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Œ

⇒ ์‚ฌ์šฉ ์˜ˆ์‹œ

  • ๊ธฐ์กด ์‹œ์Šคํ…œ์— ๋ถ€์ˆ˜์ ์ธ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ๋“ค์„ ์ง€์†์ ์œผ๋กœ ์ถ”๊ฐ€ํ•  ๋•Œ
  • ๋ถ€๋ชจ ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ๊ธฐ๋ณธ ๊ทœ์น™ ์„ธํŠธ๋ฅผ ์ •์˜ํ•˜๊ณ , ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค๊ฐ€ ์ถ”๊ฐ€ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ
  • ๋‹ค์–‘ํ•œ UI API ๊ตฌํ˜„, ๊ทธ๋ž˜ํ”ฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ

⇒ ์žฅ์ 

  • ํด๋ž˜์Šค ๊ณ„์ธต์„ ๋ถ„๋ฆฌํ•  ๋–„ ์™„์ „ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฒฐํ•ฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„๊ณผ ์ถ”์ƒ ๋ถ€๋ถ„ 2๊ฐœ์˜ ๊ณ„์ธต์œผ๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ , ๋ถ„๋ฆฌ๋œ 2๊ฐœ์˜ ์ถ”์ƒ ๊ณ„์ธต๊ณผ ๊ตฌํ˜„ ๊ณ„์ธต์€ ๋…๋ฆฝ์ ์ธ ํ™•์žฅ์ด ๊ฐ€๋Šฅ
  • ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ง€ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ธฐ๋Šฅ์„ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ธฐ๋Šฅ์„ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ˆจ๊ธธ ์ˆ˜ ์žˆ๋Š” ์€๋‹‰ ํšจ๊ณผ๋„ ์–ป์Œ

⇒ ๋‹จ์ 

  • ์ถ”์ƒํ™”๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•  ๊ฒฝ์šฐ ์ฝ”๋“œ ๋””์ž์ธ ์„ค๊ณ„๊ฐ€ ๋ณต์žกํ•ด์ง„๋‹ค

⇒ ๋”ฐ๋ผ์„œ!

๊ฐ์ฒด๋ฅผ ๊ตฌํ˜„ ์ธํ„ฐํŽ˜์ด์Šค / ์ถ”์ƒ ํด๋ž˜์Šค ๋ถ„๋ฆฌ

                                       ใ„ด ํ™•์žฅ

                                       ใ„ด ํ™•์žฅ

                                         ...

// ------- ๋ฆฌ๋ชจ์ฝ˜ ์ถ”์ƒ ํด๋ž˜์Šค (๋ถ€๋ชจ) -------
public abstract class Remote {
	
	// ์˜์กด์„ฑ ์ถ”๊ฐ€
	protected final Device device;
	public Remote(Device device) {
		this.device = device;
	}
	
	public abstract void power();
	
}

//---------- ๋””๋ฐ”์ด์Šค ์ธํ„ฐํŽ˜์ด์Šค -----------
public interface Device {
	void on(); //์ผœ๋Š” ๋ฉ”์„œ๋“œ
	void off(); //๋„๋Š” ๋ฉ”์„œ๋“œ
	boolean isOn(); //์ผœ์ ธ์žˆ๋Š”์ง€ ์ƒํƒœ
	void runApp(String App); //App์— ๋”ฐ๋ฅธ ์ž‘๋™ ๋ฉ”์„œ๋“œ
}


//--------- ํ™•์žฅ๋œ ๋ฆฌ๋ชจ์ฝ˜ ์ถ”์ƒํ™” ํด๋ž˜์Šค  ----------
//์ผ๋ฐ˜๋ฆฌ๋ชจ์ฝ˜
public class BasicRemote extends Remote {
	public BasicRemote(Device device) {
		super(device);
	}
	
	// ์ถ”์ƒํด๋ž˜์Šค ์˜ค๋ฒ„๋ผ์ด๋”ฉ
	@Override
	public void power() {
		if(device.isOn()) {
			device.off();
		} else {
			device.on();
		}
	}
}

//์Šค๋งˆํŠธ๋ฆฌ๋ชจ์ฝ˜
class SmartRemote extends Remote {
	public SmartRemote(Device device) {
		super(device);
	}
	
	@Override
	public void power() {
		if(device.isOn()) {
			device.off();
		} else {
			device.on();
		}
	}
	
	public void runApp(String app) {
		device.runApp(app);
	}
	
}


//--------- ๋””๋ฐ”์ด์Šค ๊ตฌํ˜„ ----------
// TV
public class TV implements Device {
	
	private boolean on = false;
	
	@Override
	public void on() {
		on = true;
		System.out.println("TV is on");
	}

	@Override
	public void off() {
		on = false;
		System.out.println("TV is off");
	}

	@Override
	public boolean isOn() {
		return on;
	}

	@Override
	public void runApp(String App) {
		if(isOn()) {
			System.out.println("TV Run App " + App);
		} else {
			System.out.println("TV is not on");
		}
	}
	
}

// ...๋‹ค๋ฅธ ๋””๋ฐ”์ด์Šค๋“ค ๋‚ด๋ถ€ ์ฝ”๋“œ๋Š” ๊ฐ™์œผ๋ฏ€๋กœ ์ƒ๋žต





// ---------- ๋ฉ”์ธ ํด๋ž˜์Šค (๋Ÿฐํƒ€์ž„) -----------------
public class main {
	public static void main(String[] args) {
		Device tv = new TV();
		Remote basicRemote = new BasicRemote(tv);
		basicRemote.power();
		
		SmartRemote smartRemote = new SmartRemote(tv);
		smartRemote.power();
		smartRemote.runApp("Youtube");
		
		smartRemote.power();
		smartRemote.runApp("Netplix");
		
	}
}