设计模式学习笔记(一)——面向对象设计模式与原则

转载 2007年09月18日 12:01:00

 今天听了《C#面向对象设计模式纵横谈(1):面向对象设计模式与原则》课程。总结了一些笔记。
 首先介绍了什么是设计模式:设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案。
 下面主要讨论面向对象设计模式。
 面向对象设计模式描述了类与相互通信的对象之间的组织关系。目的是应对变化、提高复用、减少改变。
 那到底什么是对象:
  1、从概念层面讲,对象是某种拥有职责的抽象;
  2、从规格层面讲,对象是一系列可以被其他对象使用的公共接口;
  3、从语言实现层面来看,对象封装了代码和数据(也就是行为和状态)。
 对于这三点,我理解最深的应该是第三点。这可能和我把大多精力放在了代码实现上有关,然而忽略了编程的的思想。如果我们抛开代码的实现来看对象的概念,那么它应该就像一个具体的物体,比如说:榔头,从概念层面讲,榔头有它的职责,也就是它是做什么用的(用来砸钉子,当然还会有其他用途,如防身),从规格层面讲,比如人使用榔头砸钉子。
 面向对象的设计模式有三大原则:
  1、这对接口编程,而不是针对实现编程。在知道设计模式之前,我对接口的出现很不理解。不明白为什么这个什么都不能实现的东西会存在,当然,也对多态表示茫然。实际上我是还没有理解面向对象编程的思想。在对设计模式略有了解后发现接口的确是一个好东西,用它实现多态的确减少了代码的修改。
 比如说在《Head First Design Patterns》中有一个例子,说一个有关鸭子的游戏。游戏当中有很多种的鸭子,如:野鸭,木头鸭,鸭子模型。我们首先会想到做一个抽象类:abstract class Duck,Duck当中有很多的抽象属性和方法,如quack。我们用子类继承的时候都会实例化这个方法。
 public abstract class Duck
 {
  public abstract void quack()
 }
 
 public class MallardDuck:Duck
 {
  public override void quack()
  {
   Console.Write("I can quack");
  }
 }
当程序成型后,我们有了很多种鸭子,突然,我们发现有的鸭子会飞,我们会在Duck中在加上一个抽象方法abstract void fly();于是我们不得不在所有的子类当中添加fly的实现,有人会说,如果我们在Duck中直接添加fly的实现,不久不用在子类中添加实现了吗?那老板就该问你:你见过木头鸭子满天飞(哦,天啊!木头鸭子也飞起来了,这是什么世界!)。对不起老板,现在咱们都见到了。
 这时我们换一种想法,如果我们把这些方法都提取出来,把它变成Duck的成员,好像问题就会简单些。
 哈哈,好像扯的有点远了,现在回来接着记我的笔记。
  2、优先使用对象组合,而不是类的继承。
 这就使说多使用“has a”,少使用“is a”,哈哈,我又想说回刚才的例子。换个角度考虑Duck及其功能,我们设计一个fly的接口和一些具体的飞行方法。
 public interface FlyBehavior
 {
  void fly();
 }

 public class FlyWithWing:FlyBehavior
 {
  public void fly()
  {
   Console.Write("I can fly/n");
  }
 }

 public class FlyNoWay:FlyBehavior
 {
  public void fly()
  {
   Console.Write("I can't fly/n");
  }
 } 
 好了,对于Duck来说,现在它应该有一个(has a)fly的方法
 public abstract class Duck
 {
  public Duck()
  {}
  public FlyBehavior flybehavior; 
 }
 现在我们再来实现两种鸭子
 public class ModelDuck:Duck
 {
  public ModelDuck()
  {
   flybehavior = new FlyNoWay();
  }
 }
 
 public class MallardDuck:Duck
 {
  public MallardDuck()
  {
   flybehavior = new FlyWithWing();
  }
 }
 这样如果要是在加上某种行为的话,我们就不必在每一种鸭子上下功夫。把注意力放在我们关心的鸭子品种上(别太使劲关注,小心禽流感,“阿切!”)。
  3、封装变化点,实现松耦合,这点不用多说了。
 课程中提到,编码当中的设计模式使用不是我们在编程之初就定下来的,应该是重构得到设计模式(Refactoring to Patterns)。哦,原来是这样,也好理解。在编码中遇到问题,然后想想应对方式。哈哈,我原来认为开始编程时就指定我们用什么设计模式呢。
 下面说说设计原则:
  1、单一职责原则(SRP):一个类应仅有一个引起它变化的原因。
  2、开放封闭原则(OCP):类模块应可扩展,不可修改。这里要说明一下,扩展和修改是不同的。比如:我们要在加一种ModelDuck,那么我们写一个ModelDuck的类继承Duck,这叫扩展,不是修改。什么是修改,就好像我们开始说的那种作法,为了加一个fly的功能,我们要把所有的子类中加入不同的实现,这叫修改。
  3、Liskov替换原则:子类可替换基类。
  4、依赖倒置原则:高层模块不依赖于低层模块,二者都依赖于抽象。还是刚才的例子:Duck是一个高层模块,fly是低层模块。Duck不依赖于fly,高层模块的改变慢,而低层模块的改变慢。
     抽象不应依赖于实现细节,实现细节应依赖于抽象。fly是一个抽象,它不依赖如何飞行。
  5、接口隔离原则:不强迫客户程序依赖于它们不用的方法(有道理,木头鸭子不会飞为什么要让它实现飞的功能。)
  最后有人提问接口和抽象类的区别:
   接口可以多继承,抽象类只能但继承。接口定义组件间的合同。使用抽象类为一个is a的关系。

 

设计模式之面向对象七大基本原则

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN。因为CSDN也支持MarkDown语法了,牛逼啊!概述在运用面向对象的思想进行软件设计时,需要遵循的原则一共有7个,他...
  • yanbober
  • yanbober
  • 2015年04月27日 16:25
  • 6287

C#面向对象设计模式纵横谈1

面向对象设计模式描述里面向对象设计过程中、特定场景下、 类与相互通信的对象之间常见的组织关系。设计模式是通过不断的重构得来的。敏捷开发:源代码就是设计懂面向对象设计模式的前提:懂面向对象面向对象的三...
  • shendejun
  • shendejun
  • 2015年06月08日 17:11
  • 369

Java面向对象设计模式

设计模式(Design Patterns)                                   ——可复用面向对象软件的基础       设计模式(Design pattern)是...
  • u011814346
  • u011814346
  • 2017年05月02日 14:17
  • 675

《Java设计模式》七大原则

最近几年来,人们踊跃的提倡和使用设计模式,其根本原因就是为了实现代码的复用性,增加代码的可维护性。设计模式的实现遵循了一些原则,从而达到代码的复用性及增加可维护性的目的,设计模式对理解面向对象的三大特...
  • u011225629
  • u011225629
  • 2015年08月16日 08:58
  • 1247

23种设计模式与6大原则综述

设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无...
  • k605726828
  • k605726828
  • 2015年11月22日 21:27
  • 679

代码重构 +设计模式六大原则 + 23种设计模式

学会单元测试,培养你的重构意识 可能上面说了这么多,还是有很多人并不理解重构。没关系,在这里我教你们一个快速入门的办法,就是单元测试。什么是单元测试,请自行google。单元测试有什么要求?就是要求你...
  • u013321328
  • u013321328
  • 2015年01月20日 15:17
  • 4619

面向对象开发与面向对象设计模式的几个核心的思想和概念 -java

>>>> 面向对象开发的几个核心思想 1、问题领域、对象、属性、状态、行为、方法、实现 问题领域:   指软件系统所模拟的真实世界中的系统,在现实生活中,比较常见的比如,税收、社保、银行、商...
  • ShareUs
  • ShareUs
  • 2016年03月21日 17:10
  • 2722

以一个简单的项目来学习面向对象编程(设计模式和多线程)

下面的项目是两年前学校老师布置的一个小项目,当时自己用了一种很笨拙的方式实现了,现在用面向对象的思想和多线程重构这个项目。问题描述:西宝高速仿真模拟 西安市到宝鸡市之间是我省主要的高速公路客运路线之...
  • yang_yulei
  • yang_yulei
  • 2015年03月09日 20:44
  • 2872

面向对象之设计模式

面向对象之设计模式前言 要想推开架构师的那扇大门,就离不开设计模式这把钥匙。对设计模式的理解与精通,是通往架构师之路的第一步 在任何面向对象语言的开发过程以及个人职业技能成长的道路中,新手与新手或者新...
  • u013263917
  • u013263917
  • 2016年11月22日 23:15
  • 745

设计模式是五大或六大还是七大原则?

设计模式是五大或六大还是七大原则?设计模式有五大原则或七大原则之分 按五大原则划分:1、2、3和4(算一种)、5和6(算一种)、7 按六大原则划分:1、2、3、4、5和6(算一种)、7 按七大原...
  • cadenzasolo
  • cadenzasolo
  • 2016年01月23日 00:43
  • 761
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式学习笔记(一)——面向对象设计模式与原则
举报原因:
原因补充:

(最多只允许输入30个字)