这个模式最大的特点:在父类中定义处理流程的框架,在子类中实现具体处理。这句话的意思就是父类只定义如何调用这些方法,但是具体怎么处理实现不同的问题是由子类实现的。该模式具有模板功能。
优点:可以让逻辑处理通用化,将子类共同的流程化步骤通过父类定义好流程算法,子类只需要完成自己具体化操作部分。
使用思考:
如何划分处理的级别,哪些处理需要由父类完成,哪些处理需要交给子类负责?
父类实现的方法太多可以让子类变的轻松,但是也降低了子类灵活性;反之父类定义的方法过少,子类会变的臃肿不堪,代码重复
![](https://img.haomeiwen.com/i3341490/4c1440f1c2f7539c.png)
小案例
AbstractDisplay.java
/**
* @Author:DarknessShadow
* @description:模板父类
* @date 2020/5/11 9:46
*/
public abstract class AbstractDisplay {
public abstract void open();
public abstract void print();
public abstract void close();
public void display(){
open();
for (int i = 0; i < 5; i++) {
print();
}
close();
}
}
CharDisplay.java
/**
* @Author:DarknessShadow
* @description:模板子类
* @date 2020/5/11 9:48
*/
public class CharDisplay extends AbstractDisplay{
private char ch;
public CharDisplay(char ch) {
this.ch = ch;
}
@Override
public void open() {
System.out.print("<<");
}
@Override
public void print() {
System.out.print(ch);
}
@Override
public void close() {
System.out.println(">>");
}
}
StringDisplay.java
/**
* @Author:DarknessShadow
* @description:模板子类
* @date 2020/5/11 9:49
*/
public class StringDisplay extends AbstractDisplay {
private String string;
private int width;
public StringDisplay(String string) {
this.string = string;
this.width = string.getBytes().length;
}
@Override
public void open() {
printLine();
}
private void printLine() {
System.out.print("+");
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.println("+");
}
@Override
public void print() {
System.out.println("|" + string +"|");
}
@Override
public void close() {
printLine();
}
}
Main.java
/**
* @Author:DarknessShadow
* @description:主测试类
* @date 2020/5/11 9:53
*/
public class Main {
public static void main(String[] args) {
AbstractDisplay d1 = new CharDisplay('H');
AbstractDisplay d2 = new StringDisplay("Hello,World.");
AbstractDisplay d3 = new StringDisplay("你好,世界。");
d1.display();
d2.display();
d3.display();
}
}
网友评论