设计模式之---模版方法模式

in #steemit7 years ago (edited)

模版方法模式

定义

Define the skeleton of an algorithm in an operation, defer-ring some steps to subclasses. Template Method lets subclassesredefine certain steps of an algorithm without changing the al-gorithm's structure.(在父类中处理处理流程的框架,在子类中实现具体处理的模式称为模板方法模式)
类图:略

优点

  • 封装不变部分,扩展可变部分
  • 提取公共部分代码,方便维护
  • 行为由父类控制,子类实现

缺点

  • 和依赖倒置原则相违背
  • 复杂项目中可读性差

使用场景

  • 多个子类有公共方法,并且逻辑基本相同
  • 重要复杂的算法,可以把核心算法交由父类,核心算法交给子类
  • 重构时,将公共方法抽取到父类,具体实现写成抽象方法,或者钩子函数,交由子类完成

用例

父类

public abstract class AbsstractDisplay {
    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();
    }
}

子类

public class CharDisplay extends AbsstractDisplay {
    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(">>");
    }
}
public class StringDisplay extends AbsstractDisplay {
    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 Test {
    public static void main(String[] args) {
        AbsstractDisplay display1=new CharDisplay('A');
        AbsstractDisplay display2=new StringDisplay("模版方法模式");
        AbsstractDisplay display3=new StringDisplay("So easy");
        display1.display();
        display2.display();
        display3.display();
    }
}

运行结果:

<<AAAAA>>
+------------------+
|模版方法模式|
|模版方法模式|
|模版方法模式|
|模版方法模式|
|模版方法模式|
+------------------+
+-------+
|So easy|
|So easy|
|So easy|
|So easy|
|So easy|
+-------+

不建议这样做

  • 把子类传递到弗雷的有参构造器中,然后调用
  • 使用反射的方式调用(破坏了封装性)
  • 父类调用子类的静态方法。

Coin Marketplace

STEEM 0.26
TRX 0.20
JST 0.038
BTC 96270.61
ETH 3631.10
USDT 1.00
SBD 3.88