策略模式,多用組合,少用繼承

將需要變化的部分隔離出來,不要與不需要變化的混在一起
eg:某一個行為(吃瓜),不同的子類實(shí)現(xiàn)不同的吃瓜方式
方式一,直接繼承父類:
父類(人),吃瓜waterMelon();
由于每個人的吃相不一樣,分別override吃瓜的方法,這樣一來,需要重寫的方法太多
子類1重寫吃瓜方法waterMelon(){
吃瓜方法1
};
子類2重寫吃瓜方法waterMelon(){
吃瓜方法3
};
子類3重寫吃瓜方法waterMelon(){
吃瓜方法3
};
另一方面,還有一個弊端,有的人吃瓜過敏,但是同樣要繼承父類的吃瓜行為,然而他不能吃瓜,形成bug隱患
方式二,提出接口:
父類(人),吃瓜waterMelon();
提出waterMelon()作為接口WaterMelon的方法,有吃瓜愛好的人實(shí)現(xiàn)該接口,過敏者不實(shí)現(xiàn)
子類1實(shí)現(xiàn)吃瓜方法waterMelon(){
吃瓜方法1
};
子類2實(shí)現(xiàn)吃瓜方法waterMelon(){
吃瓜方法2
};
子類3不實(shí)現(xiàn)該接口
這樣寫會減少很多代碼,也使得繼承結(jié)構(gòu)更有邏輯性
但是,仍然存在弊端:
假如現(xiàn)在有100個人,其中有80人的吃瓜方式一樣,于是,必須寫80個waterMelon()相同的方法(實(shí)現(xiàn)接口必須重寫方法),
造成代碼的嚴(yán)重重復(fù)
方式三,提出吃瓜行為的接口WaterMelon,提出不同吃瓜方法的實(shí)現(xiàn)類
WaterMelon_1 implements WaterMelon{
waterMelon(){
吃瓜方法1
}
}
WaterMelon_2 implements WaterMelon{
waterMelon(){
吃瓜方法2
}
}
WaterMelon_3 implements WaterMelon{
waterMelon(){
不吃瓜
}
}
1.將WaterMelon w 作為父類的成員變量,
2.子類根據(jù)不同的需求進(jìn)行初始化,eg:WaterMelon w=new WaterMelon_2()
3.執(zhí)行waterMelon()方法,w.waterMelon()
這樣只用根據(jù)吃瓜方式的不同撰寫幾個實(shí)現(xiàn)類即可