设计模式-外观、享元

99 阅读4分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

一、外观模式

定义: 提供了一个统一的接口,用来访问子系统中的一接口。外观定义了一个高层接口,让子系统更容易使用。

理解: 外观模式是一种为多个复杂的子系统提供一个一致的接口,使得子系统可以更加容易访问。外观模式有一个对外的统一接口,使得调用者不必关心程序内部细节,降低程序的复杂性,提供可维护性。例如我们请假,写好请假条,给班长签字,要交给班主任签字盖章,然后又给年级主任,这样我们要跑很多地方,外观模式就可以让我们只交给班长,这样简化了我们的操作,将复杂的流程简化,提供一个简单接口给用户使用。外观模式包含三个角色,外观角色为多个子系统提供一个一致的接口;子系统角色实现系统的部分功能,客户通过外观角色访问子系统;客户角色通过外观角色访问子系统的功能。****

优点: 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他的子系统,也不会影响外观对象。

缺点: 不能很好地限制客户使用子系统类,很容易带来未知风险。增加新的子系统可能需要修改外观类或客户端的源代码,违背了开闭原则。

场景: 对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性。

二、享元模式

定义: 运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。

理解: 在系统设计中,有时候我们需要创建大量相同或者相似的实例对象。创建那么多的对象会花费系统大量资源,降低了系统性能。享元模式就可以把这些对象的共同部分抽取出来共享,这样就节省了大量资源。例如五子棋中的黑白棋子,图像的颜色大小等。享元模式主要有4个角色,抽象享元角色是具体享元类的基类,定义规范的规范的公共接口;具体享元角色实现抽象享元角色中所规定的接口;非享元角色是不可以共享的外部状态,以参数的形式注入具体享元的相关方法中;享元工厂角色负责创建和管理享元角色,客户请求获得享元对象时,其负责检查是否存在满足条件的对象,存在就返回给客户,不存在就先创建应该享元对象。内部状态是指不会随环境变化而变化的共享属性。外部状态指随着环境变化而变化的,不可以共享的状态。

优点: 相同的实例对象只用创建一个,节省了创建大量对象占用的系统资源,减少系统压力提高了系统性能。

缺点: 为了是相同对象共享,需要分离内部状态和外部状态,增加了程序复杂性。读取享元模式的外部状态会使得运行时间稍微变长。

场景: 系统中需要创建大量相同对象;大部分的对象可以按照内部状态进行分组,且可将不同部分外部化,这样每一个组只需保存一个内部状态。