黑马程序员——Java基础——模板方法模式、多态

原创 2015年07月07日 15:44:51

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------


一、模板方法模式

学习继承和抽象之后,有一个广泛应用的模式,就是模板方法模式。定义如下:

定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

优点:封装不变的部分,扩展可变的部分;提取公共部分代码,便于维护。

提取出来的抽象类叫抽象模板,它的方法分为两类:

基本方法也叫做基本操作,是由子类实现的方法,并且在模板方法中被调用

模板方法,可以有一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑。

//抽象模板类
abstract class Animal
{
	//基本方法
	abstract void eat();
	//抽取共性方法
	public void sleep()
	{
		System.out.println("趴着睡");
	}
	//模板方法
	public void live()
	{
		//调用基本方法
		this.eat();
		this.sleep();
	}
}

class Cat extends Animal
{

	//实现基本方法
	public void eat() {
		System.out.println("吃老鼠");
	}
	
}
class Dog extends Animal
{

	//实现基本方法
	public void eat() {
		System.out.println("吃骨头");
	}
	
}
public class TemplateDemo {

	public static void main(String[] args) {
		
		Cat c = new Cat();
		Dog d = new Dog();
		//调用模板方法
		c.live();
		d.live();
	}
}


二、多态

1.定义

多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。多态性增强了软件的灵活性和扩展性。

2.体现

父类或者接口的引用指向了或者接收了自己的子类对象

3.实现的前提和机制

类与类之间必须有关系,要么继承,要么实现。存在覆盖,父类中有方法被子类重写。靠父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。

前面模板方法模式的例子用多态来表现如下:

//抽象模板类
abstract class Animal
{
	//基本方法
	abstract void eat();
	//抽取共性方法
	public void sleep()
	{
		System.out.println("趴着睡");
	}
	//模板方法
	public void live()
	{
		//调用基本方法
		this.eat();
		this.sleep();
	}
}

class Cat extends Animal
{

	//实现基本方法
	public void eat() {
		System.out.println("吃老鼠");
	}
	
}
class Dog extends Animal
{

	//实现基本方法
	public void eat() {
		System.out.println("吃骨头");
	}
	
}
public class Demo1 {

	public static void main(String[] args) {
		
		//使用多态定义指向两个子类对象的父类引用
		Animal c = new Cat();
		Animal d = new Dog();
		//调用模板方法
		c.live();
		d.live();
	}
}

4.使用多态时成员的特点

1)非静态成员函数

在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。这就是说,如果父类中有一个非抽象的方法,而子类继承后又将其复写了,在多态运行时,父类的引用调用这个同名函数时,被运行的将是子类中的方法。

简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。

2)成员变量

无论编译和运行,都参考左边(引用变量所属的类)。如:多态中的父类引用调用成员变量时,如果父类和子类有同名的成员变量,那么被调用的是父类中的成员变量。

3)静态成员函数

无论编译和运行,都参考左边。也就是父类引用在调用静态同名函数时,被调用的是父类中的静态函数。这是因为,当类一被加载,静态函数就随类绑定在了内存中。此时,不需要创建对象,就可以使用类名直接调用。同时,父类中的静态成员函数一般是不被复写的。

5.应用

多态的概念在现实生活中也有很多描述,比如键盘上的按键,在一个应用软件中代表一种功能,在一个游戏软件中代表另外一种不同的功能,面对这种情况在父类中定义按键的方法,在子类中实现按键的功能,调用时可以使用多态。








从Java多态到策略模式

先来复习下java多态:java多态指的是父类引用指向子类对象,不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。接下来我们再说下什么叫策略模式:将每一个算法封...
  • mythace
  • mythace
  • 2017年04月25日 11:09
  • 419

【C++模版之旅】静态多态(模版模拟多态)的讨论

说到面向对象特性之一“多态”,以我的水平已经说不出太多新意了。相信很多程序员代码K多了,做梦都在“多态中”运行着。常规的多态是C++语义内置支持的一种特性,通过虚函数可以实现这个特性,为了后面以示区别...
  • my_business
  • my_business
  • 2013年09月30日 14:50
  • 4950

Java设计模式(五) 多态的极致应用——组合模式

本文介绍了组合模式的概念,UML类图,优缺点,实例讲解以及组合模式(未)遵循的OOP原则。...
  • Habren
  • Habren
  • 2016年06月08日 07:25
  • 1520

设计模式里的多态,答疑

>在java程序设计这门课中,我读的书上写到多态有两种形式,1.一个类中,具 >有相同的方法名,但参数列表不同,称这种形式为静态多态性,又叫重载。 >2.子类与父类拥有相同的属性或方法,称...
  • younggift
  • younggift
  • 2016年01月09日 00:20
  • 1148

多态、策略模式和简单工厂模式的理解

最近在看设计模式一本书,发现策略模式和简单工厂模式很像,刚刚开始我还以为是一样的,总感觉没什么区别,后来才看明白,有一点点个人的理解,记录下来,方便下次复习以及理解。 概念理解: 多态:C++的多态...
  • Andy_93
  • Andy_93
  • 2017年01月04日 11:42
  • 874

设计模式之三:工厂方法模式—多态工厂的实现

简单工厂的严重问题: 当系统中需要引进新产品时,静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,违背了开闭原则 引入工厂方法模式: 针对不同的产品提供不...
  • wujunwen
  • wujunwen
  • 2016年09月22日 15:25
  • 661

Java设计模式之模板方法模式(Template Method)

本文属于23种设计模式系列,介绍的是模板方法模式。
  • jason0539
  • jason0539
  • 2015年04月15日 08:37
  • 27097

行为型模式之模板方法模式(java版)

1.引入 模板方法模式就是当我们需要把某些细节层次,但器个别步骤的更详细的实现却是不同的时候,就需要用模板方法模式。实际上就是把一些更详细的信息在子类中去实现,这里更详细的信息就是可变的信息,因为每个...
  • ya_1249463314
  • ya_1249463314
  • 2016年08月26日 10:43
  • 331

多态工厂的实现--工厂方法模式

工厂方法模式概述 在工厂方法模式中,不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构。 工厂方法模式提供一个抽象工厂接口...
  • sxh850297968
  • sxh850297968
  • 2015年07月13日 19:17
  • 820

设计模式系列之四_策略模式 和 模版方法模式(Template method)

1.策略模式 1.1 策略模式   策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。 策略模式让算法独立于使用它的客户而独立变化。   策略模式属于对象的行为模式...
  • orclight
  • orclight
  • 2013年03月12日 16:28
  • 3590
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:黑马程序员——Java基础——模板方法模式、多态
举报原因:
原因补充:

(最多只允许输入30个字)