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

       模板是指在薄片塑料板上面写字后挖空,再使用毛笔或色笔涂满挖空部分,就能看到纯手工而以不失工整的字样,看到模板上的挖空形状,马上就知道最后会变出什么样子的字,不过实际上所显现出来的字样还是要依所使用的画笔种类而定.拿黑色签字笔当画笔,结果当然就是签字笔的字样;当用铅笔来画,得到的也只会是灰黑色的铅笔字;如果用五颜六色的彩色笔,自然能创出让人眼花的多色字.但是,无论使用哪种文具,制作出来的字样都还是脱不了模板上已经固定的形状。

   下面我们用例子说明模板方法

  程序示例类之间的关系

  1.模板类,相当于我们上面提到的薄片塑料板

package com.pattern.templateMethod;

/**
 * 抽象类,充当模板角色
 * @author administrator
 *
 */
public abstract class AbstractDisplay {
	//由子类实现的抽象方法
	public abstract void open();   
	public abstract void print();
	public abstract void close();
	//抽象类实现的方法,final可以保证在子类不会被修改
	public final void display() {
		open();   //先open...
		for(int i=0; i < 5; i++) {  //反复输出5次
			print();  
		}
		close(); //输出完毕,close
	}
}

 

  2.字符类,输出单个字符

package com.pattern.templateMethod;

public class CharDisplay extends AbstractDisplay {
	private char ch;     //应输出的字符
	public CharDisplay(char ch) {  //把构造函数传递过来的字符ch,存储在字段内
		this.ch = ch;
	}
  
	public void open() {
		System.out.print("<<");   //输出"<<"作为开始字符串
	}
	public void close() {
		System.out.println(">>");  //输出 ">>"作为结束字符串
	}
	public void print() {
		System.out.print(ch);    //输出存储在字段的字符
	}

}

 

   3.字符串类,输出字符串

package com.pattern.templateMethod;

/**
 * 
 * @author administrator
 */
public class StringDisplay extends AbstractDisplay {
	private String string;  //应输出的字符串
	private int width;      //以byte为单位所求出的字符串的"长度"
	
	public StringDisplay(String string) {
		this.string =string;
		width = string.getBytes().length;
	}

	public void open() {  //打印头装饰字符串
		printLine();
	}
	public void print() { //打印内容
		System.out.println("|"+string+"|");
	}
	public void close() { //打印尾装饰字符串
		printLine();
	}

	public void printLine() {
		System.out.print("+");  //输出"+"号表示边框位置
		for(int i=0; i < width; ++i) {
			System.out.print("-");  //当作线段
		}
		System.out.println("+");  //输出"+"号表示边框位置
	}
}

  4.测试类

package com.pattern.templateMethod;

public class Main {
	public static void main(String[] args) {
		//建立1个有'A'的CharDisplay的对象
		AbstractDisplay d1 = new CharDisplay('A');
		//建立1个有"Hello world"的StringDisplay的对象
		AbstractDisplay d2 = new StringDisplay("Hello World");
		
		//d1,d2都是AbstractDisplay的子类对象,可以调用继承到的display()方法
		d1.display();
		d2.display();
	}
}

 

 输出:

 

 <<AAAAA>>
+-----------+
|Hello World|
|Hello World|
|Hello World|
|Hello World|
|Hello World|
+-----------+

 

 

 

 

设计思想:

  作为模板的方法定义在父类(父类为抽象类),而方法定义使用抽象方法,实现抽象方法的是子类,要在子类实现方法,才能决定具体的操作。如果在不同的子类执行不同实现就可以发展出不同的处理内容。不过,无论在哪个子类执行任何一种实现,处理的大致流程都还是要依照父类制定的方式。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值