模板方法设计模式和门面模式就该这么学
Posted 小鱼与Java
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板方法设计模式和门面模式就该这么学相关的知识,希望对你有一定的参考价值。
模板方法模式
产品经理需求分析 → UI设计原型图 → 开发人员进行开发 → 测试 → 上线
/**
* 软件开发工厂
*/
public class ProductsFactory {
private void analysisDemand() {
System.out.println("需求分析");
}
private void pageDesign() {
System.out.println("页面原型设计");
}
private void develop() {
System.out.println("程序员进行开发");
}
private void test() {
System.out.println("进行测试");
}
/**
* 发行一个完整的项目
*/
public void getProduct() {
analysisDemand();
pageDesign();
develop();
test();
}
}
就这样,一个项目就完全生产成功了。但是,当一个新的项目来了之后,我们还是要按照这个流程再来一次,而且这个流程的顺序是不能变的。所以,面对不同的项目我们就要复制这个类,而且,它的getProduct()方法中的方法调用顺序不可改变。我们对上边这个类进行抽象一次,写出了如下类:
package cn.lyn4ever;
/**
* 软件流程的模板
* <p>
* 1. 这里使用的是抽象类而不是接口
* 2. 在Jdk8及以后,接口中也可以不非抽象方法
*/
public abstract class ProductTemplate {
abstract void analysisDemand();
abstract void pageDesign();
abstract void develop();
abstract void test();
/**
* 发行一个完整的项目的流程
*/
public void getProduct() {
analysisDemand();
pageDesign();
develop();
test();
}
}
这时,当我们想要进行开发其它项目时,只需要继承这个抽象类,并实现自己对应的这四个方法,就可以了。虽然不同的项目,这四个步骤的具体实现不一样,但是它们的流程就是getProduct()中的方法。
tips
这么做的好处是定义了一个特定而且不可变的算法骨架(本例中的软件开发流程),子类只能对算法中的每一步进行修改,而不能修改算法的流程和走向。
将每一步的实现都延迟到了子类中,如果要在这个流程中添加一个,只需要修改这个类中的getProduc()方法,让子类自己去实现。
门面模式
package cn.lyn4ever;
/**
* 进行开发的程序员们
*/
public class Coder {
private ClientCoder coderA;
private ClientCoder coderB;
private ServerCoder coderC;
private ServerCoder coderD;
public Coder(ClientCoder coderA, ClientCoder coderB, ServerCoder coderC, ServerCoder coderD) {
this.coderA = coderA;
this.coderB = coderB;
this.coderC = coderC;
this.coderD = coderD;
}
/**
* 开发产品A
*/
public void getProductA() {
coderA.coding();
coderB.coding();
coderD.coding();
}
/**
* 开发产品B
*/
public void getProductB() {
coderB.coding();
coderC.coding();
}
}
也就是说,产品经理只需要对接技术主管这个"Facde"就可以拿到这个产品,而不用去对接程序员。UML图如下:
当然,产品经理也可有一个“门面”
两者的异同
相同之处:都体现了面向对象的“封装”特点
不同之处:模板方法模式是定义了一套“模板”,而模板的步骤中的实现是由子类完成的,也就是有一定的“开放—封闭”。而门面模式是完全封闭的,只对你提供一个调用入口,对我内部的实现,你无权查看和修改
Java学习
设计模式
数组结构算法
小鱼与Java
以上是关于模板方法设计模式和门面模式就该这么学的主要内容,如果未能解决你的问题,请参考以下文章