[学习笔记]面向对象开发中的一些思想和原则

摘自《Java与模式》作者阎宏

面向对象的可复用设计的第一块基石:开闭原则(一个软件实体应当对扩展开放,对修改关闭)

“开-闭”原则的手段和工具:

1)里氏代换原则:任何基类出现的地方,子类一定可以出现;

2)依赖倒转原则:要依赖于抽象,不要依赖于实现;

3)合成\聚合复用原则:要尽量使用合成\聚合,而不是继承关系达到复用的目的;

4)迪米特法则:一个软件实体应该与尽可能少的其它实体发生相互作用;

5)接口隔离原则:应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口;

接口常见用法:

接口的思想:"封转隔离"。--对被隔离体的职责的封装,外部调用和内部实现的隔离。

1)单方法接口

例如
Runnable接口只有一个run()方法,ActionListenser只有一个actionPerformed()

2)标识接口

没有任何方法和属性的接口,仅仅表明实现它的类属于一个特定的类型。例如Serializable

3)常量接口 -- 不推荐使用

用Java接口来声明一些常量,然后由实现这个接口的类使用这些常量

抽象类的设计思想:

1)针对抽象编程  --  依赖倒转原则

2)正确使用继承 -- 继承的两种实现:接口继承 & 实现继承。避免滥用

3)模版方法模式  --  关于继承的模式

几乎所有的模式都涉及到抽象类。

依赖倒转原则:

· 三种耦合关系:

在面向对象的系统里,两个类之间可以发生三种不同的耦合关系:

1)零耦合关系:两个类没有耦合关系;

2)具体耦合关系:发生在两个具体(可实例化的)的类之间,经由一个类对另一个具体类的直接引用造成;

3)抽象耦合关系:发生在一个具体类和一个抽象类(或接口)之间,使两个必须发生关系的类之间存在最大的类灵活性。

抽象耦合关系要求客户端依赖于抽象耦合。

抽象不应当依赖于细节;细节应当依赖于抽象。

要针对接口编程,不要针对实现编程。

接口隔离原则:

使用多个专门的接口比使用单一的总接口要好。

从一个客户类的角度讲:一个类对另一类的依赖性应当是建立在最小的接口上的。

“接口”往往指两种不同的东西:

1)有严格定义的interface结构;--定制服务-->适配器模式。

2)一个类型所具有的方法特征的集合,是一种逻辑上的抽象。--一个接口应当简单的代表一种角色,而不是多个角色。

过于臃肿的接口是对接口的污染。--要准确而恰当的划分角色以及角色所对应的接口。

合成/聚合复用原则:

在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的。

合成:用来表示一种强得多的“拥有”关系;多重性不超过1

聚合:用来表示“拥有”关系或者整体与部分的关系;

复用的基本种类:

1)合成/聚合复用

2)继承复用:类的实现继承(通过扩展一个已有对象的实现来扩展功能)

优点:①新的实现较为容易;②修改或扩展继承而来的实现较为容易;

缺点:①白箱复用:超类的实现细节被暴露给子类;②超类改变时,子类需改变子类以适应这种变化;③从超类继承来的实现是静态的,不可能在运行时间内发生变化,因此没有足够的灵活性。

“Is-A”与“Has-A”

Is-A:一个类是另一类的一种;--里氏代换原则

Has-A:一个类是另一类的一种角色;

JavaAPI中的反例:Vector<--Stack  
HashTable<--Properties

迪米特法则:

又叫最少知识法则,一个对象应当对其他对象有尽可能少的了解。

====================================================================================

1)创建模式 7

简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、多例模式、建造模式、原始模型模式

2)结构模式 8

适配器模式、缺省适配模式、合成模式、装饰模式、代理模式、享元模式、门面模式、桥梁模式

3)行为模式 12

不变模式、策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、解释器模式、调停者模式

[学习笔记]面向对象开发中的一些思想和原则

时间: 2025-01-02 15:16:07

[学习笔记]面向对象开发中的一些思想和原则的相关文章

JavaScript高级程序设计学习笔记--面向对象程序设计

工厂模式 虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码.为解决这个问题,人们开始使用 工厂模式的一种变体. function createPerson(name,age,job){ var o=new Object(); o.name=name; o.age=age; o.job=job; o.sayName=function(){ alert(this.name); }; return o; } var

大话设计模式学习笔记——面向对象基础

前言 好记性不如烂"笔头"系列--大话设计模式学习笔记 目录 面向对象基础 面向对象基础 什么是类与实例 一切事物皆为对象,即所有的东西老师对象,对象就是可以看到.感觉到.听到.触摸到.尝到.或闻到的东西.准确地说,对象是一个自包含的实体,用一组可识别的特性和行为来标识.面向对象编程,英文叫 Object-Oriented Programming,其实就是针对对象来进行编程的意思.类就是具有相同属性和功能的对象的抽象集合.实例就是一个真实的对象.比如我们属于'人'类,而个人就是'人'类

VSTO学习笔记(三) 开发Office 2010 64位COM加载项

原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(Automation Executables) 2.Office加载项(COM or Excel Add-In) 3.Office文档代码或模板(Code Behind an Office Document or Template) 4.Office 智能标签(Smart Tags) 本次我们将学习使

[java基础学习笔记]Java8SE开发环境搭建、第一个Java Hello World、Java程序的编译与执行

本文作者:sushengmiyan 本文地址:http://blog.csdn.net/sushengmiyan/article/details/25745945 主要内容: ---------------------------------------------------| 1.JDK的下载与安装                            | 2.编写第一个java程序HelloWorld     | 3.编译执行HelloWorld                      

面向对象开发中的七大设计原则和23种设计模式

一.面向对象开发中的七大设计原则 软件开发中最核心的思想就是"高内聚,低耦合",主要的目的也是为了方便后期的维护和变更.下面的设计原则也是依靠这个核心思想衍生出来的. 1.单一职责原则[SINGLE RESPONSIBILITY PRINCIPLE]:单一职责原则想表达的核心思想就是"高内聚",一个模块只完成一项功能.在面向对象设计中,一个类只应该负责一项职责,如果同时承担太多职责,就等于把这些职责耦合在了一起. 后面很可能因为某项职责的变更而导致其他职责的削弱或者

MVC4 学习笔记 之 URL中存在编译的空格 20%20%

/Config/Edit/QQCC%20%20%20%20%20%20%20 原因是: 通过EF直接添加了空格? NO 是因为你的数据库字段设计问题,因为你当然设计如>:sID nchar(10) 那你一定想输入10个字符,但实际你只输入了必个,所以后面数据自动帮你补空了. 从EF数据库取出数据,在绑定的时候为安全,编码了,所以显示%20,代表一个空格. MVC4 学习笔记 之 URL中存在编译的空格 20%20%,布布扣,bubuko.com

Guava学习笔记:guava中的Preconditions使用

Guava学习笔记:guava中的Preconditions使用 转载:http://outofmemory.cn/java/guava/base/Preconditions google guava的base包中提供的Preconditions类用来方便的做参数的校验,他主要提供如下方法: checkArgument 接受一个boolean类型的参数和一个可选的errorMsg参数,这个方法用来判断参数是否符合某种条件,符合什么条件google guava不关心,在不符合条件时会抛出Illeg

【学习笔记】jQuery中的动画与效果

1.基本效果 匹配元素从左上角开始变浓变大或缩小到左上角变淡变小 ①隐藏元素 除了可以设置匹配元素的display:none外,可以用以下函数 hide(speed,[callback])  返回值:jQuery  参数-speed:三种预订速度之一的字符串String(slow,normal,fast)或表示动画时长的毫秒数Number  callback:在完成动画时执行的函数,每个匹配元素执行一次 slow=600毫秒  normal=400毫秒  fast=200毫秒 以优雅的动画隐藏所

Cocos2dx 学习笔记整理----开发环境搭建

最近在学习cocos2dx,预备将学习过程整理成笔记. 需要的工具和环境整理一下: 使用的版本 cocos2dx目前已经出到了v3.1.1,学习和项目的话还是用2.2.3为宜,毕竟不大想做小白鼠,并且学习了几天之后才发出3.X版本的,版本内容变动比较大. 开发环境 1 jdk 1.6以上 2 python 2.7为宜(创建项目要用的) 3 NDT+Android SDK 4 Cygwin或者MinGW 开发工具 1 Eclipse + CDT + ADT 2 VS2010 3 Sublime T