策略模式

策略模式

定義

通用類圖

通用類圖.png

說明:Strategy是算法接口,ConcreteStrategy是算法的具體實(shí)現(xiàn),Context作用就是將算法封裝起來。

通用代碼

// 策略
public interface Strategy {
    public void doSomething();
}

// 具體策略
public class ConcreteStrategy implements Strategy {
    @Override
    public void doSomething() {
        // 具體算法
    }
}

// 算法封裝
public class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public void doSomething() {
        strategy.doSomething();
    }
}

// 客戶端調(diào)用
public class Client {

    public static void main(String[] args) {
        Strategy strategy = new ConcreteStrategy();
        Context context = new Context(strategy);
        context.doSomething();
    }
}

樣例展示

在圖書銷售時,根據(jù)不同類型的圖書有不同的折扣,計(jì)算金額時必須區(qū)別對待,例如計(jì)算機(jī)類圖書7折,英語類圖書6折。

分析:這里的策略是打折,具體打折策略是計(jì)算機(jī)7折,英語6折,然后將這些打折策略封裝起來給客戶端調(diào)用。

樣例類圖

樣例類圖.png

樣例代碼

// 策略接口
public interface Discount {
    public float discount(float price);
}

// 計(jì)算機(jī)打7折
public class ComputerDiscount implements Discount {
    @Override
    public float discount(float price) {
        return (float) (price * 0.7);
    }
}

// 英語打6折
public class EnglishDiscount implements Discount {
    @Override
    public float discount(float price) {
        return (float) (price * 0.6);
    }
}

// 封裝算法
public class Context {

    private Discount discount;

    public Context(Discount discount) {
        this.discount = discount;
    }

    public float sale(float price) {
        return discount.discount(price);
    }
}

// 客戶端調(diào)用
public class Client {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        float price = scanner.nextFloat();
        String classification = new Scanner(System.in).next();
        Context context = null;
        if ("計(jì)算機(jī)".equals(classification)) {
            context = new Context(new ComputerDiscount());
        } else if ("英語".equals(classification)) {
            context = new Context(new EnglishDiscount());
        }

        System.out.println(context.sale(price));
    }
}

當(dāng)然,這里可以巧用枚舉完成相同的功能

public enum Discount {
    COMPUTER_DISCOUNT() {
        @Override
        public float discount(float price) {
            return (float) (price * 0.7);
        }
    },
    ENGLISH_DISCOUNT() {
        @Override
        public float discount(float price) {
            return (float) (price * 0.6);
        }
    };

    public abstract float discount(float price);
}

// 客戶端調(diào)用
 public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        float price = scanner.nextFloat();
        String classification = new Scanner(System.in).next();
        if ("計(jì)算機(jī)".equals(classification)) {
            System.out.println(Discount.COMPUTER_DISCOUNT.discount(price));
        } else if ("英語".equals(classification)) {
            System.out.println(Discount.ENGLISH_DISCOUNT.discount(price));
        }
    }

本文為《設(shè)計(jì)模式之禪》讀后筆記總結(jié)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容