模板方法模式
来源:互联网 发布:阿里云企业邮箱app 编辑:程序博客网 时间:2024/06/08 12:35
模式定义
准备一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。
该模式中包含的角色及其职责
Ø 抽象模板角色
定义一个或多个抽象动作,以便让子类去实现;定义并实现一个模板方法。
Ø 具体模板角色
实现父类所定义的一个或多个抽象方法;每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法的不同实现。
优缺点
模板方法的优点
Ø 模板方法模式在一个类中形式化地定义算法,而由它的子类实现细节的处理。
Ø 模板方法模式是一种代码复用的基本技术。
Ø 模板方法模式导致一种反向的控制结构,通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,符合“开闭原则”。
模板方法的缺点
Ø 每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。
使用场景
Ø 一次性实现一个算法不变的部分,并将可变的行为留给子类来实现。
Ø 各子类中公共的行为应该被提取出来并集中到一个公共父类中,以避免代码重复。
模板方法模式的一个小例子
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(); }}
- 深入浅出模板方法模式
- 模板方法模式
- 模板方法模式
- 模板方法模式
- 模板方法设计模式
- 模板方法模式
- 模板方法模式
- 模板方法模式
- 模板方法模式
- 模板方法模式
- 模板方法模式
- 模板方法模式
- 模板方法模式
- 模板方法模式
- TemplateMethod模板方法模式
- 模板方法模式
- 模板方法模式
- 模板方法模式
- Shell学习笔记(1)
- jvm 优化,很好
- js 返回上一页和刷新
- 在Activity中实现定时屏保(定时10秒,间隔5秒钟切换图片)
- Eclipse中设置在创建新类时自动生成注释
- 模板方法模式
- Window XP驱动开发(二十四)虚拟串口设备驱动
- Android应用程序框架思路整理
- netfilter例子改写4
- node和block
- 改变编译器字节对齐条件的简单说明
- Android说明设置界面布局
- C++程序员之路深入探讨QueryInterface
- python的cookie操作