设计模式-外观模式
一、外观模式简介
外观模式(Facade)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。
核心:
1、为子系统中的一组接口提供一个一致的界面
2、降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口
3、客户端不与系统耦合,外观类与系统耦合
二、外观模式优缺点比较
优点:
1、减少系统相互依赖
2、提高灵活性
3、提高了安全性
缺点:
1、不符合开闭原则,如果要改东西很麻烦,继承重写都不合适
使用场景:
1、DBUtils类
2、为复杂的模块或子系统提供外界访问的模块
3、预防低水平人员带来的风险
注意事项:在层次化结构中,可以使用外观模式定义系统中每一层的入口
四、设计实现
步骤1:创建接口
public interface Shape { void draw(); }
步骤2:创建实现接口的实体类
public class Rectangle implements Shape { @Override public void draw() { System.out.println("Callback Rectangle::draw method"); } } public class Square implements Shape { @Override public void draw() { System.out.println("Callback Square::draw method"); } } public class Circle implements Shape{ @Override public void draw() { System.out.println("Callback Circle::draw method"); } }
步骤3:创建外观类
public class ShapeFacade { private Shape r; private Shape c; private Shape s; public ShapeFacade() { this.r = new Rectangle(); this.c = new Circle(); this.s = new Square(); } public void drawRectangle() { r.draw(); } public void drawCircle() { c.draw(); } public void drawSquare() { s.draw(); } }
步骤4:调用者测试
public class FacadeDemo01 { public static void main(String[] args) { ShapeFacade sf = new ShapeFacade(); sf.drawCircle(); sf.drawRectangle(); sf.drawSquare(); } }
步骤5:运行程序,观察结果
汇总:
松散耦合:外观模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。
简单易用:外观模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟外观类交互就可以了。
更好的划分访问层次:通过合理使用Facade,可以帮助我们更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到外观中,这样既方便客户端使用,也很好地隐藏了内部的细节。
郭慕荣博客园