iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0

介紹

看完的理解是跟名稱一樣,可以先預先建立一個抽象樣版
這樣建立物件後,就可以從樣版執行預設的程式碼

樣版模式實作

  1. 建立抽象會員模版給家樂福和全家使用
    先建立基本的「會員姓名」和「消費金額」
    再建立抽象的「商店名稱」和「是金會員」
public abstract class Member {

    private String name;
    private BigDecimal money;

    abstract String getCompany();
    
    abstract boolean isGold();

    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;
    }
}
  1. 建立註冊流程(registerStart)模版
public abstract class Member {

    private String name;
    private BigDecimal money;

    abstract String getCompany();

    abstract boolean isGold();

    public String registerStart() {
        StringBuilder text;

        text = new StringBuilder();
        text.append("商店名稱:");
        text.append(getCompany());
        text.append(" / ");
        text.append("會員姓名:");
        text.append(getName());
        text.append("\n");
        text.append("消費金額:");
        text.append(getMoney());
        text.append(" / ");
        text.append("是金會員:");
        text.append(isGold());
        text.append("\n");

        return text.toString();
    }

    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;
    }
}
  1. 建立家樂福會員,繼承會員模版
    實作金會員判斷,家樂福要超過一千元才能成為金會員
public class CarrefourMember extends Member {

    @Override
    boolean isGold() {
        boolean isGold;
        isGold = getMoney().compareTo(BigDecimal.valueOf(1000)) > 0;
        return isGold;
    }

    @Override
    String getCompany() {
        return "家樂福";
    }
}
  1. 建立全家會員,繼承會員模版
    實作金會員判斷,全家只要一元就能成為金會員
public class FamilyMarkMember extends Member {

    @Override
    boolean isGold() {
        boolean isGold;
        isGold = getMoney().compareTo(BigDecimal.ONE) > 0;
        return isGold;
    }

    @Override
    String getCompany() {
        return "全家";
    }
}

樣版模式測試

  1. 測試案例
    • 建立家樂福會員,姓名 Andy,消費 1 元
    • 建立家樂福會員,姓名 Jack,消費 2000 元
    • 建立全家會員,姓名 Mark,消費 0 元
    • 建立全家會員,姓名 Rich,消費 10 元
public class JavaTest {

    @Test
    public void show() {

        StringBuilder text;
        text = new StringBuilder();
        text.append("\n");

        Member carrefourMember1 = new CarrefourMember();
        carrefourMember1.setName("Andy");
        carrefourMember1.setMoney(BigDecimal.ONE);
        text.append(carrefourMember1.registerStart());
        text.append("\n");

        Member carrefourMember2 = new CarrefourMember();
        carrefourMember2.setName("Jack");
        carrefourMember2.setMoney(BigDecimal.valueOf(2000));
        text.append(carrefourMember2.registerStart());
        text.append("\n");

        Member familyMarkMember1 = new FamilyMarkMember();
        familyMarkMember1.setName("Mark");
        familyMarkMember1.setMoney(BigDecimal.ZERO);
        text.append(familyMarkMember1.registerStart());
        text.append("\n");

        Member familyMarkMember2 = new FamilyMarkMember();
        familyMarkMember2.setName("Rich");
        familyMarkMember2.setMoney(BigDecimal.TEN);
        text.append(familyMarkMember2.registerStart());
        text.append("\n");

        assertEquals("測試", text.toString());
    }
}
  1. 執行測試
商店名稱:家樂福 / 會員姓名:Andy
消費金額:1 / 是金會員:false

商店名稱:家樂福 / 會員姓名:Jack
消費金額:2000 / 是金會員:true

商店名稱:全家 / 會員姓名:Mark
消費金額:0 / 是金會員:false

商店名稱:全家 / 會員姓名:Rich
消費金額:10 / 是金會員:true

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

尚未有邦友留言

立即登入留言