设计模式:外观模式(Facade)
外观模式:为子系统中的一组接口提供一个一致的界面。隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。
Facade一个典型的应用就是数据库JDBC的应用。Facade实际上是个理顺系统间关系,降低系统间耦合度的一个常用的办法。
创建一个 Animal 接口和实现了 Animal 接口的实体类。下一步是定义一个外观类 AnimalMaker。
AnimalMaker 类使用实体类来代表用户对这些类的调用。FacadePatternDemo,我们的演示类使用AnimalMaker 类来显示结果。
创建一个接口。
Animal.java
public interface Animal {
void sing();
}
创建实现接口的实体类。
Dog.java
public class Dog implements Animal {
@Override
public void sing() {
System.out.println("Inside Dog::sing() method.");
System.out.println("what's dog sing: 汪汪汪.");
}
}
Pig.java
public class Pig implements Animal {
@Override
public void sing() {
System.out.println("Inside Pig::sing() method.");
System.out.println("what's pig sing: 哼哼哼.");
}
}
Fox.java
public class Fox implements Animal {
@Override
public void sing() {
System.out.println("Inside Fox::sing() method.");
System.out.println("what's fox sing: 叮叮叮.");
}
}
创建一个外观类。
AnimalMaker.java
public class AnimalMaker {
private Animal dog;
private Animal pig;
private Animal fox;
public AnimalMaker() {
dog = new Dog();
pig = new Pig();
fox = new Fox();
}
public void singDog() {
dog.sing();
}
public void singPig() {
pig.sing();
}
public void singFox() {
fox.sing();
}
}
使用该外观类找出各种类型的动物。
FacadePatternDemo.java
public class FacadePatternDemo {
public static void main(String[] args) {
AnimalMaker animalMaker = new AnimalMaker();
animalMaker.singDog();
animalMaker.singPig();
animalMaker.singFox();
}
}
验证输出。
Inside Dog::sing() method.
what's dog sing: 汪汪汪.
Inside Pig::sing() method.
what's pig sing: 哼哼哼.
Inside Fox::sing() method.
what's fox sing: 叮叮叮.
优点:
减少系统相互依赖。
提高灵活性。
提高了安全性。
缺点:
不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
使用场景:
为复杂的模块或子系统提供外界访问的模块。
子系统相对独立。
预防低水平人员带来的风险。
本文参考了Patterns in Java 和 http://www.runoob.com