模式定义:
外观模式提供一个统一的接口,用来访问子系统中的一群接口。
外观模式定义了一个高层接口,让子系统更容易使用。
模式结构:
模式实现:
public class FacadeMode {
/**
* 刷牙
*/
class Brush {
public void brush() {
System.out.println("brush teeth");
}
}
/**
* 洗脸
*/
class Wash {
public void wash() {
System.out.println("wash face");
}
}
/**
* 化妆
*/
class Makeup {
public void makeUp() {
System.out.println("make up");
}
public void makeDown() {
System.out.println("make down");
}
}
/**
* 包含子类对象
*/
class Man {
Brush brush;
Wash wash;
Makeup makeup;
public Man(Brush brush, Wash wash, Makeup makeup) {
this.brush = brush;
this.wash = wash;
this.makeup = makeup;
}
/**
* 出发前准备
*/
public void readyGo() {
System.out.println("ready go !!!");
brush.brush();
wash.wash();
makeup.makeUp();
}
/**
* 睡觉前准备
*/
public void readySleep() {
System.out.println("ready sleep !!!");
makeup.makeDown();
brush.brush();
wash.wash();
}
}
/**
* 测试类
*/
@Test
public void facadeTest() {
//创建子类对象
Brush brush = new Brush();
Wash wash = new Wash();
Makeup makeup = new Makeup();
//创建外观对象,并调用其方法
Man man = new Man(brush, wash, makeup);
man.readyGo();
man.readySleep();
}
}
模式优点:
1、引入外观模式,是客户对子系统的使用变得简单了,减少了与子系统的关联对象,实现了子系统与客户之间的松耦合关系
2、只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类
3、降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程
模式缺点:
1、不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性
2、在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”
适用场景:
1、当要为一个复杂子系统提供一个简单接口时可以使用外观模式
2、客户程序与多个子系统之间存在很大的依赖性。引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性