首頁>科技>

目的

在不改變原有程式碼的前提下為原來的方法增加新的能力。

例子程式碼

我今天在朋友圈突然發現了大家會分享自己的 "剪映" 的圖片,不出所料,又是位元組跳動的 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 元,這三種優惠卷的優先順序就是如題目所述,使用者可能都勾選,但是可能只能用到其中一二張,給出使用者總的消費金額,返回使用者真實要支付的金額

最新評論
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 拿獎拿到手軟 小米11款產品獲得「2020德國紅點設計獎」