策略模式
定義
通用類圖

通用類圖.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é)