硬肝系列:23种设计模式之外观模式

用示例代码来帮你了解外观模式

对于“设计模式”这个词大家肯定都不陌生,很多框架也用到了设计模式,但是大部分的开发者应该是没有深入的了解过,我准备硬肝下这23设计模式作为专题文章的开端,一共23种设计模式,我尽量在<23天肝完。

为什么要学习设计模式:https://blog.csdn.net/kaituozhe_sh/article/details/107922339

在我大学四年,对设计模式也没有什么概念,写代码就想着能实现就可以了,不会有设计模式那样的思想,但是当学习到了框架的时候,对于设计模式才有了一些更深入的了解,使用设计模式的代码在扩展性上会比暴力的代码更容易维护,特别是当一个程序猿离职了后,你去接手它的代码,里面是一大堆if else,这样真的会崩溃,修改都不知道从何下手
在这里插入图片描述

硬肝系列目录

创建型模式

23种设计模式之工厂模式

23种设计模式之抽象工厂模式

23种设计模式之建造者模式

23种设计模式之原型模式

23种设计模式之单例模式

结构型模式

23种设计模式之适配器模式

23种设计模式之桥梁模式模式

23种设计模式之代理模式模式

23种设计模式之外观模式模式

23种设计模式之装饰器模式

23种设计模式之享元模式

23种设计模式之组合模式

行为型模式

23种设计模式之责任链模式

23种设计模式之命令模式

23种设计模式之迭代器模式

23种设计模式之中介者模式

23种设计模式之备忘录模式

23种设计模式之观察者模式

到目前为止、23种设计模式的创建型模式已经给大家肝完了,现在我们进入到一个全新的章节,结构型模式!!!

什么是外观模式

外观模式是一种提供给客户的模式,随着微模式的兴起,系统拆分的越来越多,越来越复杂,有时候客户要操作一个功能,需要与好几个系统交互,这显然是非常麻烦的,我先给大家上一幅图

在这里插入图片描述
如果使用外观模式呢?下图更为直观
在这里插入图片描述
也就是说,我是用外观模式,就是对外提供一个接口,接口里面包含了各种接口、类方法的逻辑,但是客户端可以直接和我这个外观接口直接进行交互,但是不代表我客户端就不能和我子系统直接交互了,只不过是外观接口帮你打包好了这些接口,你调用就行

这里我用之前的建造者模式给大家举得例子

```java
package designModels.BuilderModel03.model02;

import java.math.BigDecimal;

public interface Food {
    String name();
    BigDecimal price();
}

食物接口的定义,就将所有食物都做了一个规范,下面为接口实现类

import designModels.BuilderModel03.model02.Food;

import java.math.BigDecimal;
//可乐
public class cocaCola implements Food {
    @Override
    public String name() {
        return "cocaCola";
    }

    @Override
    public BigDecimal price() {
        return new BigDecimal(13);
    }
}
//玉米棒
public class corn implements Food {
    @Override
    public String name() {
        return "corn";
    }

    @Override
    public BigDecimal price() {
        return new BigDecimal(16);
    }
}
//双层汉堡
public class doubleHamburger implements Food {
    @Override
    public String name() {
        return "doubleHamburger";
    }

    @Override
    public BigDecimal price() {
        return new BigDecimal(52);
    }
}
//鳕鱼堡
public class fishBurger implements Food {
    @Override
    public String name() {
        return "fishBurger";
    }

    @Override
    public BigDecimal price() {
        return new BigDecimal(32);
    }
}
//汉堡
public class hamburger implements Food {
    @Override
    public String name() {
        return "hamburger";
    }

    @Override
    public BigDecimal price() {
        return new BigDecimal(36);
    }
}
//辣翅
public class spicyChicken implements Food {
    @Override
    public String name() {
        return "spicyChicken";
    }

    @Override
    public BigDecimal price() {
        return new BigDecimal(18);
    }
}

定义一菜单接口:

package designModels.BuilderModel03.model02;

public interface McMenu {
	//入参为food,food里面包含了多种食物的信息
    McMenu append(Food food);
    //套餐A
    String printFacadeA();
    //套餐B
    String printFacadeB();
    //套餐C
    String printFacadeC();
}

建造类(菜单实现类)

package designModels.BuilderModel03.model02.impl;

import designModels.BuilderModel03.model02.McMenu;
import designModels.BuilderModel03.model02.Food;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

public class Builder implements McMenu {
    List<Food> foodList = new ArrayList<>();
    BigDecimal price = new BigDecimal(0);
    @Override
    public McMenu append(Food food) {
        foodList.add(food);
        price = price.add(food.price());
        return this;
    }
    @Override
    public String printFacadeA() {
        StringBuilder str = new StringBuilder();
        System.out.println("我是套餐A : " + "\n");
        str.append(new doubleHamburger().name() + "\n");
        str.append(new cocaCola().name() + "\n");
        str.append(new spicyChicken().name() + "\n");
        str.append("套餐A优惠价格 : 38$");
        return str.toString();
    }

    @Override
    public String printFacadeB() {
        StringBuilder str = new StringBuilder();
        System.out.println("我是套餐B : " + "\n");
        str.append(new hamburger().name() + "\n");
        str.append(new doubleHamburger().name() + "\n");
        str.append(new corn().name() + "\n");
        str.append("套餐B优惠价格 : 58$");
        return str.toString();
    }

    @Override
    public String printFacadeC() {

        StringBuilder str = new StringBuilder();
        System.out.println("我是套餐C : " + "\n");
        str.append(new hamburger().name() + "\n");
        str.append(new corn() + "\n");
        str.append("套餐C优惠价格 : 28$");
        return str.toString();
    }
}

我们来测试一下我们的代码:

		Builder A = new Builder();
        System.out.println(A.printFacadeA());

打印结果:

我是套餐A : 

doubleHamburger
cocaCola
spicyChicken
套餐A优惠价格 : 38$

为什么还留了一个append方法呢?因为不是点完套餐就不能单点其他的食物了,也表明我外观模式只是提供了一个接口,里面封装了其他的方法,你可以调也可以不用,不是强制性的

完成:TO: 2021/3/22 20:51

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉淀顶峰相见的PET

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值