昨天面試Java後端被問到代理模式、裝飾模式,其中裝飾模式,記得是子類不斷裝飾(添加功能),但具體結構忘記了- -!
ps:遇到的面試官還好,這個模式沒答上沒有深究。java
回家趕忙翻大話設計模式查閱。面試
裝飾模式(Decorator):動態地給一個對象添加一些額外的職責,就增長功能來講,裝飾模式比生成子類更靈活。後端
定義基礎裝飾類,包含被裝飾類屬性、設置屬性的裝飾方法、定義功能方法調用被裝飾類的功能方法設計模式
具體各裝飾類,繼承自基礎裝飾類,重寫功能方法,調用父類的方法和添加特有的功能ide
/** * @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(); } }