设计模式--模版方法模式

一:楔子

       最近一直在看设计模式,但是考虑到设计模式这个东西,没有很多的应用很容易忘记,因此希望结合实际已有的应用来强化自己对设计模式的理解。先把我映像比较深的几个模式写出来。第一期就是模版方法设计模式,也算笃行我对自己的要求。

       参考书目《设计模式-java》结城浩 著,博硕文化  译

二:模版方法设计模式(Template Method Pattern)概要

     一句话描述:定义一个操作中算法的骨架,而将这些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。算法的整个流程不会改变,改变的只是实现的细节。

    由模板模式的可以很明显看出抽象类的作用和接口设计的区别,接口中的方法是全部不实现的,抽象类中可以不是抽象的方法。而这个实现的方法正是模版方法模式的核心所在。

     

三:

     举例说明:抽象类,

public abstract class AbstractDisplay {
	//子类进行不同的实现
	public abstract void open();
	public abstract void print();
	public abstract void close();
	
	public final void dsplay(){//相当于某个算法的骨架
		open();	
		
		for(int i=0;i<5;i++){
			print();
		}
		
		close();
	}
	
}	


 

不同的实现类,下面我们举两个例子,子类虽然抽象方法实现不同,但是整个算法的骨架都是按照父类规定好的实现。

具体类1:

public class CharDisplay extends AbstractDisplay {

	private char ch;
	
	public CharDisplay(char ch) {
		super();
		this.ch = ch;
	}

	@Override
	public void open() {
		// TODO Auto-generated method stub
		System.out.print("<<");
	}

	@Override
	public void print() {
		// TODO Auto-generated method stub
		System.out.print(ch);
	}

	@Override
	public void close() {
		// TODO Auto-generated method stub
		System.out.println(">>");
	}

}


 

具体类2:

public class StringDisplay extends AbstractDisplay {

	private String string;
	private int width;
	
	
	public StringDisplay(String string) {
		super();
		this.string = string;
		this.width = string.getBytes().length;
	}

	@Override
	public void open() {
		// TODO Auto-generated method stub
		printLine();
	}

	private void printLine() {
		// TODO Auto-generated method stub
		System.out.print("+");
		for(int i=0;i<width;i++){
			System.out.print("-");
		}
		
		System.out.println("+");
	}

	@Override
	public void print() {
		// TODO Auto-generated method stub
		System.out.println("|"+string+"|");
	}

	@Override
	public void close() {
		// TODO Auto-generated method stub
		printLine();
	}

}


 

观看效果:

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		AbstractDisplay d1 = new CharDisplay('H');
		AbstractDisplay d2 = new StringDisplay("Hello world.");
		
		AbstractDisplay d3 = new StringDisplay("您 好");
		d1.dsplay();
		d2.dsplay();
		d3.dsplay();
		
		String str1 = "str";
		System.out.println(str1.length());
	}


 

四:一些学习

		String str2 = "中国";
		System.out.println(str2.length());
		System.out.println(str2.getBytes().length);

体会其中的一些区别

五:模版方法模式的应用

     一个普通的servlert类,我们去继承的HttpServlet类中有五个方法,init(),service(),doGet(),doPost(),destry()方法,我们自己写的servlet中要实现或者重写里面的方法,但是里面的service方法是不能重写的。当我们的参数请求到servlet类中,会到父类中的service方法中判断method是Post还是Get方式,

public final void service(){
      if(method.equals("get"))

            {doGet()}
     else

           {doPost()}
}

public abstract void doGet(){}
Public abstract void doPost(){}
所以要求在HttpServlet类中有doPost和doGet方法,但是这两个方法的执行逻辑是不确定的,这时可以在HttpServlet里面定义doGet和doPost抽象类,供子类继承实现,或者定义其方法,让子类去重写。service()方法被称为模板法,去调用子类的实现方法doGet和doPost方法。

在实际中我们一般继承HttpServlet或者GenericServlet,我们实现其中的doGet,以及doPost方法。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值