当前位置: 首页 > news >正文

深入浅出设计模式(四)

     设计模式已经学了非常长时间了。近期又看了一遍,感觉非常不一样。当初非常难理解或不理解的,如今一看,恍然大悟:哦。原来是这么回事啊~~~

          先说一下对几种关系的理解,包含:依赖、关联、聚合、组合、继承、实现。耦合依次增高。

1.依赖

     用虚箭头表示。对于两个相对独立的对象,当一个对象负责构造还有一个对象的实例,或者依赖还有一个对象的服务时。这两个对象之间主要体现为依赖关系。

java中,类A使用了类B,当中类B是作为类A的方法參数、方法中的局部变量、或者静态方法调用,这几种情况是依赖。

下图中People类依赖于Food类,Food类是作为类中方法的參数形式出如今People类中的。


publicclass People{ 
    //Food作为eat方法的形參 
     public void eat(Food mantou){ 
       System.out.println(“人们要吃”+mantou.getName()); 
    } 
}

 

2.关联

        有单向关联和双向关联,对于两个相对独立的对象。当一个对象的实例与还有一个对象的一些特定实例存在固定的相应关系时,这两个对象之间为关联关系。单向关联表现为:类A使用了类B,其中类B是作为类A的成员变量。双向关联表现为:类A其中使用了类B作为成员变量;同一时候类B中也使用了类A作为成员变量。

   局部变量和成员变量主要是他们作用域的差别:

1.成员变量个是类内部;局部变量是定义其的方法体内部(或者方法体内部的某一程序块内——大括号,主要看定义的位置)。

2.成员变量能够不显式初始化。它们能够由系统设定默认值;局部变量没有默认值。所以必须设定初始赋值。

3.在内存中的位置也不一样。成员变量在所在类被实例化后,存在堆内存中;局部变量在所在方法调用时,存在栈内存空间中。

双向关联:


单向关联:


 

   代码:

public class Student{ 
   //关联关系中作为成员变量的类通常会在类中赋值 
    Teacher teacher = new Teacher(); 
    public void DoHomework(){ 
       System.out.println(“从”+teacher.getName()+”获得作业”); 
    } 
} 
 
public class Teacher{ 
    Student student = new Student(); 
    public void giveHomework(){ 
       System.out.println(“给”+student.getName()+“留作业”); 
    } 
} 


上面的代码是一个双向关联。

 

3.聚合

     聚合关系属于关联关系,耦合度强于关联。代码表现是同样的,在语义上的表现有所差别:关联关系的对象间是相互独立的。聚合关系的对象之间存在着包容关系,是“总体-个体”的相互关系。


Public class Yanqun{ 
    Dayan dayan;    
    //聚合关系中作为成员变量的类一般使用set方法赋值 
     public void setDayan(Dayan dayan){ 
        This.dayan = dayan; 
    } 
       public void fly(){ 
       System.out.println(“大雁飞:”+dayan.fly()); 
    } 
} 


4.组合

    相比于聚合。组合是一种耦合度更强的关联关系。存在组合关系的类表示“总体-部分”的关联关系,“总体”负责“部分”的生命周期。共生共死;“部分”不能单独存活。大雁和翅膀之间是组合关系。当大雁的生命周期開始时,必须有翅膀;当大雁的生命周期结束时,翅膀也会跟着死掉;翅膀是不能单独存在,必须作为大雁的组成部分存在。


代码:

Public class Dayan{ 
    Chibangchibang;  
    //组合关系中的成员变量通常会在构造方法中赋值 
     Public Dayan(Chibangchibang){  
        This.chibang = chibang;  
    } 
 
    Public void fly(){ 
       System.out.println(“飞行要用”+chibang.getName()); 
    } 
   }  

     通过代码也能够看出聚合和组合明显的差别。组合关系时,是在构造函数时使用的,即,当大雁存在了,翅膀也跟着生成了。

 

5.继承

    继承表示类与类(或者接口与接口)之间的父子关系。在java中,用keywordextends表示继承关系。

在UML中,继承关系用实线+空心箭头表示。箭头指向父类。


Public classDayanextends Niao

 

6.实现

     表示一个类实现一个或多个接口的方法。接口定义好操作的集合,由实现类去完毕接口的详细操作。在java中使用implements表示。在UML图中,实现关系用虚线+空心箭头表示,箭头指向接口。


代码:

Public classDayanImplements Niaoleixingwei

 

总结:

       事实上,聚合、组合是特殊的关联关系,继承和实现本质也是同样的。依赖是最弱的耦合关系。依赖和关联关系本质也是类似的,都是在一个类中使用还有一个类。

所以。这些联系也没什么难懂的,so easy~~~

 

相关文章:

  • scala-基础-映射(1)
  • struts2的核心和工作原理
  • Linux 有问必答:在 Linux 如何更改文本文件的字符编码
  • 《Node应用程序构建——使用MongoDB和Backbone》一2.4 Socket.io
  • 《C++ 黑客编程揭秘与防范(第2版)》—第6章6.2节详解PE文件结构
  • 《Adobe Illustrator CS5中文版经典教程》—第0课0.16节 使用符号
  • 《Nmap渗透测试指南》—第1章1.3节Linux/Unix源码编译安装Nmap
  • 《嵌入式 Linux C 语言应用程序设计(修订版)》——本章小结
  • 《创意特训营——30天超级灵感唤醒术》—第1章1.4节增加创意的数量
  • 《游戏大师Chris Crawford谈互动叙事》一9.3 互动小说(Interactive Fiction,IF):文字冒险的继承者...
  • 《Wireshark网络分析实战》—第1章1.2节安置Wireshark(程序或主机)
  • 《精通QTP——自动化测试技术领航》—第1章1.2节帮助文档(HELP)-QTP的说明书...
  • 《jQuery、jQuery UI及jQuery Mobile技巧与示例》——9.16 技巧:使用主题来更改配色方案...
  • 如何使用Aptik来备份和恢复Ubuntu中的Apps和PPAs
  • 《游戏大师Chris Crawford谈互动叙事》一导读
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • JavaScript 一些 DOM 的知识点
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Vue.js 移动端适配之 vw 解决方案
  • 闭包--闭包之tab栏切换(四)
  • 欢迎参加第二届中国游戏开发者大会
  • 面试遇到的一些题
  • 前嗅ForeSpider采集配置界面介绍
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 使用agvtool更改app version/build
  • 微信小程序:实现悬浮返回和分享按钮
  • 为视图添加丝滑的水波纹
  • 原生Ajax
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​Spring Boot 分片上传文件
  • # 数论-逆元
  • # 透过事物看本质的能力怎么培养?
  • #### go map 底层结构 ####
  • #大学#套接字
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (07)Hive——窗口函数详解
  • (1)(1.13) SiK无线电高级配置(六)
  • (11)MSP430F5529 定时器B
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (Python) SOAP Web Service (HTTP POST)
  • (zt)最盛行的警世狂言(爆笑)
  • (定时器/计数器)中断系统(详解与使用)
  • (二)hibernate配置管理
  • (二)windows配置JDK环境
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (六)vue-router+UI组件库
  • (三)c52学习之旅-点亮LED灯
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (循环依赖问题)学习spring的第九天
  • (幽默漫画)有个程序员老公,是怎样的体验?