iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0

介紹

讀完狀態模式後,發覺跟裝飾模式有一點類似
如果用稱號來說,裝飾模式可以加很多上去
但是狀態模式只有一個狀態,依照特定的值來改變

狀態模式實作

  1. 建立會員等級介面
public interface Level {
    String status(Member member);
}
  1. 建立會員類別
public class Member {
    private String name;
    private BigDecimal money;
    private Level level;

    public Member() {
        money = BigDecimal.ZERO;
        level = new Copper();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public BigDecimal getMoney() {
        return money;
    }

    public void setMoney(BigDecimal money) {
        this.money = money;
    }

    public void addMoney(BigDecimal money) {
        this.money = this.money.add(money);
    }

    public Level getLevel() {
        return level;
    }

    public void setLevel(Level level) {
        this.level = level;
    }

    public String checkout() {
        StringBuilder text;
        text = new StringBuilder();
        text.append("結帳完成");
        text.append(" / ");
        text.append("會員名稱:");
        text.append(name);
        text.append(" / ");
        text.append("累計銷費金額:");
        text.append(this.money.toPlainString());
        text.append(" / ");
        text.append("會員狀態:");
        text.append(this.level.status(this));
        return text.toString();
    }
}
  1. 建立銅會員,最基礎的會員
    累計消費五百,可以升等銀會員
public class Copper implements Level {
    @Override
    public String status(Member member) {
        StringBuilder text;
        text = new StringBuilder();
        if (member.getMoney().compareTo(BigDecimal.valueOf(500)) < 0) {
            text.append("消費五百以下,還是銅會員");
        } else {
            member.setLevel(new Silver());
            member.checkout();
            text.append("消費超過五百,成為銀會員");
        }
        return text.toString();
    }
}
  1. 建立銀會員
    累計消費一千,可以升等金會員
public class Silver implements Level {
    @Override
    public String status(Member member) {
        StringBuilder text;
        text = new StringBuilder();
        if (member.getMoney().compareTo(BigDecimal.valueOf(1000)) < 0) {
            text.append("消費一千以下,還是銀會員");
        } else {
            member.setLevel(new Gold());
            member.checkout();
            text.append("消費超過一千,成為金會員");
        }
        return text.toString();
    }
}
  1. 建立金會員
public class Gold implements Level {
    @Override
    public String status(Member member) {
        StringBuilder text;
        text = new StringBuilder();
        text.append("升級到金會員,無法再升級");
        return text.toString();
    }
}

上一篇
113/25 - 樣版模式(Template)- Kotlin
下一篇
113/27 - 狀態模式(State)- Kotlin
系列文
肯定會斷賽之在 Android 開發使用設計模式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言