基本定義裝飾者模式屬于結(jié)構(gòu)型模式,它可以動(dòng)態(tài)的將新功能附加到對(duì)象上,同時(shí)又不改變其結(jié)構(gòu)。在對(duì)象功能擴(kuò)展方面,它比繼承更有彈性,裝飾者模式也體現(xiàn)了開閉原則(OCP)。 模式結(jié)構(gòu)
舉例說明
「實(shí)體類」 Coffee public abstract class Coffee{
public String des = "咖啡"; //描述
private float price = 0.0f; //價(jià)格
protected abstract float cost(); //計(jì)算費(fèi)用
//省略getter setter方法
}「被裝飾者」LatteCoffee public class LatteCoffee extends Coffee{
public LatteCoffee() {
setDes("拿鐵咖啡");
setPrice(4.5f);
}
@Override
protected float cost() {
return getPrice();
}
}「被裝飾者」MochaCoffee public class MochaCoffee extends Coffee {
public MochaCoffee() {
setDes("摩卡咖啡");
setPrice(5.5f);
}
@Override
protected float cost() {
return getPrice();
}
}「抽象裝飾者」Decorator public class Decorator extends Coffee {
private Coffee coffee;
public Decorator(Coffee drink) {
this.coffee = drink;
}
@Override
protected float cost() {
return getPrice() + coffee.cost();
}
@Override
public String getDes() {
return coffee.getDes() + "加" + super.getDes();
}
}「具體裝飾者」SugarDecorator public class SugarDecorator extends Decorator{
public SugarDecorator(Coffee coffee) {
super(coffee);
setDes("糖");
setPrice(1.0f);
}
}「具體裝飾者」MilkDecorator public class MilkDecorator extends Decorator{
public MilkDecorator(Coffee coffee) {
super(coffee);
setDes("牛奶");
setPrice(2.0f);
}
}「測(cè)試類」Client public class Client {
/**
* 點(diǎn)一杯 加兩份糖一份牛奶的摩卡咖啡
*/
@Test
public void test01() {
Coffee order = new MochaCoffee();
System.out.println(order.getDes() + ",價(jià)格:" + order.cost());
//加兩份糖
order = new SugarDecorator(new SugarDecorator(order));
System.out.println(order.getDes() + ",價(jià)格:" + order.cost());
//加一份牛奶
order = new MilkDecorator(order);
System.out.println(order.getDes() + ",價(jià)格:" + order.cost());
}
}「結(jié)果」result 摩卡咖啡,價(jià)格:5.5 摩卡咖啡加糖加糖,價(jià)格:7.5 摩卡咖啡加糖加糖加牛奶,價(jià)格:9.5 在 Java IO 流中的應(yīng)用
在上圖所示的關(guān)系中
具體使用如下: BufferedInputStream bis = new BufferedInputStream(new FileInputStream("G:\\a.txt"));裝飾者模式總結(jié)1、利用繼承設(shè)計(jì)子類,只能在編譯時(shí)靜態(tài)決定,并且所有子類都會(huì)繼承相同的行為;利用組合擴(kuò)展對(duì)象,就可以在運(yùn)行時(shí)動(dòng)態(tài)的進(jìn)行擴(kuò)展。 2、裝飾者和被裝飾者對(duì)象有相同的超類型,所以在任何需要原始對(duì)象(被裝飾者)的場(chǎng)合,都可以用裝飾過的對(duì)象代替原始對(duì)象。 3、可以用一個(gè)或多個(gè)裝飾者包裝一個(gè)對(duì)象(被裝飾者)。 4、裝飾者可以在所委托的裝飾者行為之前或之后加上自己的行為,以達(dá)到特定的目的。 5、被裝飾者可以在任何時(shí)候被裝飾,所以可以在運(yùn)行時(shí)動(dòng)態(tài)地、不限量地用你喜歡的裝飾者來裝飾對(duì)象。 6、裝飾者會(huì)導(dǎo)致出現(xiàn)很多小對(duì)象,如果過度使用,會(huì)讓程序變得復(fù)雜。 |
|
|