目的
在不改變原有程式碼的前提下為原來的方法增加新的能力。
例子程式碼
我今天在朋友圈突然發現了大家會分享自己的 "剪映" 的圖片,不出所料,又是位元組跳動的 APP, 只要是娛樂方向 APP, 只有你想不到, 沒有位元組跳動沒做的。
8 週年一鳴又要提高員工的幸福度又要進軍教育了,“讓天下沒有難辦的教育” 馬上就要成為目標了......
我大概看了看視訊,剪映大概是個視訊剪輯或渲染工具,最近很紅的好像是個 “手拿花花”,大概是這個樣子:
所以呢, 這種類似於視訊或者圖片的修剪,確實是裝飾器模式最好的例子,我們以圖片為例,可以先假設普通的方法來實現這個功能, 那麼大概是這樣:
//使用者先放了一個手Hand hand = new Hand();//使用者建立了綠葉HandWithLeaf handWithLeaf = new HandWithLeaf();handWithLeaf.setHand(hand);//使用者建立完綠葉又建立了花HandWithLeafAndFlower = new HandWithLeafAndFlower();............
問題分析
上面程式碼的問題顯而易見。一個是類太多了, HandWithLeafAndFlower 是個類,如果使用者先放花後放綠葉 那HandWithFlowerAndFlower 又是一個類了。
裝飾器模式
我們先定義一個介面來代表展示圖片:
public interface Component { String showPicture();}
再來定義一個基礎類, 就是手:
public class Hand implements Component { @Override public String showPicture() { return "展示纖纖玉手"; }}
定義一個裝飾器的基類:
public abstract class Decorator implements Component { protected Component component; public Decorator(Component component) { this.component = component; }}
定義幾個裝飾器:
花裝飾器:
public class FlowDecorator extends Decorator { public FlowDecorator(Component component) { super(component); } @Override public String showPicture() { return component.showPicture() + "加上鮮花"; }}
葉子裝飾器:
public class LeafDecorator extends Decorator { public LeafDecorator(Component component) { super(component); } @Override public String showPicture() { return component.showPicture() + "加上綠色葉子"; }}
音樂裝飾器:
public class MusicDecorator extends Decorator { public MusicDecorator(Component component) { super(component); } @Override public String showPicture() { return component.showPicture() + "加上播放音樂"; }}
然後看下效果:
public class App { public static void main(String[] args) { Component hand = new Hand(); System.out.println(new MusicDecorator(new LeafDecorator(new FlowDecorator(hand))).showPicture()); }}
輸出:
展示纖纖玉手加上鮮花加上綠色葉子加上播放音樂
類圖:
課後作業
1. 如果我們需要定義一個銀行首頁,本來的物件叫做 indexVo,如果是新手要在右上方展示新手圖片,如果是逾期使用者要把背景色變紅, 如果是 VIP 使用者要播放音樂, 請使用裝飾器模式實現
2. 有幾種優惠卷,一種是打 5 折,一種是減免 20 元,一種是消費滿 40 減 5 元,滿 100 減 15 元,這三種優惠卷的優先順序就是如題目所述,使用者可能都勾選,但是可能只能用到其中一二張,給出使用者總的消費金額,返回使用者真實要支付的金額
最新評論