Java设计模式-模板模式(三)

本文详细介绍了模板模式的概念,通过UML图展示其角色,并提供了一个Java示例,探讨如何利用模板模式实现逻辑通用化、父类与子类协作,以及一致性原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

目录

一、什么是模板模式

二、UML图

三、示例程序

四、拓展思路与注意事项

1、可以使逻辑处理通用化

2、父类与子类之间的协作

3、父类与子类的一致性

 


 

一、什么是模板模式

在父类中定义处理流程的框架,在子类中实现具体处理的模式就称为模板模式(Template Method)

二、UML图

登场角色:

1、AbstractClass(抽象类)

抽象类角色不仅负责实现模板方法,还负责声明在模板方法中所使用到的抽象方法。这些抽象方法由子类ConcreteClass角色负责实现。

2、ConcreteClass(具体类)

该角色负责具体实现AbstractClass角色中定义的抽象方法。这里实现的方法将会在AbstractClass角色的模板方法中被调用,由CharDisplay类和StringDisplay类扮演此角色。

三、示例程序

1、Abstract类

package com.as.module.template;

/**
 * 字符展示类
 * @author Andy
 * @date 2021/4/22 20:55
 */
public class CharDisplay extends AbstractDisplay {
    private char cn;

    public CharDisplay(char cn) {
        this.cn = cn;
    }

    @Override
    public void open() {
        System.out.print("<<");
    }

    @Override
    public void print() {
        System.out.print(cn);
    }

    @Override
    public void close() {
        System.out.println(">>");
    }
}

2、CharDisplay类

package com.as.module.template;

/**
 * 字符展示类
 * @author Andy
 * @date 2021/4/22 20:55
 */
public class CharDisplay extends AbstractDisplay {
    private char cn;

    public CharDisplay(char cn) {
        this.cn = cn;
    }

    @Override
    public void open() {
        System.out.print("<<");
    }

    @Override
    public void print() {
        System.out.print(cn);
    }

    @Override
    public void close() {
        System.out.println(">>");
    }
}

3、StringDisplay类

package com.as.module.template;

/**
 * 字符展示类
 * @author Andy
 * @date 2021/4/22 20:55
 */
public class CharDisplay extends AbstractDisplay {
    private char cn;

    public CharDisplay(char cn) {
        this.cn = cn;
    }

    @Override
    public void open() {
        System.out.print("<<");
    }

    @Override
    public void print() {
        System.out.print(cn);
    }

    @Override
    public void close() {
        System.out.println(">>");
    }
}

4、TestTemplate类

package com.as.module.template;

/**
 * 模板模式测试类
 * @author Andy
 * @date 2021/4/22 21:02
 */
public class TestTemplate {
    public static void main(String[] args) {
        //生成一个持有'H'的CharDisplay类的实例
        AbstractDisplay d1 = new CharDisplay('H');

        //生成一个持有'Hello,World.'的StringDisplay类的实例
        AbstractDisplay d2 = new StringDisplay("Hello,World.");
        //生成一个持有'你好,世界'的StringDisplay类的实例
        AbstractDisplay d3 = new StringDisplay("你好,世界.");
        d1.display();
        d2.display();
        d3.display();

    }
}

运行结果:

 

四、拓展思路与注意事项

1、可以使逻辑处理通用化

它的优点是由于在父类的模板方法中编写了算法,因此无需在每个子类中再编写算法

2、父类与子类之间的协作

模板模式中,父类与子类是紧密相连,共同工作的。因此,在子类中实现父类中声明的抽象方法时,必须要理解这些抽象方法被调用的时机

3、父类与子类的一致性

在示例程序中,不论是CharDisplay的实例还是StringDisplay的实例,都是先保存在AbstractDisplay类型的变量中,然后再来调用display的方法的。

使用父类类型的变量保存子类实例(如下图)的优点是,即使没有用instanceof等指定子类的种类,程序也能正常工作

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值