模板设计模式

模板设计模式

  • 定义
    1、模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
    2、简单说,模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤,这种类型的设计模式属于行为型模式。

模板方法模式

1、类图

2、模板方法

   public final void cooking(BigDecimal money) {
        Preconditions.checkArgument(money.doubleValue() > 0.0d , "enter an amount greater than 0");

        ReentrantLock lock = new ReentrantLock();
        Boolean flag;
        lock.lock();
        try {
            String name = "Crucian carp";
            int size = 6;
            flag = buyFish(money , size , name);
            if (flag) {
                Fish fish = FishListHolder.fishMap.get(name);
                cleanFish(fish , size);
                sideDishes(name);
                spices(name);
                onPot(name);
            }
        }finally {
            lock.unlock();
        }

    }

1、上面的 cooking 方法就是我们定义的模板方法,用来定义统一的执行流程,在模板类中我们可以定义相关的抽象方法并通过子类去加以实现,完成我们具体的方法的填充。
2、模板方法中包括 buyFishcleanFishsideDishesspicesonPot 等抽象方法

模板类具体实现

public class SteamedCookFish extends CookFish{

    @Override
    protected Boolean buyFish(BigDecimal money, int size, String name) {
        Fish fish = FishListHolder.fishMap.get(name);

        BigDecimal paymentAmount = BigDecimal.valueOf(size * fish.getUnitPrice());

        if (money.doubleValue() >= paymentAmount.doubleValue()) {
            return Boolean.TRUE;
        }
        return Boolean.FALSE;
    }

    @Override
    protected void cleanFish(Fish fish , int size) {
        System.out.println(String.format("Careful cleaning of [{%s}] pounds of [{%s}] fish" , size ,  fish.getName()));
    }

    @Override
    protected void sideDishes(String name) {
        System.out.println(String.format("Prepare the side dishes for the [{%s}] fish" , name));
    }

    @Override
    protected void spices(String name) {
        System.out.println(String.format("Prepare the seasoning for the  [{%s}] fish" , name));
    }

    @Override
    protected void onPot(String name) {
        System.out.println(String.format("Put the [{%s}] fish and seasoning into the pot" , name));
    }
}

1、到这里我们就完成了基本的实现了模板设计模式,本设计模式主要对烹饪 cooking 这个方法进行具体的拆分,从而达到流程控制的作用。

测试

  • 编写具体的测试类来进行我们模板方法的测试
public class TemplatePatterns {

    public static void main(String[] args) {

        CookFish cookFish = new SteamedCookFish();
        cookFish.cooking(new BigDecimal(100));

    }
}


1、通过上面步骤我们就完成了模板方法的编写

注意事项

1、模板类需要定义成抽象类 (abstract),具体的模板方法需要定义成 final 方法防止子类重写,分解的子类需要定义成 abstract 方法以便于子类进行扩充和实现

posted @ 2023-06-04 16:35  ayiZzzz  阅读(58)  评论(0)    收藏  举报