模板方法模式

模式定义

准备一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。

该模式中包含的角色及其职责

Ø 抽象模板角色

定义一个或多个抽象动作,以便让子类去实现;定义并实现一个模板方法。

Ø 具体模板角色

   实现父类所定义的一个或多个抽象方法;每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法的不同实现。

优缺点

模板方法的优点

Ø 模板方法模式在一个类中形式化地定义算法,而由它的子类实现细节的处理。

Ø 模板方法模式是一种代码复用的基本技术。

Ø 模板方法模式导致一种反向的控制结构,通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,符合“开闭原则”。

模板方法的缺点

Ø 每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。

使用场景

Ø 一次性实现一个算法不变的部分,并将可变的行为留给子类来实现。

Ø 各子类中公共的行为应该被提取出来并集中到一个公共父类中,以避免代码重复。

模板方法模式的一个小例子

public abstract class AbstractDisplay {
    // 由子类实现的抽象方法
    public abstract void open();

    public abstract void print();

    public abstract void close();

    // 抽象类实现的方法,final可以保证在子类不会被修改
    public final void display() {
        open(); // 先open...
        for (int i = 0; i < 5; i++) { // 反复输出5次
            print();
        }
        close(); // 输出完毕,close
    }
}
public class CharDisplay extends AbstractDisplay {
    private char ch; // 应输出的字符

    public CharDisplay(char ch) { // 把构造函数传递过来的字符ch,存储在字段内
        this.ch = ch;
    }

    public void open() {
        System.out.print("<<"); // 输出"<<"作为开始字符串
    }

    public void close() {
        System.out.println(">>"); // 输出 ">>"作为结束字符串
    }

    public void print() {
        System.out.print(ch); // 输出存储在字段的字符
    }

}
public class StringDisplay extends AbstractDisplay {
    private String string; // 应输出的字符串
    private int width; // 以byte为单位所求出的字符串的"长度"

    public StringDisplay(String string) {
        this.string = string;
        width = string.getBytes().length;
    }

    public void open() { // 打印头装饰字符串
        printLine();
    }

    public void print() { // 打印内容
        System.out.println("|" + string + "|");
    }

    public void close() { // 打印尾装饰字符串
        printLine();
    }

    public 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[] args) {
        // 建立1个有'A'的CharDisplay的对象
        AbstractDisplay d1 = new CharDisplay('A');
        // 建立1个有"Hello world"的StringDisplay的对象
        AbstractDisplay d2 = new StringDisplay("Hello World");

        // d1,d2都是AbstractDisplay的子类对象,可以调用继承到的display()方法
        d1.display();
        d2.display();
    }
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值