模板方法设计模式

模板设计模式——我的理解


通俗点的理解就是 :完成一件事情,有固定的数个步骤,但是每个步骤根据对象的不同,而实现细节不同;就可以在父类中定义一个完成该事情的总方法,按照完成事件需要的步骤去调用其每个步骤的实现方法。每个步骤的具体实现,由子类完成。

模板模式的类图


在这里插入图片描述

如模板方法模式结构图所知,有两个类:
AblstractClass(抽象类):

在抽象类中定义了一系列的操作PrimitiveOperation,每个操作可以使具体的,也可以是抽象的,每个操作对应一个算法的步骤,在子类中可以重新定义或实现这些步骤。TmplateMethod()这个方法用于定义一个算法结构,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。

ConcreteClass(具体子类):

用于实现在父类中声明的抽象基本操作,也可以覆盖在父类中已经实现的具体基本操作。

演示代码


来举个例子: 比如我们做菜可以分为三个步骤

  1. 备料
  2. 具体做菜
  3. 盛菜端给客人享用,
    这三部就是算法的骨架;然而做不同菜需要的料,做的方法,以及如何盛装给客人享用都是不同的这个就是不同的实现细节。

下来我们就代码实现如下:

a. 先来写一个抽象的做菜父类
   	public abstract class DodishTemplate {    
   	    /**
   	     * 具体的整个过程
   	     */
   	    protected void dodish(){
   	        this.preparation();
   	        this.doing();
   	        this.carriedDishes();
   	    }
   	    /**
   	     * 备料
   	     */
   	    public abstract void preparation();
   	    /**
   	     * 做菜
   	     */
   	    public abstract void doing();
   	    /**
   	     * 上菜
   	     */
   	    public abstract void carriedDishes ();
   	}       
b.下来做两个番茄炒蛋(EggsWithTomato)和红烧肉(Bouilli)实现父类中的抽象方法
   	 /**
   	 * 西红柿炒蛋
   	 * @author aries
   	 */
   	public class EggsWithTomato extends DodishTemplate{

   	    @Override
   	    public void preparation() {
   	        System.out.println("洗并切西红柿,打鸡蛋。");
   	    }

   	    @Override
   	    public void doing() {
   	        System.out.println("鸡蛋倒入锅里,然后倒入西红柿一起炒。");
   	    }

   	    @Override
   	    public void carriedDishes() {
   	        System.out.println("将炒好的西红寺鸡蛋装入碟子里,端给客人吃。");
   	    }
   	}
   	 /**
   	 * 红烧肉
   	 * @author aries
   	 *
   	 */
   	public class Bouilli extends DodishTemplate{

   	    @Override
   	    public void preparation() {
   	        System.out.println("切猪肉和土豆。");
   	    }

   	    @Override
   	    public void doing() {
   	        System.out.println("将切好的猪肉倒入锅中炒一会然后倒入土豆连炒带炖。");
   	    }

   	    @Override
   	    public void carriedDishes() {
   	        System.out.println("将做好的红烧肉盛进碗里端给客人吃。");
   	    }
   	}
c. 在测试类中我们来做菜:
		public class App {
		    public static void main(String[] args) {
		        DodishTemplate eggsWithTomato = new EggsWithTomato();
		        eggsWithTomato.dodish();
		        
		        System.out.println("-----------------------------");
		        
		        DodishTemplate bouilli = new Bouilli();
		        bouilli.dodish();
		    }
		}
这样我们就实现了使用模板模式的一个完整的实例。

模板模式的优点


  1. 具体细节步骤实现定义在子类中,子类定义详细处理算法是不会改变算法整体结构。
  1. 代码复用的基本技术,在数据库设计中尤为重要。
  2. 存在一种反向的控制结构,通过一个父类调用其子类的操作,通过子类对父类进行扩展增加新的行为,符合“开闭原则”。

不足

每个不同的实现都需要定义一个子类,会导致类的个数增加,系统更加庞大。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值