设计模式之责任链2

 

使用责任链模式进行类型转换

 

public class Test {

 public static void main(String[] args) {
  Date d = new Date();
  Double d2 = new Double("99.145456");
  String str = null;
  
  FormaterChain fc = FormaterChain.getInstance();
  fc.add(new DateFormater());
  fc.add(new DecimalFormater());
  //转换日期
  str = fc.doFormat(d);
  System.out.println(str);
  //保留小数2位
  str = fc.doFormat(d2);
  System.out.println(str);
 }

}

 

//对象转字符串
public interface Formater {

 String format(Object o, FormaterChain chain);
}

 

//单例、责任链
public class FormaterChain {
 private List<Formater> formaters = new LinkedList<Formater>();
 private Iterator<Formater> chain = null;
 
 private  FormaterChain(){}
 private static class Inner{
  private static FormaterChain formaterChain = new FormaterChain();
 }
 
 public static FormaterChain getInstance(){
  return Inner.formaterChain;
 }
 
 public String doFormat(Object o){
  if(o == null){
   return null;
  }
  if(chain.hasNext()){
   Formater f = chain.next();
   return f.format(o, this);
  }
  return o.toString();
 }
 
 //增加类型转换器
 public void add(Formater f){
  formaters.add(f);
  chain = formaters.iterator();
 }
}

//日期转换器-转换为字符串
public class DateFormater implements Formater {

 public String format(Object o, FormaterChain chain) {
  if(o.getClass().equals(java.util.Date.class)){
   return date2str((java.util.Date)o);
  }
  return chain.doFormat(o);
 }

 private String date2str(Date d){
  SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
  return df.format(d);
 }
}

public class DecimalFormater implements Formater {

 public String format(Object o, FormaterChain chain) {
  if(o.getClass().equals(java.lang.Double.class)){
   return double2str((Double)o);
  }
  return chain.doFormat(o);
 }

 private String double2str(double d){
  DecimalFormat df = new DecimalFormat("0.00");
  df.setRoundingMode(RoundingMode.HALF_UP);
  return df.format(d);
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值