【设计模式】模板方法模式和门面模式

模板方法模式

模板方法模式非常简单,就是定义了一个固定的公共流程,整个流程有哪些步骤是事先定义好的,具体的步骤则交由子类去实现。属于行为型设计模式。
简单来说就是将公共的行为抽取出来放到父类中实现,不同的行为则交给子类自己实现

代码示例

模板模式十分简单,我们用其实现一个去银行办理业务的例子,无论你去银行办理什么业务,都需要经过: 取号,排队,办理业务几个步骤 ,这里还增加了一个钩子方法,对于某些特殊的情形,可以增加额外的处理步骤

public abstract class AbstractBank {

    public void doBiz() {
        if(!isVip()) {
            getNum();
            waitForCall();
        }
        doBusiness();
    }

    protected abstract boolean isVip();

    public abstract void doBusiness();

    private void waitForCall() {
        System.out.println("排队中,等待叫号...");
    }

    private void getNum() {
        System.out.println("取号,准备排队...");
    }

}

public class CrashBusiness extends AbstractBank{

    @Override
    protected boolean isVip() {
        return false;
    }

    @Override
    public void doBusiness() {
        System.out.println("办理现金业务...");
    }
}
public class DebitBusiness extends AbstractBank{

    @Override
    protected boolean isVip() {
        return true;
    }

    @Override
    public void doBusiness() {
        System.out.println("办理贷款业务.....");
    }
}
public class Test {
    public static void main(String[] args) {
        CrashBusiness crashBusiness = new CrashBusiness();
        crashBusiness.doBiz();
        new DebitBusiness().doBiz();
    }
}

门面模式

门⾯模式,也叫外观模式,英⽂全称是 Facade Design Pattern。
在 GoF 的《设计模式》⼀书中,门⾯模式是这样定义的:

Provide a unified interface to a set of interfaces in a subsystem. Facade Pattern defines a higher-level interface that makes the subsystem easier to use.

门⾯模式为⼦系统提供⼀组统⼀的接⼝,定义⼀组⾼层接⼝让⼦系统更易⽤。属于结构型模式。

经典的例子就是app和服务端的交互,app有一个复杂模块,需要从三个系统获取对应的数据来组装,如果app之间和三个系统交互,就要进行三次网络传输,增加一个中间层,将三个系统的接口进行整合封装,对外提供一个接口给app调用,那么就能明显提高性能

代码示例

我们需要根据用户的账号获取其订单信息, 那么我们先需要根据用户账号判断其是否已登录,已登录的用户才可以 根据其账号获取到对应的id,然后再获取id对应的订单信息


public class LoginService {

    public boolean isLogin(String account) {
        return true;
    }
}

public class GetUserInfo {

    public int getUserId(String account) {
        System.out.println("根据用户名称获取用户id");
        return 1;
    }
}
public class GetUserOrderList {

    public List<String> getOrderList(Integer id) {
        System.out.println("根据用户id找出其订单");
        return new ArrayList<>();
    }
}

public class OrderService {

    GetUserInfo userInfo = new GetUserInfo();
    GetUserOrderList userOrderList = new GetUserOrderList();
    LoginService loginService = new LoginService();

    public List<String> getOrderByUser(String account) throws Exception {
        if (loginService.isLogin(account)) {
            Integer id = userInfo.getUserId(account);
            return userOrderList.getOrderList(id);
        }
        throw new Exception("not login");
    }
}
public class Test {

    public static void main(String[] args) throws Exception {
        OrderService service = new OrderService();
        service.getOrderByUser("xiaoming");
    }
}

门面模式的应用场景

  1. 解决易⽤性问题

门⾯模式可以⽤来封装系统的底层实现,隐藏系统的复杂性,提供⼀组更加简单易⽤、更⾼层的接⼝。⽐如,Linux 系统的调⽤函数就可以看作⼀种“门⾯”。它是 Linux 操作系统暴露给开发者的⼀组“特殊”的编程接⼝,它封装了底层更基础的 Linux 内核调⽤。
从隐藏实现复杂性,提供更易⽤接⼝这个意图来看,门⾯模式有点类似之前讲到的迪⽶特法则(最少知道原则)和接⼝隔离原则:两个有交互的系统,只暴露有限的必要的接⼝。
除此之外,门⾯模式还有点类似之前提到封装、抽象的设计思想,提供更抽象的接⼝,封装底层实现细节。

  1. 解决性能问题
    通过将多个接⼝调⽤替换为⼀个门⾯接⼝调⽤,减少⽹络通信成本,提⾼ App 客户端的响应速度。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值