裝飾設(shè)計(jì)模式是在不改變原類和使用繼承的情況下赋续,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對象的功能逞姿,它是通過創(chuàng)建一個(gè)包裝對象红淡,也就是通過裝飾來包裹真實(shí)的對象庐舟。
使用裝飾者模式的時(shí)候需要注意以下幾點(diǎn)內(nèi)容:
(1)裝飾對象和真實(shí)對象有相同的接口队贱。這樣客戶端對象就可以和裝飾對象交互色冀。
(2)裝飾對象包含一個(gè)真實(shí)對象的引用。
(3)裝飾對象接受所有來自客戶端的請求柱嫌,并把這些請求轉(zhuǎn)發(fā)給真實(shí)的對象锋恬。
(4)裝飾對象可以在轉(zhuǎn)發(fā)這些請求以前或以后增加一些附加功能。這樣就確保了在運(yùn)行時(shí)编丘,不用修改給定的對象的結(jié)構(gòu)就可以在外部增加附加功能与学。彤悔、
好,我們來看代碼是怎樣設(shè)計(jì)的索守。
定義一個(gè)公共接口:
public interface IDress {
void dress();
}
定義一個(gè)抽象公共類晕窑,并實(shí)現(xiàn)IDress接口。
public abstract class AbstractDress implements IDress{
private IDress aIDess;
public AbstractDress(IDress aIDess) {
this.aIDess = aIDess;
}
public void dress() {
if(aIDess != null){
aIDess.dress();
}
}
}
好卵佛,基本的設(shè)施已經(jīng)創(chuàng)建完了杨赤,現(xiàn)在我們來實(shí)現(xiàn)需要裝飾的對象:
public class Person implements IDress {
private String name;
public Person(String name){
this.name = name;
}
public void dress() {
System.out.println(name + "開始穿衣服");
}
}
接下來實(shí)現(xiàn)兩個(gè)修飾類,當(dāng)然需要繼承AbstractDress 抽象類。
修飾類A
public class DressA extends AbstractDress{
public DressA(IDress aIDess) {
super(aIDess);
}
public void dress() {
super.dress();
System.out.println("穿上衣");
}
}
修飾類B
public class DressB extends AbstractDress{
public DressB(IDress aIDess) {
super(aIDess);
}
public void dress() {
super.dress();
System.out.println("穿褲子");
}
}
到這里工作就結(jié)束了截汪,代碼很簡單疾牲,現(xiàn)在我們來測試下:
public class Text {
public static void main(String...strings){
Person person = new Person("麥兜");
DressA a = new DressA(person);
DressB b = new DressB(a);
b.dress();
}
}
麥兜開始穿衣服
穿上衣
穿褲子
筆者能力有限,不足之處歡迎指出衙解!