外观模式(Facade Pattern)
外观模式定义:外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
这个模式比较简单,一个普通流程:洗脸 - 刷牙 - 穿衣 - 背包
public class Face { public void wash(){ System.out.println("Wash face!"); } }
public class Cloth { public void wear(){ System.out.println("Wear cloth!"); } }
public class Tooth { public void brush(){ System.out.println("Brush tooth!"); } }
public class Bag { public void prepare(){ System.out.println("Prepare bag!"); } }
public class Client { public static void main(String[] args) { Face f = new Face(); Tooth t = new Tooth(); Cloth c = new Cloth(); Bag b = new Bag(); f.wash(); t.brush(); c.wear(); b.prepare(); } }
Wash face! Brush tooth! Wear cloth! Prepare bag!假使一个流程非常复杂,如:闹铃响了 - 关掉闹铃 - 打个哈欠 - 坐起来 - 伸懒腰 - ... - 出门,如果沿用上面的设计方式,则Client被具体的实现方式所捆绑,与此同时,如此复杂的一套流程由于是在Client内部实现,不具有复用性
站在Client的角度思考,我并不关心出门这个流程的具体实现细节,关注的是出门这个功能,如此一来,我们应该考虑到封装流程的具体实现细节,对外提供某一功能
在原有的子系统之上提供一个简单的接口以供使用,使Client和复杂的实现流程解耦,并且极大的提高了流程的复用性,扩展性也较高
隐藏具体的实现过程,对外提供一个简单的接口以供使用,这就是外观模式
特别要注意的是,外观模式并没有封装子系统(封装的是具体的实现流程),如果需要,依然可以自由的调用子系统中的类
public class Go { public void goOutside(){ Face f = new Face(); Tooth t = new Tooth(); Cloth c = new Cloth(); Bag b = new Bag(); f.wash(); t.brush(); c.wear(); b.prepare(); } }
public class Client { public static void main(String[] args) { Go g = new Go(); g.goOutside(); } }
Wash face! Brush tooth! Wear cloth! Prepare bag!
对于简单的流程,使用外观模式会提高带码的复杂度,得不偿失