概念
- 在不改變原類文件以及不使用繼承的情況下,動態(tài)地將責(zé)任附加到對象上,從而實現(xiàn)動態(tài)拓展的功能.它是通過創(chuàng)建一個包裝對象,也就是裝飾來包裹真實的對象.
設(shè)計原則
- 要使用裝飾者模式,需要滿足以下設(shè)計原則
* 多用組合,少用繼承
* 開放_關(guān)閉原則:類應(yīng)該對拓展開放,對修改關(guān)閉.
下面以漢堡為例
public interface Hanbeger {
//價錢
public float price();
//名字
public String name();
}
//被裝飾者
public class GoldHanbeger implements Hanbeger{
@Override
public float price() {
return 10;
}
@Override
public String name() {
return "黃金饅頭";
}
}
public abstract class peicai implements Hanbeger{
private Hanbeger hanbeger;
public peicai(Hanbeger h){
this.hanbeger = h;
}
@Override
public String name() {
return this.hanbeger.name();
}
@Override
public float price() {
return this.hanbeger.price();
}
}
public class Shengcai extends peicai{
public Shengcai(Hanbeger h) {
super(h);
}
@Override
public float price() {
return super.price()+5;
}
@Override
public String name() {
return super.name()+"加生菜";
}
}
//牛肉
public class Beff extends peicai {
public Beff(Hanbeger h) {
super(h);
}
@Override
public String name() {
return super.name()+"加牛肉";
}
@Override
public float price() {
return super.price()+20;
}
}
public class Text {
public static void main(String[] args) {
GoldHanbeger gold = new GoldHanbeger();
System.out.println(gold.name()+"價錢" + gold.price());
//牛肉漢堡
Beff beff = new Beff(gold);
System.out.println(beff.name()+"價錢" + beff.price());
//牛肉生菜漢堡
Shengcai shencai = new Shengcai(beff);
System.out.println(shencai.name() + "價錢" + shencai.price());
}
}
我對于這種模式理解是這樣的:這就像是做菜一樣,我先要確定要做什么,要有一個大致方向,在漢堡的例子里,我先確定了我要的是漢堡,這就需要定義一個漢堡接口,因為這是基本.那么在漢堡中又有很多分類像是雞腿堡 鰻魚堡 黃金漢堡之類的,在這里我選的是黃金漢堡.當(dāng)然黃金漢堡是一個實現(xiàn)漢堡接口的類.在有了最基本的漢堡之后我們就需要加入一些配菜了,配菜是一個類,那么配菜也有很多種類 像是生菜 牛肉 芥末之類的,在寫具體的配菜時需要繼承配菜類,因為這些都屬于配菜.最后就是一個測試類了,如下是運行結(jié)果:
黃金饅頭價錢10.0
黃金饅頭加牛肉價錢30.0
黃金饅頭加牛肉加生菜價錢35.0