美文网首页
交给子类(Template Method)

交给子类(Template Method)

作者: 鸡龙 | 来源:发表于2019-07-08 20:30 被阅读0次

    1、什么是交给子类

    在一个程序中,在相继承的类中,充当父类的类中定义处理流程的框架,在子类中实现具体处理的模式就称为Template Method模式。

    2、理解示例

    例子中,固定一个输出程序,固定输出框架实现输出字符和字符串不同输出情况时的输出。

    \ 类型 角色
    1 抽象类 AbstractDisplay 只实现了display方法的抽象类
    2 CharDisplay 实现了open、print、close方法的类
    3 StringDisplay 实现了open、print、close方法的类
    4 入口 Main 程序入口

    抽象类AbstractDisplay中有三个抽象方法和一个定义了流程框架方法。该类只实现了处理流程的框架且时display无法被重写

    public abstract class AbstractDisplay {
        public abstract void open();
        public abstract void print();
        public abstract void close();
        public final void display(){
            open();
            for(int i = 0;i<5;i++){
                print();
            }
            close();
        }
    }
    

    CharDisplay与StringDisplay各自实现了各自的open,print,close方法。

    public class CharDisplay extends AbstractDisplay {
        private char ch;
        public CharDisplay(char ch){
            this.ch = ch;
        }
        public void open() {
            System.out.print("<<");
        }
        public void print() {
            System.out.print(ch);
        }
        public void close() {
            System.out.println(">>");
        }
    }
    
        private String string;
        private int width;
        public StringDisplay(String string){
            this.string = string;
            this.width = string.getBytes().length;
        }
        public void open() {
            printLine();
        }
        public void print() {
            System.out.println("|"+string+"|");
        }
        public void close() {
            printLine();
        }
        private void printLine(){
            System.out.print("+");
            for(int i = 0;i<width;i++){
                System.out.print("-");
            }
            System.out.println("+");
        }
    }
    
    public class Main {
        public static void main(String [] agrs){
            AbstractDisplay d1 = new CharDisplay('H');
            AbstractDisplay d2 = new StringDisplay("Hello,world");
            AbstractDisplay d3 = new StringDisplay("你好,世界");
            d1.display();
            d2.display();
            d3.display();
        }
    }
    
    运行结果

    在程序中,父类就像一个指挥战场的将军,其下继承他的子类各司其职。这使程序中实现部分不一,但流程相同的部分不会再次实现流程而导致代码冗余。利用Chardisplay与Stringdisplay的继承类Abstractdisplay来使用dispaly,当流程中的出现bug只需要修改Abstractdisplay中的方法即可。

    相关文章

      网友评论

          本文标题:交给子类(Template Method)

          本文链接:https://www.haomeiwen.com/subject/hazahctx.html