-
[Java] ๋์์ธ ํจํด(Decorator ํจํด)Android/Java 2021. 1. 8. 11:14๋ฐ์ํ
- ์ด ๊ธ์ "์ธํ๋ฐ Java ๋์์ธ ํจํด" ๊ฐ์๋ฅผ ๋ฃ๊ณ ๊ณต๋ถํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ๊ธ์ ์์ฑํ์์ต๋๋ค.
Decorator ํจํด์ด๋?
์์ ํด๋์ค๋ฅผ ์ค์ ์ผ๋ก ์์๊ณผ ํฉ์ฑ์ ์ด์ฉํ์ฌ ํฐ ํด๋์ค๋ฅผ ๋ง๋๋ ํจํด์ ๋๋ค.
์ค์ฌ๋๋ ํด๋์ค๋ ๋ณ๊ฒฝ ์์ด ์ถ๊ฐ ํด๋์ค๋ฅผ ์์ฑํ์ฌ ์์์ ํ๋ฉด์ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๋ ๋ฐฉ์์ ๋๋ค.
๋ชจ๋ฐ์ผ UI ๊ฐ๋ฐ์ ์ฃผ๋ก ๋ง์ด ํ์ฉ๋๋ ์๋ ํจํด์ ๋๋ค.
Decorator ์ฌ์ฉ
public abstract class Widget { public abstract int getColumns(); public abstract int getRows(); public abstract String getRowText(int row); public void show(){ for (int i = 0; i < getRows(); i++) { System.out.println(getRowText(i)); } } }
public class TextWidget extends Widget { private String text; public TextWidget(String text) { this.text = text; } @Override public int getColumns() { return text.length(); } @Override public int getRows() { return 1; } @Override public String getRowText(int row) { return row == 0? text:null; } }
๋ค์์ ๊ธฐ๋ณธ ์ถ์ ํด๋์ค์ธ Widget๊ณผ Widget์ ์์๋ฐ์ TextWidget์ด ์ค์ ๋๋ ํด๋์ค์ ๋๋ค.
TextWidget ํด๋์ค์์๋ ๊ฐ๋จํ text๋ฅผ ์ถ๋ ฅํ๋ ํด๋์ค์ด๊ณ ๋ณ๊ฒฝ์์ด ๋ค๋ฅธ ํด๋์ค์ ์์๊ณผ ํฉ์ฑ๋ง์ผ๋ก ์ถ๊ฐ ๊ธฐ๋ฅ์ ๊ตฌํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
public abstract class Border extends Widget { protected Widget widget; public Border(Widget widget) { this.widget = widget; } }
Border๋ผ๋ ์ถ์ํด๋์ค๋ฅผ ๋ง๋ค์ด์ Widget์ ๋ฉค๋ฒ๋ณ์๋ก ๊ฐ์ง ์ ์๋๋ก ํฉ๋๋ค.
public class SideBorder extends Border { public SideBorder(Widget widget) { super(widget); } @Override public int getColumns() { return widget.getColumns()+2; } @Override public int getRows() { return widget.getRows(); } @Override public String getRowText(int row) { return "("+widget.getRowText(row)+")"; } }
public class FullBorder extends Border{ public FullBorder(Widget widget) { super(widget); } @Override public int getColumns() { return widget.getColumns()+2; } @Override public int getRows() { return widget.getRows()+2; } @Override public String getRowText(int row) { if(row == 0 || row == getRows()-1){ return "+"+makeLine('-',widget.getColumns())+"+"; } return "|"+widget.getRowText(row-1)+"|"; } private String makeLine(char ch, int count){ StringBuilder stringBuilder = new StringBuilder(); for(int i=0;i<count;i++){ stringBuilder.append(ch); } return stringBuilder.toString(); } }
Border๋ฅผ ์์ํ๋ SideBorder์ FullBorder๋ฅผ ํตํด ์ถ๊ฐ ๊ธฐ๋ฅ ํด๋์ค๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
- ๋ฉ์ธ ํด๋์ค์ธ TextWidget์ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ธ FullBorder์ SideBorder๋ฅผ ํตํด ๋ง์ ํ์ฅ์ ํ ์ ์์ต๋๋ค.
๊ฒฐ๊ณผํ๋ฉด
public class Main{ public static void main(String[] args) { new FullBorder( new SideBorder( new FullBorder( new SideBorder( new TextWidget("hello world") ) ) ) ).show(); } }
Main์ ์คํํ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๋ฐ์ํ'Android > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ์๋ฐ ๋ฐ์ดํฐ ํ์ , ๋ณ์ ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ด (0) 2021.01.11 [Java] JVM์ด๋? ์๋ฐ ์ฝ๋ ์คํ (0) 2021.01.11 [Java] ๋์์ธ ํจํด(Adapter ํจํด) (0) 2021.01.07 [Java] ๋์์ธ ํจํด (Singleton ํจํด) (0) 2021.01.05 [Java] ๋์์ธ ํจํด (Factory ํจํด) (0) 2021.01.05