从一个模拟鸭子(SimuDuck)的游戏开始我们的模式入门:
设计一套模拟鸭子的应用程序,可以让模拟的鸭子表现出各种各样的行为。起初根据实际情况设计出来的类图是:
图1
注:实线带一个三角箭头为继承,虚线带一个三角箭头为实现
几天后客户突然提出了新的要求,客户要让鸭子飞起来,以表现自己的竞争力,于是我们在超类Duck中加入了fly()方法,以使子类具有飞行的方法。
问题出来了:
Question1:这样继承导致某些不具有飞行行为的子类也具有了飞行行为,这是很可怕的。
Question2:以后需求还会不断变化,这样超类的修改会很频繁,直接导致的后果是,子类的维护会出现很大的困难,即我们所说的类爆炸。
提示1:在涉及到维护时,为了复用项目而使用继承,并不完美
利用继承来提供鸭子的行为,会导致下列的缺点:
1:代码在多个子类中的重复2:运行时的行为不容易改变3:很难知道所有鸭子的行为4:改变会造成不需要改变的部分也改变了
在继承不能解决问题的情况下,我们进一步提出了通过实现接口来改变这种状态,类图如下:
图2
这样可以使得只有那些会飞的鸭子采取实现飞行接口,但是又产生了另一个问题:代码的复用问题。(接口不具有实现代码,所以继承接口无法达到代码的复用)
设计原则1:找出应用中可能需要变化的部分,把他们独立出来,不要和那些不需要变化的代码混在一起。
结果会是:代码变化引起的不经意后果减少,系统变的会有弹性。
设计原则2:针对接口编程,而不是针对实现编程;(针对接口编程是针对超类型编程,,多态起到了关键作用。好好琢磨,)
无论是继承自超类的行为,还是子类自己实现的行为,都是针对实现编程,这样,我们的行为会被固定成一个模式,很难有变化。现在假如我们定义了两个接口一个是飞行接口(FlyBehavior)和叫的接口(QuackBehavior),然后定义具体的实现类(行为子类)去实现这两个接口,这样,子类在实现行为时会继承这些行为类的方法,既达到了代码的复用,也达到了系统有弹性,以后要增加实际子类时,只要根据子类的行为动态的去更改行为子类就可以了。
针对几口编程举例:现在又两个类Dog和Animal,Dog继承自Animal,
针对实现编程:Dog d = new Dog();
d.bark();
针对接口编程:Animal animal = new Dog();
Animal.makeSound();
程序类图的初步整合:
图3
在最后整合的类图中我们可以看到,超类Duck类并没有做很大的变化,只是将叫的行为和飞的行为分离出来,他们是由一系列实现了飞行接口和叫的接口的行为类组成的,这样既实现了继承带来的代码复用,又避免了继承所带来的沉重包袱。
最终的程序类图组合为:
图4
每一个Duck有一个飞行接口和叫的接口,将飞行和瓜瓜叫委托给他们代为处理。
这时鸭子的行为不是从超类继承过来的,而是和适当的行为对象组合而来的,系统弹性很大。
至此,我们的模拟鸭子程序就初步完成了,当然模式是一种经验的结合,他不是绝对的,不同的场合可以用到不同的模式甚至是不同模式的组合,这是随着开发人员的经验而设计的。
我们将模拟鸭子所用到的模式定义为:策略模式
定义一些算法族,将他们封装起来,让他们可以互相替换,使得算法的变换独立于使用算法的客户。
模式要点:
1:知道oo基础,并不足以让你设计出良好的oo系统,即可维护、可扩展、弹性大。
2:模式不只是一个名称,它代表的是一整套模式背后所象征的质量、特性和约束。
3:模式不是代码,而是解决一系列问题的通用方案。
4:大多的模式都遵循局部改变独立于系统的其他部分。
5:模式将变化的部分和不变化的部分分离出来。
- 大小: 83.3 KB
- 大小: 66.2 KB
- 大小: 61.6 KB
- 大小: 296.3 KB
分享到:
相关推荐
java设计模式小结,总结了3个 希望给大家一些帮助!
目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式
从面向对象程序设计的7个基本原则出发,用浅显易懂、可视化的UML建模...每章包括教学目标、重点内容、模式的定义与特点、模式的结构与实现、模式的应用场景与应用实例、模式的扩展、章节小结和单元习题等8方面的内容。
### 设计模式精要 设计模式是软件工程领域的一个重要概念,它提供了一套解决常见问题的模板,有助于提高代码的可读性、可维护性和重用性。本文旨在总结几种核心的设计模式,包括依赖、关联、聚合、组合、继承、实现...
JAVA IO流小结 JAVA IO流是指Java语言中用来实现输入/输出操作的机制。IO流是指任何有能力产出数据的数据源对象或者有能力接收数据的数据源对象。他屏蔽了实际的I/O设备处理数据的细节。 一、流的定义和分类 流是...
JAVA模块知识小结涵盖的内容非常广泛,包含了Java技术栈中的多个重要知识点,从基础的开发工具到框架、数据库以及编程语言本身,以下是对给定文件中提到的各项技术的详细知识点梳理: 1. Hibernate和Ibatis ...
2.9 小结 53 第3章 创建型模式 54 3.1 Abstract Factory(抽象工厂)— 对象创建型模式 57 3.2 Builder(生成器)—对象创建型 模式 63 3.3 Factory Method(工厂方法)— 对象创建型模式 70 3.4 Prototype...
创建型设计模式是软件设计模式中的重要类别,主要用于对象的创建。这些模式提供了一种在创建对象时封装变化的方式,使得代码更具可扩展性和可维护性。以下是对几种主要创建型设计模式的详细阐述: 1. 单例模式:...
### Java设计模式详解 #### 一、概述 设计模式是在软件设计过程中针对常见的问题而提出的通用解决方案。在Java编程中,设计模式可以帮助开发者编写出更易于维护和扩展的代码。根据设计模式的目的不同,通常将其...
以上介绍了几种典型的Java设计模式,并结合了“追美眉”的生活化场景进行了说明。这些模式不仅可以帮助我们更好地组织代码,还能让我们编写出更加灵活、可维护的程序。在实际开发中,合理运用这些设计模式,可以使...
### Java多线程设计模式详解 #### 一、Java多线程基础 Java语言自诞生以来,便内置了对多线程的支持。多线程能够让程序在同一时间处理多个任务,提高程序的执行效率和响应速度。Java中创建线程有两种基本方式: 1...
2.9 小结 53 第3章 创建型模式 54 3.1 Abstract Factory(抽象工厂)— 对象创建型模式 57 3.2 Builder(生成器)—对象创建型 模式 63 3.3 Factory Method(工厂方法)— 对象创建型模式 70 3.4 Prototype(原型)...
本文档“JAVA程序:接口小结”很可能是对Java接口的全面总结,包含了相关的代码示例,帮助学习者深入理解和运用接口。 接口在Java中的主要特性包括: 1. **接口是完全抽象的**:接口中的所有方法默认都是抽象的,...
Tomcat 系统架构与设计模式,第 1 部分:工作原理 本文将从 Tomcat 系统架构与设计模式的角度,探讨其工作原理的第 1 部分,我们将从以下几个方面进行讨论: 1. Tomcat 系统架构概述 Tomcat 是一个基于 Java 的...
本篇将深入探讨Java Swing中的关键组件和设计模式,以及如何利用它们来创建一个简单的QQ登录界面。 在Swing组件库中,我们有多种基础组件,如JButton、JLabel、JTextField、JPasswordField等,它们是构建用户界面的...
这个"java基础知识从业必备知识点结构图小结.rar"压缩包文件,通过图像化的方式,帮助初学者和从业者快速概览Java的主要知识点,并提供了进一步学习的方向。无论是初入Java殿堂的新手,还是需要巩固基础的开发者,都...
其中关于设计模式的部分尤其值得一提,它不仅列举了许多常用的设计模式,还通过示例程序展示了如何将这些模式应用于实际的Java项目中,极大地增强了读者的理解和应用能力。 #### JavaTM 2 SDK, Standard Edition *...
阐述MVC设计模式的组成和工作原理,适用于教学。