裝飾模式指的是在沒必要改變原類文件和使用繼承的狀況下,動態地擴展一個對象的功能。它是經過建立一個包裝對象,也就是裝飾來包裹真實的對象。編程
模型:微信
舉個例子:好比一個正在上高中的學生「小明」在考完試後,和父母說想買一款5000元的手機。架構
1.Component,抽象方法-買手機ide
public abstract class AbstractBuyPhone { //主要是向父母提出想買手機的意向 public abstract void BuyPhone(); //父母是否贊成 public abstract void Agree(); }
2.ConcreteComponent:具體的意向this
public class XiaoMingBuyPhone extends AbstractBuyPhone { @Override public void BuyPhone() { Log.d("qzs","我想買一款華爲的5000元的手機"); } @Override public void Agree() { Log.d("qzs","父母贊成了"); } }
3.Decorator,增長一個裝飾抽象類,方便修飾spa
public class AbstractDecorator extends AbstractBuyPhone { private AbstractBuyPhone abstractBuyPhone; public AbstractDecorator ( AbstractBuyPhone abstractBuyPhone){ this.abstractBuyPhone=abstractBuyPhone; } @Override public void BuyPhone() { this.abstractBuyPhone.BuyPhone(); } @Override public void Agree() { this.abstractBuyPhone.Agree(); } }
4.ConcreteDecorator:若是直接去找父母要手機,很容易被拒絕,因此須要修飾一下,這裏用成績修飾一下設計
public class ScoreDecortator extends AbstractDecorator { public ScoreDecortator(AbstractBuyPhone abstractBuyPhone) { super(abstractBuyPhone); } //先和父母說說本身的成績 private void ShowScore(){ Log.d("qzs","我此次考試的成績年級前三,又進步了"); } //重寫買手機的方法,先彙報成績,而後再提買手機的事情 @Override public void BuyPhone() { this.ShowScore(); super.BuyPhone(); } }
5.調用,也就是請求父母:code
AbstractBuyPhone str; //小明的本來意向 str=new XiaoMingBuyPhone(); //修飾後的意向 str=new ScoreDecortator(str); //向父母提出想法(成績和買手機) str.BuyPhone(); //父母贊成了 str.Agree();
運行結果:對象
強調:這裏只加了分數的修飾,能夠加多個修飾類來知足你最後的目的繼承
1.優勢
2.缺點
3.適用場景
定義和優缺點來自網上百度信息
另外能夠加入個人Android技術交流羣:458739310
你們能夠關注個人微信公衆號:「安卓乾貨鋪」一個有質量、有態度的公衆號!