快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新葡萄app下载_龟发之家论坛



你写好了之后,迫在眉睫地开始运行,运行结果也完全相符你的期望。

项目经理看完后,对你异常知足,小伙效率很高的嘛!你也异常的自得。

不过两天之后,项目经理又找到了你,他说之前没有斟酌到必要交互的客户端还包括手机设备,而手机设备都对照吃流量,用XML款式来传输太耗流量了,想最好能改成应用JSON款式传输。然则之前的XML款式也要保留,最好可以由客户端指定应用哪种款式。

你有些不兴奋,心里低估着,为什么一开始不斟酌全面呢,现在又要改遗留代码。但对方终究是引导,你照样要屈服敕令的,于是你开始改动Formatter类:

public class Formatter {

public static final int XML = 0;

public static final int JSON = 1;

public String formatBook(Book book, int format) {

System.out.println("format begins");String result = "";

if (format == XML) {result += "" + book.getBookName() + "n";

result += "

" + book.getPages() + "n";result += "

" + book.getPrice() + "n";

result += "" + book.getAuthor() + "n";result += "" + book.getIsbn() + "n";

} else if (format == JSON) {result += "{n";

result += ""book_name" : "" + book.getBookName() + "",n";result += ""pages" : "" + book.getPages() + "",n";

result += ""price" : "" + book.getPrice() + "",n";result += ""author" : "" + book.getAuthor() + "",n";

result += ""isbn" : "" + book.getIsbn() + "",n";result += "}";

}System.out.println("format finished");

return result;}

}

调用代码如下:

public class Test {

public static void main(String[] args) throws Exception {

Book book = new Book();book.setBookName("Thinking in Java");

book.setPages(880);book.setPrice(68);

book.setAuthor("Bruce Eckel");book.setIsbn("9787111213826");

Formatter formatter = new Formatter();String result = formatter.formatBook(book, Formatter.XML);

System.out.println(result);result = formatter.formatBook(book, Formatter.JSON);

System.out.println(result);}

}

再次运行法度榜样,获得了以下结果。

项目经理看到运行结果后兴奋地说:“太好了,这恰是我想要的!”

可是你此次却没有那么兴奋,你感觉代码已经有些纷乱了,XML款式的逻辑和JSON款式的逻辑肴杂在一路,异常晦气于涉猎,而且假如今后还必要扩展功能也会异常艰苦。好在传输款式一样平常也就XML和JSON了,应该不会再有什么扩展了,你这样劝慰自己道。

但幻想总会被现实突破,“我近来据说有个YAML款式挺好玩的.......” 项目经理说道。这个时刻你已经有想打人的感动了!!!

很多时刻便是这样,在公司里写的代码紊乱无章,质量极差,很大年夜一部分缘故原由便是由于需求变来变去。我们赓续在原有代码根基上弥补各类后续加入的环境,在一行行新增的if语句下面,我们的代码变得不堪入目。当然,我们作为法度榜样员,对付需求这种器械没有太多的话语权,在这方面我们力所不及。然则我们可以只管即便澳门新葡萄app下载地把法度榜样的架构设计好,让我们写出的代码更具有扩展性,这样就可以应对各类需求变化了。

下面你将要应用23种设计模式中的模板措施来改进以上法度榜样。

首先将Formatter中的代码进行改动,如下所示:

public abstract class Formatter {

public String formatBook(Book澳门新葡萄app下载 book, int format) {

beforeFormat();String result = formating(book);

afterFormat();return result;

}

protected void beforeFormat() {System.out.println("format begins");

}

protected abstract String formating(Book book);

protected void afterFormat() {System.out.println("format finished");

}

}

你会发明format_book措施只有四步,第一步调用before_format,去打印款式转换前的日志。第二步调用formating,这个措施是个抽象措施,用于处置惩罚详细的转换逻辑,是以每一个承袭自Formatter的子类都必要重写此措施,来实现各自的转换逻辑。第三步调用after_format,去打印款式转换后的日志。第四步返回result。因为类中存在了抽象措施,我们也就必要把Formatter声明澳门新葡萄app下载成抽象类。

然后要定义专门的子类来处置惩罚每种传输款式的详细逻辑,这样不合传输款式的逻辑可以从一个措施里分分开,显着便于涉猎和理解。

定义类XMLFormatter承袭自Formatter,里面加入处置惩罚XML款式的详细逻辑:

public class XMLFormatter extends Formatter {

@Override

protected String formating(Book book) {String result = "";

result += "" + book.getBookName() + "n";result += "

" + book.getPages() + "n";

result += "

" + book.getPrice() + "n";result += "" + book.getAuthor() + "n";

result += "" + book.getIsbn() + "n";return result;

}

}

定义类JSONFormatter承袭自Formatter,里面加入处置惩罚JSON款式的详细逻辑:

public class JSONFormatter extends Formatter {

@Override

protected String formating(Book book) {String result = "";

result += "{n";result += ""book_name" : "" + book.getBookName() + "",n";

result += ""pages" : "" + book.getPages() + "",n";result += ""price" : "" + book.getPr澳门新葡萄app下载ice() + "",n";

result += ""author" : "" + book.getAuthor() + "",n";result += ""isbn" : "" + book.getIsbn() + "",n";

result += "}";return result;

}

}

着末调用代码如下:

public class Test {

public static void main(String[] args) throws Exception {

Book book = new Book();book.setBookName("Thinking in Java");

book.setPages(880);book.setPrice(68);

book.setAuthor("Bruce Eckel");book.setIsbn("9787111213826");

XMLFormatter xmlFormatter = new XMLFormatter();String result = xmlFormatter.formatBook(book);

System.out.println(result);JSONFormatter jsonFormatter = new JSONFormatter();

result = jsonFormatter.formatBook(book);System.out.println(result);

}

}

运行之后,你会发明运行结果和改动前代码的运行结果完全相同。然则应用模板措施之后,代码的可读性有了很大年夜的前进,由于处置惩罚款式转换的代码都放到了各自的类傍边,而不是整个塞进一个措施中。并且在扩展性上也有了很大年夜的提升,比如你开始感兴趣项目经理说的YAML款式了。

定义类YAMLFormatter承袭自Formatter,里面加入处置惩罚YAML款澳门新葡萄app下载式的详细逻辑:

public class YAMLFormatter extends Formatter {

@Override

protected String formating(Book book) {String result = "";

result += "book_name: " + book.getBookName() + "n";result += "pages: " + book.getPages() + "n";

result += "price: " + book.getPrice() + "n";result += "author: " + book.getAuthor() + "n";

result += "isbn: " + book.getIsbn() + "n";return result;

}

}

调用代码只必要加入:

YAMLFormatter yamlFormatter = new YAMLFormatter();

String result = yamlFormatter.formatBook(book);System.out.println(result);

好了,令人头疼的YAML款式就这样被支持了,只必要在调用的时刻抉择是实例化XMLFormatter,JSONFormatter照样YAMLFormatter,就可以按照响应的规格进行款式转换了。而且整体的代码很有条理,看起来也很舒心。这个时刻,你会轻松地向项目经理奚弄一句,还有必要支持的款式吗?

模板措施: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板措施使得子类可以不改变一个算法的布局即可重定义该算法的某些特定步骤。

您可能还会对下面的文章感兴趣: