文档章节

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

语博兄
 语博兄
发布于 2014/09/10 23:11
字数 1114
阅读 520
收藏 5

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

    现在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!












© 著作权归作者所有

语博兄
粉丝 1
博文 53
码字总数 22168
作品 0
东城
程序员
私信 提问
设计模式之模板方法模式(行为型)

[TOC] 一、模式定义 模板方法模式就是在一个抽象类中定义一些骨架方法,然后通过类继承的方法,将一些方法延迟到继承类里。模板方法模式是一种类行为型模式,是一种比较常用的方法。不属于对...

smileNicky
2018/12/31
0
0
我的Java设计模式-模板方法模式

近日,ofo小黄车宣布入驻法国巴黎,正式进入全球第20个国家,共享单车已然改变了我们的出行方式。就拿我自己来说,每当下班出地铁的第一件事,以光速锁定一辆共享单车,百米冲刺的速度抢在别...

Jet啟思
2017/12/11
0
0
Java设计模式-模板方法模式

定义 Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changi......

别打我会飞
06/24
39
0
由AbstractQueuedSynchronizer和ReentrantLock来看模版方法模式

  在学完volatile和CAS之后,近几天在撸AbstractQueuedSynchronizer(AQS)的源代码,很多并发工具都是基于AQS来实现的,这也是并发专家Doug Lea的初衷,通过写一个这样的基础工具来提高j...

2018/07/22
0
0
设计模式----模板方法模式

模板方法模式: 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模版方法使子类在不改变算法结构的情况下,重新定义算法中的某些步骤。 模板方法模式的结构: 抽象类:实现了模...

Superheros
2017/11/11
23
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
48分钟前
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
8
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
11
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
10
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部