模板方法模式之抽象类继承

    下面讲述一个入门级抽象类例子。

    现在IDE能做太多事情,所以甚至让你手工写个抽象类,接口你都会出问题。我前前后后已经看了快4本书,但是基本写的太少。虽然也仿照着写过些例子,太注重知识本身,而实践太少,以致只是去想象抽象类与接口的区别,而后丢了几个月Java便越发迷糊了。好多努力有点浪费时间的感觉,没起多大作用。今天实在没心思去搞web,到处逛。imooc学院随便看了看Java,有始有终,就把这个例子看完了再分享一下,对于刚刚接触的童鞋应该有所帮助。

  1. Test.java

package com.demo_type.pattern.template;

public class Test {

	public static void main(String[] args) {
		
		System.out.println("制备咖啡...");
		RefreshBeverage coffee = new Coffee();
		coffee.prepareBeverageTemplate();
		System.out.println("客官,咖啡好了...");
		
		System.out.println("**************************");
		System.out.println("制备茶...");
		RefreshBeverage tea = new Tea();
		tea.prepareBeverageTemplate();
		System.out.println("客官,您要的上等好茶好了...");
	}

}

2.  RefreshBeverage.java (提神饮料,抽象父类,可以包含一些实现的方法,必须包含抽象方法)

package com.demo_type.pattern.template;

/**
 * @author YBnew
 * 抽象基类,为所有子类提供一个算法框架
 * 
 * 提神饮料
 */
public abstract class RefreshBeverage {
	
	/*
	 * 制备饮料的模板方法
	 * 封装所有子类共同遵循的算法框架
	 */
	public final void prepareBeverageTemplate(){
		//step1. 将水煮沸
		boilWater();
		//step2.  泡制饮料
		brew();
		//step3. 将饮料倒入杯中
		pourInCup();
		//setp4. 加入调味料
		if(isCustomerWantsCondiments()){
			addCondiments();
		}
	}

	/*
	 * 基本方法,降水煮沸,父子类行为都一样,所以设为private,
	 */
	private void boilWater() {
		
		System.out.println("将水煮沸");
	}
	
	/*
	 * 抽象的基本方法,泡制饮料
	 * --话说这里能将protected 变为public么?当然不要这样了,这样到处都能访问这个类和这个抽象方法了
	 */
	protected abstract void brew();
	
	/*
	 * 基本方法,倒入的动作,父子类行为都一样,所以设为private,
	 */
	private void pourInCup() {

		System.out.println("将水倒入杯中");
	}
	
	/*
	 * 抽象的基本方法,加入冲泡元素
	 */
	protected abstract void addCondiments();
	
	/*
	 * Hook
	 * 钩子函数,提供一个空的或默认的实现
	 * 具体的子类可以自行决定是否挂钩以及如何挂钩
	 * 
	 * 功能: 询问用户是否加调料,继承访问权限
	 */
	protected boolean isCustomerWantsCondiments(){
		return true;
	}
	
}

3.Coffee.java (子类1,已实现所有抽象方法;否则依然为抽象类

package com.demo_type.pattern.template;

public class Coffee extends RefreshBeverage{

	@Override
	protected void brew() {
		
		System.out.println("用沸水冲泡咖啡");
	}

	@Override
	protected void addCondiments() {
		
		System.out.println("加入糖和牛奶");
	}
	

}

4.Tea.java (子类2,已实现所有抽象方法;否则依然为抽象类)

package com.demo_type.pattern.template;

public class Tea extends RefreshBeverage{

	@Override
	protected void brew() {
		
		System.out.println("89度泡5分钟");
		
	}

	@Override
	protected void addCondiments() {
		
		
		System.out.println("加入柠檬");
	}
	//如果不想要加柠檬
	
	@Override
	protected boolean isCustomerWantsCondiments(){
		return false;
	}
	
}

这里,常常别问到的是接口与抽象类的区别,那么稍微总结一下。

因为接口其实是由抽象类而来,比抽象类还抽象的东西,完全不能有任何实现,只有声明。所以一切可能导致这个接口变为实现的可能都不能出现。所以不能有构造函数,不能有static的方法和成员变量。接口内的成员变量只能是public static final。所以总结下来是:

-接口

--方法: 不能有构造方法,普通方法,静态方法,而且其抽象方法必须为public

--成员变量: 只能有public static final成员变量

而抽象类的要求就不为这么苛刻,因为是通过子类的继承来实现其抽象方法。而接口必须通过实现这一定义来完善抽象方法。接口是更为纯粹的抽象思想。抽象类不能有对应的对象,所以不能有构造函数,可以有普通方法,静态方法,普通成员变量,静态成员变量也是可以有的。总之,这里就是必须要有抽象的方法,抽象方法要被实现,就理所应当不能为private。所以总结下来就是:

-抽象类

--方法: 必须有抽象方法,其访问权限不能为private;没有构造方法;可以有普通方法,不能有静态方法

--成员变量: 任意

就是酱紫。对了刚刚看到了一个哥们写的抽象类可以有构造函数,NO!












转载于:https://my.oschina.net/hyb007/blog/312217

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值