簡(jiǎn)介
- 裝飾者模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,它允許你在運(yùn)行時(shí)動(dòng)態(tài)地將責(zé)任附加到對(duì)象上,而不會(huì)影響其他對(duì)象。該模式可以在不使用子類繼承的情況下擴(kuò)展對(duì)象的功能。
用途
裝飾者模式的主要用途是在不影響其他對(duì)象的情況下跋核,動(dòng)態(tài)地為對(duì)象添加新的行為岖瑰。例如,在一個(gè)系統(tǒng)中有一個(gè)基本的對(duì)象砂代,我們可以使用裝飾者模式來為該對(duì)象添加新的功能或行為蹋订,這樣可以保證對(duì)象的原有功能不受影響,同時(shí)也不需要修改基本對(duì)象的代碼刻伊。
另一個(gè)常見的用途是在復(fù)雜的繼承結(jié)構(gòu)中露戒,使用裝飾者模式來代替繼承。繼承在一定程度上增加了代碼的復(fù)雜性捶箱,而且一旦繼承結(jié)構(gòu)變得太深智什,就很難進(jìn)行維護(hù)和擴(kuò)展。裝飾者模式可以幫助我們避免這種問題丁屎,因?yàn)樗试S我們?cè)谶\(yùn)行時(shí)動(dòng)態(tài)地為對(duì)象添加新的行為荠锭,而不需要?jiǎng)?chuàng)建大量的子類。
應(yīng)用場(chǎng)景
- 動(dòng)態(tài)地給對(duì)象添加新的行為晨川,而不影響其他對(duì)象证九。
- 避免使用大量的子類繼承來擴(kuò)展對(duì)象的功能。
- 在不改變?cè)写a的情況下共虑,為對(duì)象添加新的行為愧怜。
- 用于構(gòu)建具有復(fù)雜功能的對(duì)象。
代碼
以下為動(dòng)態(tài)給coffee添加屬性的代碼,通過給接口不添加裝飾者實(shí)現(xiàn)更多的功能
public class Test {
public static void main(String[] args) throws IOException, XMLParserException, InvalidConfigurationException, SQLException, InterruptedException {
Coffee coffee = new SimpleCoffee();
coffee = new Milk(coffee);
coffee = new Sugar(coffee);
System.out.println(coffee.getCost());
System.out.println(coffee.getDescription());
}
}
// 定義咖啡接口
interface Coffee {
double getCost();
String getDescription();
}
// 實(shí)現(xiàn)簡(jiǎn)單的咖啡類
class SimpleCoffee implements Coffee {
@Override
public double getCost() {
return 1.0;
}
@Override
public String getDescription() {
return "Simple coffee";
}
}
// 定義裝飾者類
abstract class CoffeeDecorator implements Coffee {
protected Coffee decoratedCoffee;
public CoffeeDecorator(Coffee coffee) {
this.decoratedCoffee = coffee;
}
public double getCost() {
return decoratedCoffee.getCost();
}
public String getDescription() {
return decoratedCoffee.getDescription();
}
}
// 實(shí)現(xiàn)具體的裝飾者類:牛奶
class Milk extends CoffeeDecorator {
public Milk(Coffee coffee) {
super(coffee);
}
public double getCost() {
return super.getCost() + 0.5;
}
public String getDescription() {
return super.getDescription() + ", milk";
}
}
// 實(shí)現(xiàn)具體的裝飾者類:糖
class Sugar extends CoffeeDecorator {
public Sugar(Coffee coffee) {
super(coffee);
}
public double getCost() {
return super.getCost() + 0.2;
}
public String getDescription() {
return super.getDescription() + ", sugar";
}
}