设计模式-外观模式

一、外观模式简介
外观模式(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,可以帮助我们更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到外观中,这样既方便客户端使用,也很好地隐藏了内部的细节。

 

posted @ 2024-02-19 09:34  郭慕荣  阅读(14)  评论(0编辑  收藏  举报