【设计模式】模版方法模式(行为型)

模板方法模式

   定义一个操作中的算法的骨架。而将一些步走延迟到子类中。模板方法可以师子类不改变算法的结构。重定义算法的某些特定步走。

模型图

 代码

public  abstract class AbstractClass {
   public long TemplateMethod(){
		long A=primitiveMethod1();
		long B=primitiveMethod2();
		return A+B;
   }

   protected abstract long primitiveMethod1();
   protected abstract long primitiveMethod2();
}

 

 

public class ConcreteClass extends AbstractClass{

	@Override
	protected long primitiveMethod1() {
		// TODO Auto-generated method stub
		return 10;
	}

	@Override
	protected long primitiveMethod2() {
		// TODO Auto-generated method stub
		return 20;
	}

}
public class Test {
	public static void main(String[] args) {
		AbstractClass abstractClass=new ConcreteClass();
		long templateMethod = abstractClass.TemplateMethod();
		System.out.println(templateMethod);
	}
}

结果

案例

需求 写一个加载消息,对消息进行处理之后做远程发送的框架,要求可以通过xml格式发送,json格式发送,或者更多的格式

分析与设计 这个需求中有需要对消息做相同的加载操作,并对消息做相同的加工,然后通过不通的方式进行发送。综合这个需求

我们可以通过模板方法模式来实现相同的加载,加工。然后通过模板方法把不同的消息格式交给子类

模型

代码

package xiao.it.designer.decorator.templatemethod.instance;

import java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

public abstract class AbstractMsg {

	/**
	 * 
	 * @Title: LoadMsg   
	 * @Description: (加载消息)   
	 * @param: @return
	 * @param: @throws IOException      
	 * @return: String
	 * @author xiaozhengwen      
	 * @throws
	 */
	private String LoadMsg() throws IOException{
	    Properties config=new Properties();
    	Object object = config.get("yy");
    	if(null!=object){
    		return object.toString();
    	}
    	return "演示";	
    }
	
	/**
	 * 
	 * @Title: sendMsg   
	 * @Description: (实际发送消息的类)   
	 * @param: @throws IOException      
	 * @return: void
	 * @author xiaozhengwen      
	 * @throws
	 */
	public void sendMsg() throws IOException{
		String loadMsg = LoadMsg();
		List<String> list=new ArrayList<String>();
		String format = MessageFormat.format(loadMsg, list);
		send(format);
	}
	
	/**
	 * 
	 * @Title: send   
	 * @Description: (模板方法)   
	 * @param: @param string      
	 * @return: void
	 * @author xiaozhengwen      
	 * @throws
	 */
	protected abstract void send(String string);
}
public class XmlSenderClassA  extends AbstractMsg{
	@Override
	protected void send(String string) {
		System.out.println("XmlSenderClassA:="+string);
	}
}

 

public class JSONSenderClassB extends AbstractMsg {
	@Override
	protected void send(String string) {
		System.out.println("JSONSenderClassB:="+string);
	}
}

 

public class Test {
    public static void main(String[] args) throws IOException {
		AbstractMsg abstractMsg=new XmlSenderClassA();
		abstractMsg.sendMsg();
		AbstractMsg abstractMsg2=new JSONSenderClassB();
		abstractMsg2.sendMsg();
	}
}

 

 

 小结

1   继承的目的就在于可以使用子类中重复的代码上升到父类中去,师父类成为子类的骨架

2  当我们完成一个层次细致的代码段,除个代码段有所不同,其他都相同的时候,我们就可以考虑模板方法模式

3  模板方法模式提供了一个很好的代码复用平台

4 当子类中变与不变的行为,混杂在一起的时候,为避免不变的行为重复出现,可以考虑把不变的行为搬移到父类中去

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值