用示例代码来帮你了解外观模式
对于“设计模式”这个词大家肯定都不陌生,很多框架也用到了设计模式,但是大部分的开发者应该是没有深入的了解过,我准备硬肝下这23设计模式作为专题文章的开端,一共23种设计模式,我尽量在<23天肝完。
为什么要学习设计模式:https://blog.csdn.net/kaituozhe_sh/article/details/107922339
在我大学四年,对设计模式也没有什么概念,写代码就想着能实现就可以了,不会有设计模式那样的思想,但是当学习到了框架的时候,对于设计模式才有了一些更深入的了解,使用设计模式的代码在扩展性上会比暴力的代码更容易维护,特别是当一个程序猿离职了后,你去接手它的代码,里面是一大堆if else,这样真的会崩溃,修改都不知道从何下手
硬肝系列目录
创建型模式
结构型模式
行为型模式
到目前为止、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