五、设计模式——模板模式
五、设计模式——模板模式
文森特梵高 发表于3年前
五、设计模式——模板模式
  • 发表于 3年前
  • 阅读 48
  • 收藏 1
  • 点赞 0
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

摘要: 模板模式适合做框架。

如何泡咖啡和泡茶?

思考,变化与不变?

很显然,变化的是咖啡喝茶,而泡的步骤没有改变。

第一个层次的抽象,就是讲公共的步骤放在超类中,比如“水烧开”、“倒入杯子”

public abstract class HotDrink {
	public abstract void prepareRecipe();
	public void boilWater() {
		System.out.println("Boiling water");
	}
	public void pourInCup() {
		System.out.println("Pouring into cup");
	}
}


我们发现,除了上述两个步骤一样之外,“冲泡”和“加入材料”这两个动作本质也是一样的。

因此我们总结出第二个层次的抽象。

public abstract class HotDrink {
	public final void prepareRecipe() {//因为步骤也是一样的,所以固定化
		boilWater();
		brew();
		pourInCup();
		addCondiments();
	}
	public abstract void brew();//因为冲泡和加的辅料不同,因此抽象
	public abstract void addCondiments();
	public final void boilWater() {//完全一样的,直接在超类中实现
		System.out.println("Boiling water");
	}
	public final void pourInCup() {
		System.out.println("Pouring into cup");
	}
}

public class Coffee extends HotDrink {

	@Override
	public void brew() {
		System.out.println("Brewing Coffee");
	}

	@Override
	public void addCondiments() {
		System.out.println("Adding sugar and milk");
	}

}


模板模式:

封装了一个算法步骤,允许之类为一个或多个步骤提供实现。模板模式允许之类在不改变算法结构的情况下,重新定义算法的某些步骤。



通过hook增加模板方法的实用性


思考,上述中的算法步骤都写死了,那么不就对扩展不利吗?假设某些步骤在某些情况下可以不执行,如何实现?

针对这个问题,其实模板模式提供了钩子的概念,之类可以通过钩子来影响模板方法中的某些步骤,达到灵活执行的目的。

public abstract class HotDrink {

	public final void prepareRecipe() {
		boilWater();
		brew();
		pourInCup();
		if (wantCondimentsHook())
			addCondiments();
		else
			System.out.println("No need to add condiments");
	}
	
	public abstract void brew();
	
	public abstract void addCondiments();
	
	public boolean wantCondimentsHook() {
		return true;
	}
	
	public final void boilWater() {
		System.out.println("Boiling water");
	}
	
	public final void pourInCup() {
		System.out.println("Pouring into cup");
	}
}

public class Coffee extends HotDrink {

	@Override
	public void brew() {
		System.out.println("Brewing Coffee");
	}

	@Override
	public void addCondiments() {
		System.out.println("Adding sugar and milk");
	}

	@Override
	public boolean wantCondimentsHook() {
		return false;
	}
}




身边的模板模式


Array.sort()方法就是一个模板模式的运用,不同是Java将抽象方法移动到对象上。对象需要实现Comparable接口。

public abstract class SortTemplate {

	public final void sort(Object[] objects) {
		for (int i = 0; i < objects.length - 1; i++) {
			if (compare(objects[i+1]) > 0) {
				//swap();
			} else {
				
			}
		}
	}
	
	public abstract int compare(Object object);
}


Android中的组件,BaseAdapter其实也是模板模式。

public class MyAdapter extends BaseAdapter {
    public MyAdapter(Context ctx) {
        this.ctx = ctx;
    }
    //...略...
    @Override
    public int getCount() {
        return data.length;
    }
    @Override
    public int Object getItem(int arg0) {
        return data.get(arg0);
    }
    @Override
    public View getView(int position , int convertView , ViewGroup arg2) {
        //...略...
        return view;
    }
    //...略...
}

上述提供的函数,都是模板方法的步骤调用的。因此来获知空间的元素数量,在显示的时候会调用getView函数。


Activity的生命周期,onStart()、onCreate()、onStop()、onDestroy()等函数,也是模板方法模式的应用。



好莱坞原则


好莱坞原则:别调用我们,我们调用你。

好莱坞原则就是经纪人和明星之间的关系,经纪人负责安排明星的时间表,明星只需要根据经纪人的安排把活动做好,把歌长号,参加粉丝见面会,等等就好了。

在系统中,有一个专门的部分负责流程,而其他部分只需要将流程中的各个步骤做好即可,这样可以很好的解耦,模块之间西相互独立。



模板模式和策略模式 的 差异


模板模式是对流程和步骤的封装,而且是通过继承的方式实现。

策略模式是在超类中将动作进行抽象,通过让不同的方法族能够相互替代,通过组合的方式实现。

策略模式可以与模板模式结合使用,结合点在于模板模式的abstract方法改成引用接口,之类通过传入不同的接口实例达到解耦的目的。

标签: 模板模式
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 2
博文 24
码字总数 15386
×
文森特梵高
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: