`
Kingson_Wu
  • 浏览: 123727 次
文章分类
社区版块
存档分类
最新评论

OOAD之设计模式-结构模式

 
阅读更多


http://blog.csdn.net/mudeer2012/article/details/8453310

一、结构模式

用于组织类对象之间的结构

1.1外观模式facade

为了便于用户使用,提供一键式对外操作方法。对于使用者来说,只需要知道怎么调用方法就行了。不需要知道内部设置和实现。

就像傻瓜相机一样。

目的是:简化客户程序与子系统之间的交互接口。

效果及实现要点
1.Façade模式对客户屏蔽了子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。
2.Façade模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。
3.如果应用需要,它并不限制它们使用子系统类。因此你可以在系统易用性与通用性之间选择。
4.通过一个高层接口让子系统和客户端不发生直接关联,使客户端不受子系统变化的影响。
5.Facade不仅仅针对代码级别,在构架上,特别是WEB应用程序的构架上,Facade的应用非常普遍。
适用性
1.为一个复杂子系统提供一个简单接口。
2.提高子系统的独立性。
3.在层次化结构中,可以使用Facade模式定义系统中每一层的入口。
4.从代码角度来说,如果你的程序有多个类是和一组其它接口发生关联的话可以考虑在其中加一个外观类型。
5.从应用角度来说,如果子系统的接口是非常细的,调用方也有大量的逻辑来和这些接口发生关系,那么就可以考虑使用Facade把客户端与子系统的直接耦合关系进行化解。你可能会说,子系统改了外观不是照样改?的确是需要改,但是如果客户端本身的工作已经比较复杂,或者说可能有多个需要调用外观的地方,这个时候外观的好处就体现了。

1.2装饰器模式decorator

Decorator模式,描述的就是对象间可能存在的多种组合方式,这种组合方式是一种装饰者与被装饰者之间的关系,因此封装这种组合方式,抽象出专门的装饰对象正是“封装变化”的体现。

目的是:动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

为了防止类爆炸(多次复用,叠加多次时)修饰类可以多次修饰主体类,可以叠加修饰。但是主体类低位不变,对外体现仍为主体。

装饰类继承主体类,并且组合一个主体类(反向组合)

Decorator模式的优点是提供了比继承更加灵活的扩展,通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。

让装饰角色还继承抽象构件角色也是装饰模式最大的特点,目的就是给抽象构件增加职责,对外表现为装饰后的构件。

让装饰角色拥有构件角色实例的目的就是让构件能被多个装饰对象来装饰。

在具体应用中可以灵活一点,不一定要有抽象构件和装饰角色。但是,装饰对象继承装饰对象并且拥有它实例的两大特点需要体现。

透明装饰一般通过在基类方法前后进行扩充实现,半透明装饰一般通过新的接口实现。

  1. publicabstractclass咖啡{
  2. privateintcost;
  3. publicvoidsetCost(intcost){
  4. this.cost=cost;
  5. }
  6. publicabstractintgetCost();
  7. }


  1. publicabstractclass配料extends咖啡{
  2. private咖啡coffee;
  3. public配料(咖啡coffee){
  4. this.coffee=coffee;
  5. }
  6. public咖啡getCoffee(){
  7. returnthis.coffee;
  8. }
  9. }
  1. publicclass卡布基诺extends咖啡{
  2. privateintcost=19;
  3. @Override
  4. publicintgetCost(){
  5. //TODOAuto-generatedmethodstub
  6. returnthis.cost;
  7. }
  8. }
  1. publicclass蓝山extends咖啡{
  2. privateintcost=21;
  3. @Override
  4. publicintgetCost(){
  5. //TODOAuto-generatedmethodstub
  6. returnthis.cost;
  7. }
  8. }


  1. publicclassextends配料{
  2. public奶(咖啡coffee){
  3. super(coffee);
  4. }
  5. @Override
  6. publicintgetCost(){
  7. //TODOAuto-generatedmethodstub
  8. returnthis.getCoffee().getCost()+5;
  9. }
  10. }


  1. publicclass爱心extends配料{
  2. public爱心(咖啡coffee){
  3. super(coffee);
  4. }
  5. @Override
  6. publicintgetCost(){
  7. //TODOAuto-generatedmethodstub
  8. returnthis.getCoffee().getCost()+50;
  9. }
  10. }

1.3代理模式proxy

用户与要访问的目标是隔离的,为了访问而采用中间代理来实现。同时还能实现功能的新增,甚至替换掉原来的功能,但是用户不会有任何感觉。

代理一般继承与目标一致的父类或者目标本类。重写父类方法,首尾添加,中间调用父类的方法。

在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系统带来不必要的复杂性,这时候可以在客户程序和目标对象之间增加一层中间层,让代理对象来代替目标对象打点一切。这就是本文要说的Proxy模式。

目的:为其他对象提供一种代理以控制对这个对象的访问。

Proxy模式根据种类不同,效果也不尽相同:

1.远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador)。好处是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。客户完全可以认为被代理的对象是局域的而不是远程的,而代理对象承担了大部份的网络通讯工作。由于客户可能没有意识到会启动一个耗费时间的远程调用,因此客户没有必要的思想准备。

2.虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。使用虚拟代理模式的好处就是代理对象可以在必要的时候才将被代理的对象加载;代理可以对加载的过程加以必要的优化。当一个模块的加载十分耗费资源的情况下,虚拟代理的好处就非常明显。

3.Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。

4.保护(Protect or Access)代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。保护代理的好处是它可以在运行时间对用户的有关权限进行检查,然后在核实后决定将调用传递给被代理的对象。

5.Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。

6.防火墙(Firewall)代理:保护目标,不让恶意用户接近。

7.同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。

8.智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。

1.4桥梁模式

Bridge模式封装对象实现的依赖关系。将抽象部分与它的实现部分分离,使它们都可以独立地变化。抽象部分是指不同的事物在概念层次上的联系。分离是指让各部分的行为各自独立,或至少显式指出关联。

多个变化点无主次之分,一个类组合多个变化点(需要时,也可以变化为装饰器)

同时可以实现当一化职责,减少类数目,防止排列组合式的类爆炸。

目的:将每个抽象部分与实现部分分离,使它们都可以独立的变化。进而大大减少类的数目。最后再组合为一个整体,对外公布。

效果及实现要点
1.Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。
2.所谓抽象和实现沿着各自维度的变化,即“子类化”它们,得到各个子类之后,便可以任意它们,从而获得不同平台上的不同型号。
3.Bridge模式有时候类似于多继承方案,但是多继承方案往往违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。
4.Bridge模式的应用一般在“两个非常强的变化维度”,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈——换言之两个变化不会导致纵横交错的结果,并不一定要使用Bridge模式。
适用性
在以下的情况下应当使用桥梁模式:
1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
2.设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
3.一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。
4.虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。

它很好的符合了开闭原则和优先使用对象,而不是继承这两个面向对象原则。

  1. publicabstractclassShap{
  2. privateLineline;
  3. publicLinegetLine(){
  4. returnline;
  5. }
  6. publicvoidsetLine(Lineline){
  7. this.line=line;
  8. }
  9. publicabstractvoidpaint();
  10. }


  1. publicabstractclassLine{
  2. publicabstractvoiddraw();
  3. }


  1. publicclassRectangleextendsShap{
  2. privateintx;
  3. privateinty;
  4. privateintwidth;
  5. privateinthigh;
  6. @Override
  7. publicvoidpaint(){
  8. //TODOAuto-generatedmethodstub
  9. System.out.println("计算矩形的大小、位置");
  10. this.getLine().draw();
  11. }
  12. }


  1. publicclassCircleextendsShap{
  2. privateintx;
  3. privateinty;
  4. privateintr;
  5. @Override
  6. publicvoidpaint(){
  7. //TODOAuto-generatedmethodstub
  8. System.out.println("计算圆的大小、位置");
  9. this.getLine().draw();
  10. }
  11. }


  1. publicclassDotedLineextendsLine{
  2. @Override
  3. publicvoiddraw(){
  4. //TODOAuto-generatedmethodstub
  5. System.out.println("虚线绘制");
  6. }
  7. }


  1. publicclassFullLineextendsLine{
  2. @Override
  3. publicvoiddraw(){
  4. //TODOAuto-generatedmethodstub
  5. System.out.println("实线绘制");
  6. }
  7. }

1.5适配器模式adapter

基于已知类或接口功能,满足客户的需求。

继承一个类,在组合另外的类。实现通过一个类访问多个类的行为。综合利用已有的资源。

如果已经有了接口,那么创建一个类组合2个接口的实现类。重载接口的方法,方法中调用实现类的相应方法。



分享到:
评论

相关推荐

    ooad设计模式软件架构分析资料

    《ooad设计模式软件架构分析资料》集合涵盖了面向对象编程、软件架构、设计模式、软件分析以及UML等多个核心IT领域的经典著作。这些资源对于深入理解软件开发过程、提升设计能力以及优化项目管理具有极高的价值。 ...

    设计模式-javaOOAD

    GoF(Gang of Four)设计模式由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者共同编写,是面向对象设计模式领域的经典之作。这些模式覆盖了创建型、结构型和行为型三个方面,旨在解决软件开发...

    软件开发方法与环境--设计模式(ppt)

    设计模式是软件开发者的必备技能之一,掌握好设计模式可以显著提高软件的质量和可维护性,是成为一名优秀软件工程师的关键步骤。通过深入学习和实践,我们可以更好地理解和应用这些模式,以应对复杂的软件开发挑战。

    OOAD-assignment2-refactoring

    【标题】"OOAD-assignment2-refactoring"指的是面向对象分析与设计(Object-Oriented Analysis and Design,简称OOAD)课程的第二次作业,重点在于重构。重构是软件开发过程中的一个重要环节,它旨在改善代码结构,...

    面向对象分析设计OOAD.zip

    本压缩包包含了一系列关于OOAD的资料,涵盖了设计原则、UML建模、设计模式等多个关键知识点。 1. **设计原则**:设计原则是指导面向对象设计的基础,如单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则...

    OOAD教师用书(IBM 原厂)word版

    设计模式是OOAD中另一个重要的话题。设计模式是解决常见软件设计问题的标准化解决方案,如单例模式、工厂模式、观察者模式等。IBM的教材会详细讲解这些模式的原理、应用场景和实现方式,帮助学生掌握如何在实际项目...

    OOAD 台湾 著名设计开发人员做的关系系统设计与分析的PPT

    4. **设计模式**:介绍常见的设计模式,如工厂模式、单例模式、观察者模式等,及其在解决特定问题时的应用。 5. **系统架构**:探讨整体系统架构的选择,如三层架构或微服务架构,以及它们的优势和挑战。 6. **...

    OOAD2010级-2012级考题1

    OOAD与传统的结构化分析与设计的区别在于,后者通常使用自顶向下、逐步求精的方法,而OOAD采用的是自底向上,通过识别和抽象对象来构建系统。结构化方法主要关注功能流,而OOAD强调实体间的交互和封装。 **迭代过程...

    OOAD系列PPT

    第四章“结构型设计模式”涉及适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式和享元模式。这些模式关注如何组织类和对象,以实现更好的结构和接口复用。 第五章“行为型设计模式”主要介绍责任链...

    SVSE-S3冲刺题-OOAD

    6. **设计模式**:设计模式是解决常见问题的可重用解决方案,如工厂模式、单例模式、观察者模式等。 7. **需求分析**:在OOAD中,理解需求是至关重要的第一步,它涉及到识别问题域的关键实体、关系和行为。 8. **...

    OOAD.rar_OOAD

    总的来说,"OOAD.rar_OOAD"这个资源很可能是面向对象分析与设计的教程或指南,其中的"OOAD.pdf"可能涵盖了这些核心概念、原则以及设计模式的详细解析,对于程序员提升面向对象编程能力具有极高的价值。学习并熟练...

    OOAD课堂练习作业和代码

    **面向对象分析与设计(OOAD)是软件开发过程中至关重要的一环,它涉及到对问题域的...每个课堂练习都可能涵盖特定的设计模式、UML图的绘制或是对特定问题的解决方案。在实践中学习,无疑是掌握这些概念的最佳途径。

    OOAD与UMLpdf文件

    1. **设计模式应用**:使用已验证的设计模式,如工厂模式、单例模式、观察者模式等,来解决常见设计问题。 2. **接口设计**:定义类的公共行为,确保不同组件间的协同工作。 3. **类与对象的实现细节**:考虑数据...

    OOAD学习资料

    25).pdf"和"OOAD - Lecture 6 Object Design 3(ch26-31).pdf"中,会深入探讨对象设计的步骤,包括接口设计、类的设计原则(如单一职责原则、开闭原则等)、继承和多态的使用,以及如何通过设计模式优化结构和提高...

    OOAD建模技术(完整PPT)

    总的来说,这个“OOAD建模技术”培训资料可能涵盖了UML的基本元素、图示类型、设计原则以及设计模式等多个方面,对于学习和提升软件开发能力非常有帮助。通过深入学习和实践,开发者可以更好地理解和构建复杂系统,...

    java设计模式案例

    压缩包中的"ooad"可能是指面向对象分析与设计(Object-Oriented Analysis and Design),这通常涉及到UML(统一建模语言)的使用,如类图、序列图、用例图等,它们可以帮助我们更好地理解和设计使用设计模式的系统。...

    OOAD与UML资料和笔记.zip

    4. **设计模式**:介绍一些常见的设计模式,如工厂模式、单例模式、观察者模式等,以及它们在OOAD中的应用。 5. **软件生命周期**:OOAD在软件开发生命周期中的位置,以及如何与其他阶段(如需求分析、编码、测试等...

    西北农林科技大学OOAD实验.rar

    3. **设计模式**:设计模式是解决常见软件设计问题的标准解决方案,如工厂模式、单例模式、观察者模式等,学生会在实践中应用这些模式来提高代码的可读性和可维护性。 4. **类与对象**:理解类的定义、属性和方法,...

    Head First OOAD

    这本书以生动易懂的方式讲解了如何在实际项目中应用面向对象原则和设计模式,是IT从业者提升自身软件开发能力的重要参考资料。 该压缩包文件包含的是书中所有源代码示例,可以帮助读者更直观地理解书中的概念和方法...

Global site tag (gtag.js) - Google Analytics