裝飾模式

昨天面試Java後端被問到代理模式裝飾模式,其中裝飾模式,記得是子類不斷裝飾(添加功能),但具體結構忘記了- -!
ps:遇到的面試官還好,這個模式沒答上沒有深究。java

回家趕忙翻大話設計模式查閱。面試

定義

裝飾模式(Decorator):動態地給一個對象添加一些額外的職責,就增長功能來講,裝飾模式比生成子類更靈活。後端

類圖

實現要點

  • 定義基礎裝飾類,包含被裝飾類屬性、設置屬性的裝飾方法、定義功能方法調用被裝飾類的功能方法設計模式

  • 具體各裝飾類,繼承自基礎裝飾類,重寫功能方法,調用父類的方法和添加特有的功能ide

Java示例

/**
 * @author cdfive
 * @date 2019-04-01
 */
public class DecoratorDemo {

    private static class Person {
        private String name;

        public Person() {
        }

        public Person(String name) {
            this.name = name;
        }

        public void show() {
            System.out.println(String.format("裝扮的%s", name));
        }
    }

    private static class Finery extends Person {

        protected Person person;

        public void decorate(Person person) {
            this.person = person;
        }

        @Override
        public void show() {
            if (person != null) {
                person.show();
            }
        }
    }

    private static class TShirts extends Finery {
        @Override
        public void show() {
            System.out.print("大T恤 ");
            super.show();
        }
    }

    private static class TXue extends Finery {
        @Override
        public void show() {
            System.out.print("大T恤 ");
            super.show();
        }
    }

    private static class Xizhuang extends Finery {
        @Override
        public void show() {
            System.out.print("西裝 ");
            super.show();
        }
    }

    private static class NiuZai extends Finery {
        @Override
        public void show() {
            System.out.print("牛仔 ");
            super.show();
        }
    }

    private static class LingDai extends Finery {
        @Override
        public void show() {
            System.out.print("領帶 ");
            super.show();
        }
    }

    private static class QiuXie extends Finery {
        @Override
        public void show() {
            System.out.print("球鞋 ");
            super.show();
        }
    }

    private static class PiXie extends Finery {
        @Override
        public void show() {
            System.out.print("皮鞋 ");
            super.show();
        }
    }

    public static void main(String[] args) {
        Person person = new Person("張三");

        System.out.println("-----第一種裝扮-----");
        TXue tXue = new TXue();
        NiuZai niuZai = new NiuZai();
        QiuXie qiuXie = new QiuXie();

        tXue.decorate(person);
        niuZai.decorate(tXue);
        qiuXie.decorate(niuZai);
        qiuXie.show();

        System.out.println("-----第二種裝扮-----");
        Xizhuang xizhuang = new Xizhuang();
        LingDai lingDai = new LingDai();
        PiXie piXie = new PiXie();
        xizhuang.decorate(person);
        lingDai.decorate(xizhuang);
        piXie.decorate(lingDai);
        piXie.show();

        System.out.println("-----第三種裝扮-----");
        piXie.decorate(person);
        niuZai.decorate(piXie);
        tXue.decorate(niuZai);
        tXue.show();
    }
}
相關文章
相關標籤/搜索