设计模式学习笔记之设计原则

利用继承来提供对象的行为,会导致:

1、代码在多个子类中重复                            2、很难知道所有鸭子的全部行为

3、运行时的行为不易改变                            4、改变会牵一发而动全身,造成其他鸭子不想要的改变

 

设计原则 1 找出应用之中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。

注释:把会变化的部分取出并“封装”起来,以便以后可以轻易的改动或者扩充此部分,好让其他部分不受影响。代码变化引起的不经意后果变少,系统变得更有弹性。

例:在设计鸭子类Duck时,鸭子的行为包括飞和叫,不同鸭子的行为是不同的,所以对于鸭子类Duck来说,行为飞和叫是会变化的部分,所以应当取出并“封装”起来,建立一组新类来代表每个行为。

  

设计原则 2:针对接口编程,而不是针对实现编程。实现行为与主体分离

注释:利用接口代表每个行为,而行为的每个实现都将实现其中的一个接口。

“针对接口编程”真正的意思是 “针对超类型编程”。

这里“接口”有多个含义,接口是一个“概念”,也是一种java的interface构造。

“针对超类型编程”可以 理解为:变量的声明类型应该是超类型,通常是一个抽象类或者是一个接口,如此,只要是实现此超类型的类所产生的对象,都可以指定给这个变量。这也意味着,声明类时不用理会以后执行时的真正对象类型。

设计原则 3多用组合,少用继承

       使用组合建立系统具有很大的弹性,不仅可将算法族封装成类,更可以“在运行时动态的改变行为”,只要组合的行为对象符合正确的接口标准即可。

设计原则 4:为了交互对象之间的松耦合设计而努力

    松耦合的设计之所以能让我们建立有弹性的OO系统,能够应对变化,是因为对象之间的互相依赖降到了最低。

 

设计原则 5

:类应该对扩展开放,对修改关闭

目标是允许类容易扩展,在不修改现有代码的情况下,就可搭配新的行为。这样的设计具有弹性可以应对改变,可以接受新的功能来应对改变的需求。

设计原则 6

:“最少知识”原则

减少对象之间的,只留下几个必须的。不要让太多类耦合在一起。免得修改系统中的一部分。会影响到其他部分。

对任何对象而言,在该对象的方法内,我们应该只调用以下范围的方法:

1、该对象本身;

2、被当做方法的参数而传递进来的对象;

3、此方法所创建或实例化的对象;

4、对象的任何组件;

设计原则 7:“好莱坞 ”原则

    允许底层组件挂钩到系统上,但是高层组件会决定什么时候和怎样使用这些底层组件。

设计原则 8:单一责任

一个类应该只有一个引起变化的原因

   类的每一个责任都有改变的潜在区域。超过一个责任,意味着超过一个改变的区域。

 

 

 

参考资料:《Head First 设计模式》

时间: 2024-10-10 14:55:17

设计模式学习笔记之设计原则的相关文章

【我的《冒号课堂》学习笔记】设计原则(2)依赖原则

依赖原则 间接原则有一个直接的推论,就是依赖反转原则(Dependency Inversion Principle),简称DIP.依赖反转原则就是高层模块不应依赖低层模块,它们都应依赖抽象:抽象不应依赖细节,细节应依赖抽象. 1)DIP的产生背景 从代码实现的角度来看,高层模块依赖低层模块是很正常的.而且高层模块与低层模块之间往往是决策(policy)与机制(mechanism)之间的关系,高层决策以低层机制为基础,逻辑上似乎也很合理.然而从软件设计上的角度看,这种依赖性却是非常不合理的.依赖通

【我的《冒号课堂》学习笔记】设计原则(1)间接原则

间接原则 All problems in computer science can be solved by another level of indirection, except of course for the problem of too many indirections. ——David Wheeler 这是一句计算机界的名言.在计算机领域中这样的例子数不胜数,像文件系统中的路径path,HTTP中的URI.数据库中的外键foreign key.程序中的变量均具有间接指代作业. 先

【我的《冒号课堂》学习笔记】设计原则(3)内聚原则

内聚原则 “高内聚,低耦合”原则是软件模块设计的通用原则.实际上,该原则最早出现在结构化设计(structured design)中,后被引入对象式设计.耦合和内聚是衡量软件设计质量的两个重要指标,是检验模块设计是否合理的主要标准.其中,耦合(coupling)反映模块之间的关联程度,内聚(cohesion)反映模块内部的关联强度. 以上是常见的耦合类型和内聚类型.模块化的目的是把一个复杂的系统分解成几个相对独立简单.具有特定功能的软件组件,以便分开管理.模块职责单一而明确,关系简单清晰就是遵循

java/android 设计模式学习笔记(7)---装饰者模式

这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一,但比继承更加灵活.在现实生活中也可以看到很多装饰者模式的例子,或者可以大胆的说装饰者模式无处不在,就拿一件东西来说,可以给它披上无数层不一样的外壳,但是这件东西还是这件东西,外壳不过是用来扩展这个东西的功能而已,这就是装饰者模式,装饰者的这个角色也许各不相同但是被装饰的对

java/android 设计模式学习笔记(12)---组合模式

这篇我们来介绍一下组合模式(Composite Pattern),它也称为部分整体模式(Part-Whole Pattern),结构型模式之一.组合模式比较简单,它将一组相似的对象看作一个对象处理,并根据一个树状结构来组合对象,然后提供一个统一的方法去访问相应的对象,以此忽略掉对象与对象集合之间的差别.这个最典型的例子就是数据结构中的树了,如果一个节点有子节点,那么它就是枝干节点,如果没有子节点,那么它就是叶子节点,那么怎么把枝干节点和叶子节点统一当作一种对象处理呢?这就需要用到组合模式了. 转

java/android 设计模式学习笔记(6)---适配器模式

这篇来介绍一下适配器模式(Adapter Pattern),适配器模式在开发中使用的频率也是很高的,像 ListView 和 RecyclerView 的 Adapter 等都是使用的适配器模式.在我们的实际生活中也有很多类似于适配器的例子,比如香港的插座和大陆的插座就是两种格式的,为了能够成功适配,一般会在中间加上一个电源适配器,形如: 这样就能够将原来不符合的现有系统和目标系统通过适配器成功连接. 说到底,适配器模式是将原来不兼容的两个类融合在一起,它有点类似于粘合剂,将不同的东西通过一种转

java/android 设计模式学习笔记(3)---工厂方法模式

这篇来介绍一下工厂方法模式(Factory Method Pattern),在实际开发过程中我们都习惯于直接使用 new 关键字用来创建一个对象,可是有时候对象的创造需要一系列的步骤:你可能需要计算或取得对象的初始设置:选择生成哪个子对象实例:或在生成你需要的对象之前必须先生成一些辅助功能的对象,这个时候就需要了解该对象创建的细节,也就是说使用的地方与该对象的实现耦合在了一起,不利于扩展,为了解决这个问题就需要用到我们的工厂方法模式,它适合那些创建复杂的对象的场景,工厂方法模式也是一个使用频率很

设计模式学习笔记--迭代(Iterator)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

策略模式(headfirst设计模式学习笔记)

策略模式定义了算法族,分别封装起来,让他们可以相互替换,此模式让算法的变化独立于使用算法的客户. 继承,相似之处用继承,假如如干个功能点需要修改,代码难以维护, 原始代码 public class Duck { //鸭子描述 public void dispaly(){ System.out.println("描述"); } //鸭子叫 public void quack(){ System.out.println("会叫"); } } public class M