前言:
? ?? ? 什么是裝飾者模式:
? ?? ?? ?? ?? ?? ?? ?在不改變原類和繼承的情況下動(dòng)態(tài)的擴(kuò)展對象的功能.通過包裝一個(gè)對象(類)來實(shí)現(xiàn)一個(gè)新的具有原來對象相同接口的對象(類).
裝飾者模式的特點(diǎn):
1.? ? 在不改變原有對象的原本的結(jié)構(gòu)上進(jìn)行功能的添加.
2.? ? 裝飾對象和原對象都實(shí)現(xiàn)了相同的接口.可以使用于原有對象的方式使用裝飾對象.
3.? ? 裝飾對象中包含原有對象.即裝飾對象是真的的原始對象經(jīng)過包裝之后的對象.
使用環(huán)境:
1.? ? 在不影響其他對象的情況下.以動(dòng)態(tài).透明的方式給單個(gè)對象題添加職責(zé).
2.? ? 處理那些可以撤銷的職責(zé).
3.? ? 當(dāng)不您呢個(gè)采用生成子類的方法進(jìn)行擴(kuò)充的時(shí).一種情況是可能大量獨(dú)立的擴(kuò)展.為支持每一種擴(kuò)展將產(chǎn)生大量的之類.使得之類的數(shù)量呈爆炸性增長.另一中情況是因?yàn)槎x的類被隱藏.或是不能用于生成子類.
參與者:
1.? ? 被裝飾的對象基類.
2.? ? 被裝飾的對象.
3.? ? 裝飾者抽象類
4.? ? 具體的裝飾者
代碼:
// 基類 接口或者是抽象類??會被 被原始對象或是裝飾對象繼承或是實(shí)現(xiàn)
public interface Person {
? ? void eat();
}
// 原始對象??實(shí)現(xiàn)基類的接口
public class Man implements Person {
? ? public void eat() {
? ? ? ? System.out.println("男人在吃");
? ? }
}
// 裝飾者的抽象類 實(shí)現(xiàn)基類接口
public abstract class Decorator implements Person {
? ? protected Person person;
? ? public void setPerson(Person person) {
? ? ? ? this.person = person;
? ? }
? ? public void eat() {
? ? ? ? person.eat();
? ? }
}
//裝飾者 繼承裝飾者的抽象類.而抽象類實(shí)現(xiàn)了基類接口那么 此類中也相當(dāng)于繼承了 基類中的方法
public class ManDecoratorA extends Decorator {
? ? public void eat() {
? ? ? ? super.eat();
? ? ? ? reEat();
? ? ? ? System.out.println("ManDecoratorA類");
? ? }
? ? public void reEat() {
? ? ? ? System.out.println("再吃一頓飯");
? ? }
}
public class extends Decorator {
? ? public void eat() {
? ? ? ? super.eat();
? ? ? ? System.out.println("===============");
? ? ? ? System.out.println("ManDecoratorB類");
? ? }
}
// 測試類
public class Test {
? ? public static void main(String[] args) {
? ? ? ? Man man = new Man();
? ? ? ? ManDecoratorA md1 = new ManDecoratorA();
? ? ? ? ManDecoratorB md2 = new ManDecoratorB();
? ? ? ? md1.setPerson(man);
? ? ? ? md2.setPerson(md1);
? ? ? ? md2.eat();
? ? }
}
總結(jié): 動(dòng)態(tài)的將功能附加到對象上.想要擴(kuò)展功能.裝飾者是有別于繼承的另一種選擇.
