Template Method模式

什么是Template Method模式

Template Method模式是带有模板功能的模式,组成模板的方法定义在父类中。由于这些方法是抽象的,所以只查看父类的代码是无法知道这些方法会进行具体的处理。唯一知道的就是父类如何调用这些方法。这些抽象类在子类中进行实现,不同的子类,父类模板方法被调用时程序也会不同。但是无论如何实现,处理的流程都会按照父类中所定义那样进行。

像这样在父类中定义处理流程的框架,在子类事项具体处理的模式就称为Template Method模式。

示例程序

package Class;

public abstract class AbstractDisplay {
	public abstract void open();
	public abstract void print();
	public abstract void close();
	public final void display() {
		open();
		for(int i=0;i<5;i++) {
			print();
		}
		close();
	}
}
package Class;

public class CharDisplay extends AbstractDisplay {
	private char ch;
	public CharDisplay(char ch) {
		this.ch=ch;
	}
	@Override
	public void open() {
		System.out.println("<<");
	}
	@Override
	public void print() {
		System.out.println(ch);
	}
	@Override
	public void close() {
		System.out.println(">>");
	}

}
package Class;

public class StringDisplay extends AbstractDisplay {
	private String string;
	private int width;
	public StringDisplay(String string) {
		this.string=string;
	}
	@Override
	public void open() {
		printLine();
	}

	private void printLine() {
		System.out.println("+");
		for(int i=0;i<width;i++) {
			System.out.println("-");
		}
		System.out.println("+");
	}
	@Override
	public void print() {
		System.out.println("|"+string+"|");
	}

	@Override
	public void close() {
		printLine();
	}

}
package Class;

public class Main {
	public static void main(String[] args) {
		AbstractDisplay d1=new CharDisplay('H');
		AbstractDisplay d2=new StringDisplay("Hello World!");
		AbstractDisplay d3=new StringDisplay("你好世界");
		d1.display();
		d2.display();
		d3.display();
	}
}

相关的设计模式

Factory Method模式

Strategy模式

延伸阅读:类的层次与抽象类

父类对子类的要求

我们在理解类的层次时,通常是站在子类的角度考虑进行思考的。也就是说,很容易着眼于一下几点:

1、在子类中可以使用父类中定义的方法。

2、可以通过在子类中增加方法以实现新的功能。

3、在子类中重写父类的方法可以改变程序的行为。

站在父类的角度思考。在父类中,我们声明了抽象方法,而将该方法的实现交给了子类。换言之,就程序而言。声明抽象方法是希望达到以下目的:

1、期待子类去实现抽象方法。

2、要求子类去实现抽象方法。

也就是说,子类具有实现在父类中所声明的抽象方法的责任。因此这种责任被称为“子类责任”。

抽象类的意义

对于抽象类。我们是无法生成实例的。由于在抽象方法中并没有写具体的实现,所以我们无法知道抽象方法到底进行了什么处理。但我们可以决定抽象方法的名字,然后通过调用使用了抽象方法的模板方法去编写处理。虽然具体处理美瞳是由子类决定的,不过在抽象结对确定处理流程非常重要。

父类与子类之间的协作

父类与子类的相互协作支撑起了整个程序。虽然将更多的方法实现放在了父类会让子类变得更轻松,但是同时也降低了子类的灵活性;繁殖,如果父类中实现的方法过少,子类就会变得臃肿不堪。而且还会导致各子类间的代码重读、

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章