设计模式系列——外观模式
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();
}
}
总结
外观模式不符合开闭原则,如果外观类执行的操作过于复杂的话,则不建议使用这种模式。
以上是关于设计模式系列——外观模式的主要内容,如果未能解决你的问题,请参考以下文章
深入理解JavaScript系列(30):设计模式之外观模式