作为一个编程菜鸟,过去在学习设计模式的时候,老师给推荐了一本《大话设计模式》。阅读以后受益匪浅,可惜当初没有坚持看完。
最近有时间了,又重新捡起来学习了一遍,整理了一下笔记,由于本人能力有限,欢迎大家批评指正。
1.外观模式 Facade Pattern
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
2.uml类图
3.组成
(1)外观类(Facade)
它需要了解所有的子系统的方法或属性,进行组合,以备外界调用。为子系统提供一个共同的对外接口。
(2)子系统类集合(SubSystem Classes)
实现子系统的功能,处理Facade对象指派的任务,注意子类中没有Facade的任何信息,即没有对Facade对象的引用。
(3)客户端(Clients)
客户对象通过一个外观接口读写子系统中各接口的数据资源。
4.优点
- 实现了子系统与客户端之间的松耦合关系。
- 客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。
5.应用场景
- 设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。比如经典的三层架构,考虑在数据访问层、业务逻辑层和表示层的层与层之间建立外观Facade。
- 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口,减少依赖降低耦合。
- 维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。
6.实例
(1)菜品子系统类集合
package com.longinus.fp;
public class BigFrenchFries {
public void sell(){
System.out.print("大薯 ");
}
}
package com.longinus.fp;
public class MidFrenchFries {
public void sell(){
System.out.print("中薯 ");
}
}
package com.longinus.fp;
public class MinFrenchFries {
public void sell(){
System.out.print("小薯条 ");
}
}
package com.longinus.fp;
public class Hamburger {
public void sell(){
System.out.print("热辣鸡腿堡 ");
}
}
package com.longinus.fp;
public class FriedChicken {
public void sell(){
System.out.print("吮指原味鸡 ");
}
}
package com.longinus.fp;
public class Cola {
public void sell(){
System.out.print("可乐 ");
}
}
(2)kfc窗口类
package com.longinus.fp;
public class KfcFacade {
Hamburger hb;
BigFrenchFries bf;
MidFrenchFries mdf;
MinFrenchFries mif;
FriedChicken fc;
Cola ca;
public KfcFacade(){
hb = new Hamburger();
bf = new BigFrenchFries();
mdf = new MidFrenchFries();
mif = new MinFrenchFries();
fc = new FriedChicken();
ca = new Cola();
}
public void SetMealA(){
System.out.print("你购买了套餐A:");
hb.sell();
mdf.sell();
ca.sell();
System.out.println();
}
public void SetMealB(){
System.out.print("你购买了套餐B:");
mif.sell();
System.out.println();
}
public void SetMealC(){
System.out.print("你购买了套餐C:");
fc.sell();
bf.sell();
ca.sell();
System.out.println();
}
}
(3)测试类
package com.longinus.fp;
public class Test {
public static void main(String[] args) {
KfcFacade kfc = new KfcFacade();
kfc.SetMealC();
}
}
(4)输出结果
你购买了套餐C:吮指原味鸡 大薯 可乐