Java设计模式之模板方法设计模式

来源:互联网 发布:mac os x 10.12 cdr 编辑:程序博客网 时间:2024/05/19 13:08

1、运用

在定义功能时,功能的一部分是确定的,但是有一部分是不确定的,而确定的部分在使用不确定的部分,那么这时将不确定部分暴露出去,由该类的子类去完成。

2、创建模板模式步骤

1)定义一个(或者多个)抽象方法,让子类去实现;

2)定义并实现一个模板方法,在模板方法中调用抽象方法;

3)创建抽象类的子类,实现对应的抽象方法。

3、示例:

有如下需求:想在服务器端增加一个新功能,希望写一个方法,能对Book对象进行处理,将Book对象的所有字段以XML格式进行包装,这样以后可以方便与客户端进行交互。

为便于代码的扩展性,便于后期的升级维护,可以使用模板方法设计模式。因为后期可能有新需求,将Book对象以json格式进行包装,这样就可以针对不同的要求,由不同的子类去实现。

定义含模板方法的抽象类

public abstract class Formatter {  

  

    public String formatBook(Book 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");  

    }  

  

}

定义专门的子类来处理每种传输格式的具体逻辑,如定义子类XMLFormatter继承自Formatter,将Book对象以xml格式进行包装。

public class XMLFormatter extends Formatter {     

    @Override  

    protected String formating(Book book) {  

        String result = "";  

        result += "<book_name>" + book.getBookName() + "</book_name>\n";  

        result += "<pages>" + book.getPages() + "</pages>\n";  

        result += "<price>" + book.getPrice() + "</price>\n";  

        result += "<author>" + book.getAuthor() + "</author>\n";  

        result += "<isbn>" + book.getIsbn() + "</isbn>\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.getPrice() + "\",\n";  

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

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

        result += "}";  

        return result;  

    }  

  

0 0
原创粉丝点击