ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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์„ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋ฐ˜์‘ํ˜•
Designed by Tistory.