Apabila kita ingin menambah baik atau mempertingkatkan kefungsian sesuatu objek, tetapi tidak mahu mewarisi kelas dan mencipta subkelas, kita boleh mempertimbangkan untuk menggunakan mod hiasan.
Menggunakan mod hiasan untuk meningkatkan fungsi tertentu objek adalah lebih fleksibel daripada menjana subkelas dan kemudian meningkatkannya.
1) Komponen abstrak: Tentukan kelas abstrak yang mentakrifkan kaedah yang "penghias" perlu "dihias"
2 ) Konkrit komponen: subkelas komponen abstrak. Menjadi "kelas berhias"
3) Komponen hiasan: Ia juga merupakan subkelas komponen abstrak. Kelas ini memegang rujukan kepada "penghias" dan digunakan untuk memanggil kaedah penghias. Ia boleh menjadi kelas abstrak atau kelas bukan abstrak.
4) Kelas hiasan konkrit: Ia merupakan subkelas komponen hiasan, dipanggil "penghias"
1) Komponen abstrak
/** * 抽象组件,定义了被装饰类需要装饰的方法 */ public abstract class ICake { /** * 需要装饰的方法 * @return */ public abstract int getPrice(); }
2) Orang yang dihias
/** * 被装饰者,是抽象组件的一个子类,定义需要被装饰的方法 */ public class Cake extends ICake { /** * 被装饰类中,装饰方法的基本实现 * @return */ @Override public int getPrice() { System.out.println("getPrice"); return 100; } }
3) Kelas hiasan
/** * 装饰类,也是抽象组件的一个子类。 * 可以是抽象类,也可以是非抽象类。 */ public abstract class CakeDecorator extends ICake { /** * 被装饰类的引用,需要在装饰类中,调用到被装饰类的方法。 */ ICake cake; public CakeDecorator(ICake cake){ this.cake = cake; } }
4) Hiasan khusus
/** * 具体装饰类 */ public class BlueBerryCake extends CakeDecorator { public BlueBerryCake(ICake cake) { super(cake); } /** * 被装饰的方法 * 在调用到被装饰类的基础方法后,还要调用装饰类要增强的方法 * @return */ @Override public float getPrice(){ return cake.getPrice()+elsePrice(); } /** * 增强的方法 * @return */ private float elsePrice(){ System.out.println("else getPrice"); return 50; } }
5) Kelas ujian
public class TestDecorator { public static void main(String args[]){ ICake cake = new Cake(); CakeDecorator decorater = new BlueBerryCake(cake); float price = decorater.getPrice(); System.out.println(price); } }
1) Peningkatan kaedah tertentu juga boleh dicapai dengan menggunakan warisan subkelas. Berbanding dengan melaksanakan melalui mod hiasan, apakah kelebihan mod hiasan?
Penghias dan penghias digandingkan secara longgar. Kelas hiasan hanya bergantung pada komponen abstrak Kelas hiasan hanya perlu mengetahui bahawa kelas yang dihias adalah subkelas komponen abstrak, tanpa mengetahui subkelas itu.
Mod hiasan memenuhi "prinsip buka-tutup", dan anda boleh menambah kelas hiasan untuk komponen tanpa mengubah suai komponen tertentu.
Banyak kelas dalam pakej java.IO menggunakan mod hiasan.
Pembaca
Pembaca Fail
Pembaca Bufferd
Atas ialah kandungan terperinci Apakah prinsip dan kaedah pelaksanaan corak hiasan dalam corak reka bentuk Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!