我的博客项目地址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操做都顺利执行了,并且代码的逻辑性看起来更强了。