目录
1 外观模式介绍
外观模式属于结构型模型
通过对现有的系统,添加一个新的接口,去隐藏掉系统的复杂性。
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这个子系统更加容易使用。
要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。
外观模式提供一个高层次的接口,使得子系统更易使用。
最大的缺点:
不符合开闭原则
2 案例和代码
比如现在疫情很严重,平时卖菜不同的小贩卖不同的食品,比如有卖蔬菜的、卖肉的、卖鸡蛋的、卖粮油的,没有疫情的时候,这些小贩单独卖这些吃的。
疫情来了,为了减少人员的接触,政府把一部分菜市场关了,为了让大家更便捷的买到各种吃的(为了捞油水),比如物业把各种吃的打包销售,以前我们买这些吃的要接触很多人,现在只需要接触物业就行。使得买吃的变得简单。
来看一下代码
原来有个小贩1负责卖菜
package com.qing.appearance;
public class Vendor1 {
public void sellVegetables(){
System.out.println("卖菜");
}
}
小贩2负责卖肉
package com.qing.appearance;
public class Vendor2 {
public void sellMeat(){
System.out.println("卖肉");
}
}
小贩3负责卖鸡蛋
package com.qing.appearance;
public class Vendor3 {
public void sellEgg(){
System.out.println("卖鸡蛋");
}
}
小贩4负责卖粮油
package com.qing.appearance;
public class Vendor4 {
public void sellRice(){
System.out.println("卖大米");
}
public void sellOil(){
System.out.println("卖食用油");
}
}
现在物业把这些小贩卖的东西都整合了,整成食品包,打包销售,一包含所有。
package com.qing.appearance;
public class Wuye {
Vendor1 vendor1 = new Vendor1();
Vendor2 vendor2 = new Vendor2();
Vendor3 vendor3 = new Vendor3();
Vendor4 vendor4 = new Vendor4();
public void sellFoodBag() {
vendor1.sellVegetables();
vendor2.sellMeat();
vendor3.sellEgg();
vendor4.sellRice();
vendor4.sellOil();
}
}
测试
package com.qing.appearance;
public class Test1 {
public static void main(String[] args) {
new Wuye().sellFoodBag();
}
}
结果
3 何时使用外观模式?
1 在设计初期阶段,应该有意识的将不同层分离,比如数据访问层、业务逻辑层和表示层的分离。这样可以为复杂的子系统提供一个简单的接口,使得耦合大大降低。
2 在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂。使用外观模式可以提供一个简单的接口,减少它们之间的依赖。
3 在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,但因为它包含非常重要的功能,新的需求开发需要依赖于它。此时用外观模式也是非常合适的。