深入浅出设计模式(四)

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

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

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中,用关键字extends表示继承关系。在UML中,继承关系用实线+空心箭头表示,箭头指向父类。

Public classDayanextends
Niao{

}

6.实现

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

代码:

Public classDayanImplements
Niaoleixingwei{

}

总结:

其实,聚合、组合是特殊的关联关系,继承和实现本质也是相同的;依赖是最弱的耦合关系,依赖和关联关系本质也是类似的,都是在一个类中使用另一个类。所以,这些联系也没什么难懂的,so
easy~~~

深入浅出设计模式(四),布布扣,bubuko.com

时间: 2024-12-29 11:27:59

深入浅出设计模式(四)的相关文章

深入浅出设计模式 ------ Abstract Factory(抽象工厂)

一. 定义  提供一个创建一系列相关或相互依赖对象的接口, 而无需指定它们的具体类. 二. 结构 三. 参与者 Product (Fruit和Leaf两个抽象产物) : 抽象生产者接口: TreeFruit(树上的水果). TreeLeaf(树上的叶子). GroundFruit(地上的水果). GroundLeaf(地上的叶子) : 实际的自然产物: NatureFactory: 抽象的自然制造工厂, 用于生产水果和叶子: TreeFactory. LeafFactory : 实际的自然制造工

深入浅出设计模式 PDF下载高清完整扫描原版

这是我看过最幽默最搞笑最亲切同时又让我收获巨大的技术书籍!森森的膜拜Freeman(s)!Amen!深入浅出,娓娓道来,有的地方能笑死你!不知是翻译还是原著的问题,有几个小地方有点小错误,个人观点,值得商榷.但是瑕不掩瑜啦! 需要学习的朋友可以通过网盘免费下载pdf版 (先点击普通下载-----再选择普通用户就能免费下载了)http://putpan.com/fs/7yib3enschu081088/ 内容简介  · · · · · · <深入浅出设计模式>(影印版)的编写运用许多最新的研究,

【白话设计模式四】单例模式(Singleton)

转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二]外观模式(Facade) [白话设计模式三]适配器模式(Adapter) [白话设计模式四]单例模式(Singleton) [白话设计模式五]工厂方法模式(Factory Method) [白话设计模式六]抽象工厂模式(Abstract Factory) [白话设计模式七]策

深入浅出设计模式 ------ Prototype(原型模式)之深度克隆

继上篇深入浅出设计模式 ------ Prototype(原型模式)的浅克隆实现, 本文进入Prototype(原型模式)的进阶篇----深度克隆. 深度克隆 ---- 序列化方式实现 把对象写到流里的过程是序列化(Serilization)过程,而把对象从流中读出来的过程则叫做反序列化(Deserialization).写在流里的是对象的一个克隆(新的, 独立的), 而原对象仍存在于JVM内存模型里.因此, 以下代码采用序列化方式实现深度克隆. 第一步: 将上篇的代码做些许改动, 加入对象引用

大话设计模式(四)单例模式的优与劣

大话设计模式(四)单例模式的优与劣 前言 首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了,比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个,这里就可以通过单例模式来避免两个打印作业同时输出到打印机中,即在整个的打印过程中我只有一个打印程序的实例.     简单说来,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(当然也可以不存在). 下图是单例模式的结构图. 下面就来看一种情况(这里先假

深入浅出设计模式系列 -- 单例模式

注:本文出自博主:chloneda 前言 深入浅出设计模式系列,尽量采用通俗易懂.循序渐进的方式,让大家真正理解设计模式的精髓! 单例模式知识点 在开始讲解单例模式之前,先了解一下单例模式的知识点. 单例模式定义:确保一个类只有一个自行实例化的实例,并提供一个全局访问点,向整个系统提供这个实例. 模式类型:创建类模式 单例模式类图: 单例模式可以简单总结为三个要素: 私有的构造方法. 提供私有的.静态的.指向当前实例的引用. 提供公有的.静态的方法 即全局访问点以返回这个实例. 单例模式的本质:

Java之美[从蛮荒到撬动地球]之设计模式四

其实每个设计模式都是很重要的一种思想,看上去很熟,其实是因为我们在学到的东西中都有涉及,尽管有时我们并不知道,其实在Java本身的设计之中处处都有体现,像AWT.JDBC.集合类.IO管道或者是Web框架,里面设计模式无处不在.因为我们篇幅有限,很难讲每一个设计模式都讲的很详细,不过我会尽我所能,尽量在有限的空间和篇幅内,把意思写清楚了,更好让大家明白.本章不出意外的话,应该是设计模式最后一讲了,首先还是上一下上篇开头的那个图: 本章讲讲第三类和第四类. 19.备忘录模式(Memento) 主要

深入浅出设计模式之工厂模式

一.引子 话说十年前,有一个暴发户,他家有三辆汽车---Benz奔驰.Bmw宝马.Audi奥迪,还雇了司机帮他开车.不过暴发户坐车时总是怪怪的:上Benz之后跟司机说"开奔驰车!",坐上Bmw后他说"开宝马车!",坐上Audi后说"开奥迪车!".你一定会说:这人有病!直接说开车不就行了?! 而当把这个暴发户的行为放到我们程序设计中来时,会发现这是一个普遍现象,幸运的是,这种有病的现象在OO(面向对象)语言中可以避免了.下面就以Java语言为基础来

Java设计模式(四) 之 模板方法模式

源码均以JDK1.8作为参考 1.定义: 定义一个操作中的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的机构即可重定义该算法的某些特定步骤. 2.解析: 通用类图: 类图解析: 模板方法模式非常简单,仅仅使用了Java的继承机制,但它是一个应用非常广泛的模式. 2.1.抽象模板(AbstractClass) 主要定义了模板中一些基本操作(方法),它的方法分为两类: 基本方法: 基本方法也叫基本操作,是由子类实现的方法,并且被模板方法被调用. 模板方法: 可以由一个或几个,一般