外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
这种模式是我们日常开发经常用到的设计模式,也就是当我们对外提供服务时只是对每个服务提供一个接口,可能这个服务内部包含着相对复杂的算法与步骤,我们需要去调用多个服务甚至更多的Dao层去实现这个服务的需求,我们无意中就 用到了这种模式。看下代码实现你就知道是什么了。
子系统A的方法:
public class SystemA {
public void add(){
System.out.println("添加系统A数据");
}
public void update(){
System.out.println("修改系统A数据");
}
public void edit(){
System.out.println("删除系统A数据");
}
}
子系统B的方法:
public class SystemB {
public void add(){
System.out.println("添加系统B数据");
}
public void update(){
System.out.println("修改系统B数据");
}
public void edit(){
System.out.println("删除系统B数据");
}
}
服务接口:
public interface Service {
public void addSomething();
public void upadteSomething();
public void editSomething();
}
服务接口实现与测试Client
public class ServiceIml implements Service {
SystemA a = new SystemA();
SystemB b = new SystemB();
@Override
public void addSomething() {
System.out.println("do something");
a.add();
System.out.println("do something");
b.add();
System.out.println("do something");
System.out.println("添加成功");
}
@Override
public void upadteSomething() {
System.out.println("do something");
a.update();
System.out.println("do something");
b.update();
System.out.println("do something");
System.out.println("修改成功");
}
@Override
public void editSomething() {
System.out.println("do something");
a.edit();
System.out.println("do something");
b.edit();
System.out.println("do something");
System.out.println("删除成功");
}
//client
public static void main(String[] args) {
Service s = new ServiceIml();
s.addSomething();
s.upadteSomething();
s.editSomething();
}
}
测试结果:
do something
添加系统A数据
do something
添加系统B数据
do something
添加成功
do something
修改系统A数据
do something
修改系统B数据
do something
修改成功
do something
删除系统A数据
do something
删除系统B数据
do something
删除成功
这就是所谓的外观模式。外观模式是一个高频率使用的设计模式,它的精髓就在于封装二字。通过一个高层次结构为用户提供统一的 API 入口,使得用户通过一个类型就基本能够操作整个系统,这样减少了用户的使用成本,也能够提升系统的灵活性。
外观类遵循了一个很重要设计模式原则:迪米特原则(最少知识原则),它让客户端依赖于最少的类,直接依赖外观类而不是依赖于所有的子系统类。
迪米特原则:如果两个类不必彼此直接连通,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。也就是一个对象应该对其他对象保持最少的了解。
优点:
- 对客户程序隐藏子系统细节,因而减少了客户对于子系统的耦合,能够拥抱变化;
- 外观类对子系统的接口封装,使得系统更易于使用;
更好的划分访问层次,通过合理使用Facade,可以帮助我们更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到外观类中,这样既方便客户端使用,也很好地隐藏了内部的细节。
缺点:
- 外观类没有遵循开闭原则,当业务出现变更时,可能需要直接修改外观类。