设计模式系列——外观模式

Posted 花括号MC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式系列——外观模式相关的知识,希望对你有一定的参考价值。

原创:花括号MC(微信公众号:huakuohao-mc)。关注JAVA基础编程及大数据,注重经验分享及个人成长。

外观模式主要用于屏蔽内部细节,对外提供一个统一的接口和方法。比如大家经常用的SL4J就是外观模式最好的应用。

举个例子

还是拿图形生成来举例,定义一个图形接口,然后分别定义具体的圆形,长方形和正方形来实现图形接口。为了让客户端代码更加简单的使用相应的功能接口,而不必了解更多的图形细节,可以通过使用外观模式来实现。定义一个外观类,将各个图形的复杂性封装起来,使其对客户端来说只需要和外观类进行交互,而不用关心具体的业务实现类。

先来看一下UML图:


再来看一下具体代码实现

Shape接口

public interface Shape 
    void draw();

Circle实现类

public class Circle implements Shape 
    @Override
    public void draw() 
        System.out.println("Circle::draw()");
    

Rectangle 和 Square 类实现和Circle类似,因篇幅原因省略。

看一下外观类

public class ShapeMaker 

    private Shape circle;
    private Shape rectangle;
    private Shape square;

    public ShapeMaker() 
        circle = new Circle();
        rectangle = new Rectangle();
        square = new Square();
    
    
    //画圆
    public void drawCircle()
        circle.draw();
    
    //画长方形
    public void drawRectangle()
        rectangle.draw();
    
    //画正方形
    public void drawSquare()
        square.draw();
    

客户端这样使用代码

public class FacadePatternDemo 
    public static void main(String[] args)
        ShapeMaker shapeMaker = new ShapeMaker();
        //客户端只需要和外观类打交道
        shapeMaker.drawCircle();
        shapeMaker.drawRectangle();
        shapeMaker.drawSquare();
    

总结

外观模式是结构型模式之一,主要用于屏蔽复杂的内部接口,对外提供一个统一的调用方式和类。

本文参考: https://www.tutorialspoint.com/design_pattern/facade_pattern.htm

推荐阅读

1. Java并发编程那些事儿(十)——最后的总结

2. 程序员应该掌握的常用网络问题定位工具

3. Awk这件上古神兵你会用了吗

4. 手把手教你搭建一套ELK日志搜索运维平台

·END·
 

设计模式系列 - 外观模式

外观模式通过创建新的对象访问接口,从而隐藏对象内部发复复杂性

介绍

外观模式属于结构型模式,通过定义的外观器,从而简化了具体对象的内部复杂性。这种模式通过在复杂系统和上层调用之间添加了一层,这一层对上提供简单接口,对下执行复杂操作。

类图描述

技术分享图片

通过上图我们可以发现,IShape 为行为接口,然后 Rectangle Square Circle 为具体的对象实体类型, ShapeMarker 为我们定义的外观器,通过它,我们能间接访问复杂对象。

代码实现

1、定义对象接口

public interface IShape
{
    void Draw();
}

2、定义实体对象类型

public class Circle:IShape
{
    public void Draw() => Console.WriteLine("Circle:Draw()");
}
public class Rectangle:IShape
{
    public void Draw() => Console.WriteLine("Rectangle:Draw()");
}
public class Square:IShape
{
    public void Draw() => Console.WriteLine("Square:Draw()");
}

3、定义外观类

public class ShapeMarker
{
    private IShape circle;
    private IShape rectangle;
    private IShape square;

    public ShapeMarker()
    {
        circle = new Circle();
        rectangle = new Rectangle();
        square = new Square();
    }

    public void DrawCircle() => circle.Draw();
    public void DrawRectangle() => rectangle.Draw();
    public void DrawSquare() => square.Draw();
}

4、上层调用

class Program
{
    static void Main(string[] args)
    {
        var shapeMarker = new ShapeMarker();
        shapeMarker.DrawCircle();
        shapeMarker.DrawRectangle();
        shapeMarker.DrawSquare();
        Console.ReadKey();
    }
}

总结

外观模式不符合开闭原则,如果外观类执行的操作过于复杂的话,则不建议使用这种模式。

以上是关于设计模式系列——外观模式的主要内容,如果未能解决你的问题,请参考以下文章

Java设计模式菜鸟系列外观模式建模与实现

深入理解JavaScript系列(30):设计模式之外观模式

嵌入式C语言设计模式 --- 外观模式

设计模式——外观模式

设计模式系列之外观模式(Facade Pattern)——提供统一的入口

神兵出世——长城软件负载均衡GWS AD系列