我的博客項目地址html
但願各位幫忙點個star,給我加個小星星✨java
設計模式-模板方法&策略模式git
模板方法模式(Template):定義一個操做中的算法的骨架,而將一些步驟延遲到子類中。github
模板方法使得子類能夠不改變一個算法的結構便可重定義該算法的某些特定步驟。算法
策略模式(Strategy):定義了一系列的算法,並將每個算法封裝起來,並且使他們能夠相互替換,讓算法獨立於使用它的客戶而獨立變化。設計模式
定義公共方法,建立一個工廠,經過策略模式,讓它的子類能夠根據策略相互替換。ide
一羣小動物要出門秋遊,每一個動物一開始都要準備出門遠行的物品,不過不一樣動物穿的衣服和出門方式不一樣,例如酷酷的雪納瑞,穿的是時髦的當季衣服,出門方式是小轎車;機智的拉布拉多,穿的是樸素的T恤,騎着拉風的小電驢;還有富有的🐶,穿的是鑽石風衣,乘着🚁出門。工具
從上所述,能夠抽象出一個總的動做:出門秋遊,而後分紅三個步驟:學習
一致的:spa
不一致的:
/** * @author JingQ at 2018/9/8 */
public interface IAutumnOuting {
/** * 定義總的操做,返回值能夠按實際設定 * @param animalName 小動物 */
void outing(String animalName);
}
複製代碼
public abstract class AbstractAutumnOuting implements IAutumnOuting{
@Override
public void outing(String animalName) {
step1(animalName);
step2();
step3();
}
/** * 公共操做 * @param animalName 小動物的名字 */
private void step1(String animalName) {
System.out.println("I'm preparing goods : " + animalName);
}
/** * 差別化操做 */
abstract void step2();
/** * 差別化操做 */
abstract void step3();
}
複製代碼
@Service
public class SchnauzerAutumnOuting extends AbstractAutumnOuting {
@Override
void step2() {
System.out.println("I'm a cool cool schnauzer, wear fashionable clothes(時尚時尚最時尚)");
}
@Override
void step3() {
System.out.println("I'm a cool cool schnauzer, driving the small car(搽亮個人小汽車模型)");
}
}
複製代碼
@Service
public class SchnauzerAutumnOuting extends AbstractAutumnOuting {
@Override
void step2() {
System.out.println("I'm a cool cool schnauzer, wear fashionable clothes(時尚時尚最時尚)");
}
@Override
void step3() {
System.out.println("I'm a cool cool schnauzer, driving the small car(搽亮個人小汽車模型)");
}
}
複製代碼
@Service
public class SingleAutumnOuting extends AbstractAutumnOuting {
@Override
void step2() {
System.out.println("you're a single, want to travel everywhere");
}
@Override
void step3() {
System.out.println("you're a single, and will be very powerful");
}
}
複製代碼
/** * @author JingQ at 2018/9/8 */
@Service
public class AutumnOutingFactory {
@Autowired
@Qualifier("schnauzerAutumnOuting")
private AbstractAutumnOuting schnauzerAutumnOuting;
@Autowired
@Qualifier("labradorAutumnOuting")
private AbstractAutumnOuting labradorAutumnOuting;
@Autowired
@Qualifier("singleAutumnOuting")
private AbstractAutumnOuting singleAutumnOuting;
public AbstractAutumnOuting getInstance(String type) {
switch (type) {
case "1":
return schnauzerAutumnOuting;
case "2":
return labradorAutumnOuting;
case "3":
return singleAutumnOuting;
default:
return singleAutumnOuting;
}
}
}
複製代碼
從執行效果能夠看出,經過策略模式(相似switch操做),工廠判斷出真正執行的對象,而後模板方法中,step1是公有的,step2和step3是子類中差別化實現的操做。
從控制檯的打印結果能夠看出,三個小動物的step操做都順利執行了,並且代碼的邏輯性看起來更強了。