外观模式(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!

对于简单的流程,使用外观模式会提高带码的复杂度,得不偿失

posted @ 2013-06-08 13:09  心意合一  阅读(174)  评论(0编辑  收藏  举报