java设计模式5.组合模式、门面模式、享元模式、桥接模式

  • 组合模式

在面向对象的语言中,树结构有着巨大的威力,一个基于继承的类型的等级结构便是一个数结构,一个基于合成的对象结构也是一个数结构。组合模式将部分与整体的关系用树结构表示出来,使得客户端把一个个单独的成分对象和由它们组合而成的合成对象同等看待。

  • 抽象构建角色:一个抽象角色,给参加组合的对象规定一个接口,这个接口给出共有的接口及默认行为。
  • 树叶构建角色:代表参加组合的树叶对象,没有子对象,定义参加组合的原始对象行为。
  • 树枝构建角色:代表参加组合的有子对象的对象,并给出树枝构件对象的行为。

对于子对象的管理方法如add,remove,getchild等,有两种方式。一种是透明方式:直接定义在抽象构建角色中,这样要求树叶和树枝构件都实现管理方法,但是在树叶中是空实现。另一种是安全方式:只在树枝构件中实现管理方法,而在树叶构件中只实现共有的方法。

  • 门面模式

门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。

  • 门面角色:客户端调用这个角色的方法。此角色知晓相关子系统的功能和责任,将所有客户端的请求委派到相应的子系统。
  • 子系统角色:可以同时有一个或者多个子系统。每个子系统可以被客户端直接或者通过门面调用,子系统并不感知门面的存在。
  • 享元模式

java中的String使用了享元模式。String对象是不变对象,即创建后不可以改变。如果要改变一个String的值,只有新建一个String对象。在JVM内部,String对象都是共享的,如果一个系统中有两个String对象所包含的字符串相同,JVM实际上只创建了一个String对象,提供给两个引用。从而实现String对象的共享。String.intern()方法给出这个字符串在共享池中的唯一实例。

  • 抽象享元模式:所有具体享元类的超类,为这些类规定出需要实现的公共接口。
  • 具体享元角色:实现抽象享元的所有接口,对象的部分或所有状态与所处环境无关,是的对象可以在系统内共享。
  • 享元工厂:负责创建和管理享元角色,如果已存在,则返回已有的实例。
  • 客户端角色:维护一个对享元角色的引用,自行管理享元对象中的可变状态,客户端不可以直接实例化享元对象,而必须通过工厂。
  • 桥接模式

桥接模式的用意是通过聚合关系代替继承将抽象化与实现化脱耦,使得二者可以独立地变化。

  • 抽象化角色:抽象化给出定义,并保存一个对实现化对象的引用。
  • 修正抽象化角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
  • 实现化角色:给出实现化角色的接口,但不给出具体实现。此接口只给出底层操作,而抽象化角色给出基于底层操作的更高一层操作。
  • 具体实现化角色:给出实现化角色接口的具体实现。

抽象化等级结构中的业务方法通过向对应的实现化对象委派自己的操作,这意味着抽象化角色可以通过向不同的实现化对象委派,来达到动态地转换自己功能的目的。

大多数的驱动器都是桥接模式的应用。使用驱动程序的应用系统就是抽象化角色,而驱动器本身扮演着实现化角色。JDBC为所有的关系数据库提供一个通用的接口。一个应用系统可以动态地选择一个合适的驱动器,然后通过驱动器向数据库引擎发出指令。由于JDBC驱动器的存在,应用系统可以不依赖于数据库引擎的细节而独立地演化,同时数据库引擎也可以独立于应用系统的细节而独立演化。

#笔记内容参考《java与模式》

原文地址:https://www.cnblogs.com/shanhm1991/p/9898421.html

时间: 2024-11-07 04:44:36

java设计模式5.组合模式、门面模式、享元模式、桥接模式的相关文章

java/android 设计模式学习笔记(13)---享元模式

这篇我们来介绍一下享元模式(Flyweight Pattern),Flyweight 代表轻量级的意思,享元模式是对象池的一种实现.享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,缓存可共享的对象,来达到对象共享和避免创建过多对象的效果,这样一来就可以提升性能,避免内存移除和频繁 GC 等. 享元模式的一个经典使用案例是文本系统中图形显示所用的数据结构,一个文本系统能够显示的字符种类就是那么几十上百个,那么就定义这么些基础字符对象,存储每个字符的显示外形和其他的格式化数据

图解Java设计模式之组合模式

图解Java设计模式之组合模式 看一个学校院系展示需求 传统方案解决学院院系展示(类图) 传统方案解决学校院系展示存在的问题分析 组合模式基本介绍 组合模式的原理类图 组合模式解决学校院系展示的应用实例 组合模式在JDK集合的源码分析 组合模式的注意事项和细节 看一个学校院系展示需求 编写程序展示一个学校院系结构 :需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系.如图 : 传统方案解决学院院系展示(类图) 传统方案解决学校院系展示存在的问题分析 1)将学院看

《JAVA与模式》之享元模式

Flyweight在拳击比赛中指最轻量级,即"蝇量级"或"雨量级",这里选择使用"享元模式"的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. Java中的String类型 在JAVA语言中,String类型就是使用了享元模式.String对象是final类型,对象一旦创建就不可改变.在JAVA中字符串常量都是存在常量池中的,JAVA会确保一个字符串常量在常量池中只有一个拷贝.Stri

设计模式C#实现(十三)——享元模式(蝇量模式)

意图 0 适用性 1 结构 2 实现 3 效果 4 参考 5 意图 运用共享技术有效地支持大量细粒度的对象. 适用性 当以下情况都成立时使用: 一个程序使用了大量的对象 完全由于使用大量对象造成很大存储开销 对象的大多数状态都可以变为外部状态 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象 应用程序不依赖对象标识 结构 以下摘自参考1 享元模式采用一个共享来避免大量拥有相同内容对象的开销.这种开销最常见.最直观的就是内存的损耗.享元对象能做到共享的关键是区分内蕴状态(Inte

设计模式之结构型模式—— 2.6 享元模式

<?php /**  * 2.6 享元模式  *   定义:  *       运用共享技术有效地支持大量细粒度的对象.  *   角色:  *       1. 抽象享元(Flyweight)类  *           职责:所有具体享元类的超类或接口,  *                 通过这个接口,享元类可以接  *                 受并作用于外部状态.  *       2. 具体享元类  *           职责:继承享元抽象类,并为内部状态  *      

java设计模式之组合模式

树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题,组合模式通过一种巧妙的设计方案使得用户可以一致性地处理整个树形结构或者树形结构的一部分,也可以一致性地处理树形结构中的叶子节点(不包含子节点的节点)和容器节点(包含子节点的节点).下面将学习这种用于处理树形结构的组合模式. 11.1 设计杀毒软件的框架结构 Sunny软件公司欲开发一个杀毒(AntiVirus)软件,该软件既可以对某

NET设计模式 第二部分 结构性模式(12):享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern) ——.NET设计模式系列之十三 Terrylee,2006年3月 摘要:面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题.但是在某些情况下,对象的数量可能会太多,从而导致了运行时的代价.那么我们如何去避免大量细粒度的对象,同时又不影响客户程序使用面向对象的方式进行操作? 本文试图通过一个简单的字符处理的例子,运用重构的手段,一步步带你走进Flyweight模式,在这个过程中我们一同思考.探索.权衡,通过比较而得出好的实现方式,而不

设计模式之二十二:享元模式(FlyWeight)

享元模式: 使用共享技术有效地支持大量细粒度的对象. Use sharing to support large numbers of fine-grained objects efficiently. 这个设计模式和它的名字一样核心是为了共享代码. UML图: 主要包括: FlyWeight:声明了一个接口,通过这个接口所有的FlyWeight能够接受并作用于外部的状态. ConcreteFlyWeight:实现了FlyWeight声明的接口,并且可能会增加一些内部状态. UnSharedCon

大话设计模式C++实现-第26章-享元模式

一.UML图 二.概念 享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象. flyweight的意思:轻量级. 三.说明 角色: (1)Flyweight类:它是所有具体享元类的超类或接口,通过这个接口,Flyweight可以接受并作用于外部状态. (2)ConcreteFlyweight类:继承Flyweight超类或实现Flyweight接口,并为内部状态增加存储空间. (3)UnsharedConcreteFlyweight:是指那些不需要共享的Flyweight子类