文档章节

对象的构成模型和关系模型

FansUnion
 FansUnion
发布于 2015/05/03 01:30
字数 1757
阅读 18
收藏 0
1.对象的构成模型
     作为面向对象编程最基本的构成元素,对象是由一个叫做类(Class)的概念来描述的。因此,针对对象构成分析的研究,也就转化为针对编程语言中类的构成分析。以Java语言为例,我们可以对Java语言中类的定义进行一些构成上的分析。

    public class Human{//签名区
.....................................................
    //属性区
    private String name;
    private Head head;
    private Body body;
    private Leg leg;
......................................................
    //方法区
    public void printName(){
       System.out.println(name);
     }
   public void work(){
       leg.shift();
     }
......................................................
  }
     我们可以看到构成一个对象的基本元素主要有:
             签名(Signature) -----对象的核心语义概括,它的作用实际上是界定我们所描述的事物的范畴。
            属性(Property)    -----对象的内部特征和状态的描述
            方法(Method)      -----对象的行为特征的描述
 
         在对象的内部,作为对象内部构成的重要元素,属性和方法刚好从两个不同的角度对事物的内在特性给予了诠释。其中,属性所勾勒的是一个对象的构成特性和内部状态的特性;而方法则表达了一个对象的动态行为特性。这就像我们人一样,人有头、躯干、四肢构成,它们可以看作是人这个对象的“属性”。与此同时,人具有“直立行走”的行为特性,我们可以定义一个“方法”来模拟这一行为。
          以上这些分析,我们还停留在语法这个层面,因为无论是属性还是方法,它们都是Java语言的原生语法支持。将事物抽象成对象,并且赋予这个对象属性和方法,是一个很自然的编程逻辑,这也符合面向对象编程语言的基本思路。
          不过我们也同时发现在实际编程中,对象将表现为三种不同的形态和运行模式。-->参见 《对象的3种形态和运行模式》

2.对象的关系模型
      对象的构成模型是从对象内部结构的角度来对面向对象编程中的基本元素进行分析,对象的关系模型则由“内”转向“外”,考虑对象与对象之间的关系。
      谈到对象之间的关系,我们很容易想到两个不同的层次:
  从属关系:一个对象在逻辑语义上隶属于另外一个对象。
  协作关系:对象之间通过协作来共同表达一个逻辑语义。
    这两种关系在面向对象编程语言中分别拥有不同的表达形式和逻辑语义,这两者构成了绝大多数的对象关系模型。
 
对象的从属关系
       对象的从属关系,主要是指一个对象在逻辑语义上隶属于另外一个对象。逻辑上的隶属主要有两种不同的含义:
       归属:归属的逻辑含义很直观。比如,一个人总是归属于一个国家,一本书总是有作者。当我们把人和国家、书和作者都映射成面向对象编程语言中所定义的一个个对象时,它们之间自然就形成了归属关系。这种归属关系是由外部世界的逻辑关系映射到编程元素之上而带来的。
 
结论:“归属”关系在面向对象编程语言中,主要是以对象之间互相引用的形式存在。
   
   public class Book{
      private String name;
     private List<Author> authors;
  }
 
 继承:继承的逻辑含义就有点晦涩。比如,马、白马和千里马之间的关系。首先,白马和千里马都是马的一种,然而白马和千里马却各自拥有自己的特性;白马是白色的,千里马一日可行千里。此时,我们可以说白马和千里马都属于马,它们都继承了马的基本特性,却又各自扩展了自身独有的特质。

  结论:“继承”关系在面向对象编程语言中,主要以原生语法的形式获得支持。
    public class Horse{
         public void run();
     }
     public class WhiteHorse extends Horse{
    }
    public class ThousandMileHorse extends Horse{
     }

对象的协作关系
       对象的从属关系从现实世界逻辑语义的角度描述了对象与对象之间的关系。从之前的分析中,我们可以发现,无论是“归属”关系还“继承”关系,它们都在围绕着对象构成的属性做文章。那么我们不禁去想,围绕着对象的行为动作特征,对象之间是否能够建立起关系模型呢?
       从哲学的观点来看,万事万物都存在着普遍而必然的联系。从对象的行为特性分析,一个对象的行为特征总是能够与另外一个对象的行为特征形成依赖关系。而这种依赖关系,在极大程度上影响着对象的逻辑行为模式。例如,一个人“行走”这样一个动作,需要手脚的共同配合才能完成,具体来说就是“摆手”和“抬脚”。而当我们把手和脚分别看作一个对象时,“摆”和“抬”就成为手和脚的行为动作了。
这样一说,似乎对象之间的协作关系就非常容易理解了。
 
结论:当对象的行为动作需要其它对象的行为动作进行配合时,对象之间就形成了协作关系。
 
       可以想象,一个对象在绝大多数情况下都不是孤立存在的,它总是需要通过与其它对象的协作来完成其自身的业务逻辑。
 
        对象的协作关系在对象运行在行为对象模式时显得尤为突出。因为当使用一个具体的方法来进行动作响应时,我们总是会借助一些辅助对象的操作来帮助我们共同完成动作的具体逻辑。也就是说,我们会将一个动作从业务上进行逻辑划分,将不同的业务逻辑分派到不同的对象之上去执行。也就成为我们所熟知的分层开发模式的理论基础。
 
  以下是Java Web开发 三层架构的代码示例:
        
    public class MessageAction {
          private Message message;// 某个留言
          private IMessageService messageService = new MessageService();//可以改进
   /**
     * 增加一条留言
   */
     public String add() {
        messageService.add(message);
        return SUCCESS;
      }
   }
 
    public interface IMessageService {
 /**
  * 增加一条留言
  * @param message         留言对象
  */
   public abstract void add(Message message);
  }
 
   public class MessageService implements IMessageService {
      private IMessageDAO dao = new MessageDAO();
 
    //此处可以改进
    public void add(Message message) {
        //开启事务
       Transaction tx = dao.getSession().beginTransaction();
         dao.save(message);
       //提交事务
        tx.commit();
     }
   }
 
   //MessageDAO的save方法
   public void save(Message transientInstance) {
     try {
         getSession().save(transientInstance);
     } catch (RuntimeException re) {
         throw re;
      }
    }
 
-->> 很多地方值得改进。(*^__^*)  谢谢阅读,多多包涵。@Fans @雷文 2012-2-17

© 著作权归作者所有

FansUnion
粉丝 60
博文 858
码字总数 825464
作品 0
丰台
高级程序员
私信 提问
软件设计之UML—UML的构成[上]

UML是一种通用的建模语言,其表达能力相当的强,不仅可以用于软件系统的建模,而且可用于业务建模以及其它非软件系统建模。UML综合了各种面向对象方法与表示法的优点,至提出之日起就受到了广...

ibm_hoojo
2013/08/30
0
0
软考之UML图深入学习(1)

前言 软考的准备已经过去了2个月零8天,倒计时8天(11月11日)。通过近年试题的分析,面向对象技术试题在150分中占据了大约1/3的比重,足见其重要性和基础性。下午试题中的UML图面向对象设计...

m18633778874
2017/11/03
0
0
Delphi 面向对象编程 第一章

面向过程:程序和数据是分开的,即程序员所看到的就是过程或者函数的集合以及单独的一批数据。 面向对象:程序被看作是相互协作的对象的集合,每个对象都是类的实例,所有的类构成一个通过继...

CODER-SU
2011/12/19
143
0
Power BI基础系列-02Power BI视图

Power BI视图   Power BI Desktop中有报表视图、数据视图和关系视图3种;其中,当前显示的视图以×××条表示。如下图所示,当前就是报表视图,通过单击左侧导航栏中的图标,可以在报表视图...

Juck_Zhang
2018/05/20
0
0
面向对象方法与UML的历史与发展

一、 不同的分析与设计方法 1.功能分解法(function decomposition) 以系统需要提供的功能为中心来组织系统。 首先定义各种功能,然后把功能分解为子功能,对较大的子功能进一步分解,直到可...

oYo字节
2014/03/12
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

关于运维,该怎么决定它的方向,这个似工作又似兴趣的存在

我之前主要从事网络、桌面、机房管理等相关工作,这些工作使我迷惘,这应该是大多数运维人都经历过的过程; 18年国庆,我从国内前三的消费金融公司裸辞,下海创业,就是想要摆脱这样的困境。...

网络小虾米
25分钟前
5
0
Java Timer的用法

Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { System.out.println("11232"); } }, 200000 , 1000); public void schedule(TimerTask task, long delay......

林词
29分钟前
5
0
使用js动态加载外部js文件以及动态创建script脚本

动态脚本指的是在页面加载时不存在,但将来的某一时刻通过修改该DOM动态添加的脚本。和操作HTML元素一样,创建动态脚本也有两种方式:插入外部文件和直接插入JavaScript代码。 动态加载外的外...

Bing309
36分钟前
3
0
从零开始入门 K8s | Kubernetes 网络概念及策略控制

作者 | 阿里巴巴高级技术专家 叶磊 一、Kubernetes 基本网络模型 本文来介绍一下 Kubernetes 对网络模型的一些想法。大家知道 Kubernetes 对于网络具体实现方案,没有什么限制,也没有给出特...

阿里巴巴云原生
40分钟前
3
0
天气获取

本文转载于:专业的前端网站➨天气获取 $.get("http://wthrcdn.etouch.cn/WeatherApi", { citykey: cityCode }, function (d) { //创建文档对象 var parser = new ......

前端老手
40分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部