首页 > 代码库 > 设计模式 之 面向对象(OO)思维
设计模式 之 面向对象(OO)思维
[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020]
面向对象(OO)思维:
1. 考虑类
名词
2. 考虑属性
不可脱离具体的应用环境
3. 考虑方法
4. 考虑类之间的关系
5. 考虑隐藏(封装)
降低耦合度
6. 考虑继承
耦合度强,应该谨慎使用
7. 考虑多态
核心中的核心,多态带来了可扩展性。
多态有三个特性:1继承;2重写;3 父类的引用指向子类的对象
面向对象设计时需注意的问题:
1. 设计没有绝对的对与错
2. Over Design也是一种罪过
3. 没有任何实际中的设计会一步到位
4. 初学者不要考虑太多的原则和条条框框,最重要是动手写
注意区分抽象类与接口。
我们以“jesson用eclipse来写java程序”为例,来说明面向对象的思维。
1 考虑类
在这里,我们找名词,有"jesson"、“eclipse”、“java程序”,因此,一般情况下,我们至少需要三个类,分别装载这几名词。在创建类时,有一个问题,是直接新建一个jesson类吗????当然不是,这里的jesson仅仅是一个特例,是程序员一个特例,或者往大里说,是人的一个特例,是人的一个具体对象,但jesson并不是一类人。这里仅仅是强调是"写程序",所以就可以新建一个程序员类即Programmer类;这里的“eclipse”只是众多开发工具中的一种,所以可以新建一个DevelopmentTool类;同理,新建ProgrammingLanguage类。
2 考虑属性
在考虑类的属性时,要注意一点,“对于任何一个类,都不能脱离其应用环境,应该根据具体的应用环境封装其属性” ,因此对于Programmer类,我们首先能想到的是一个属性就是“程序员的名字”;同理,其他两个类都可以根据需要添加相应的属性。
3 考虑方法
对于Programmer类很容易想到,有一个“使用”use()的方法,用于选择开发工具;而对于DevelopmentTool类应该有一个"编辑或写"writre()的方法,同理,根据需要可以对ProgrammingLanguage类添加相应的方法。
4. 考虑类之间的关系
根据需求,是Programmer使用DevelopmentTool来写ProgrammingLanguage程序。
具体来说,“Programmer使用DevelopmentTool” ,所以可以在Programmer类中的use()方法中以DevelopmentTool作为参数;进一步,如果,我们考虑,Programmer使用DevelopmentTool写什么的问题时,我们可以重载use()方法,以DevelopmentTool对象和ProgrammingLanguage对象为参数。
5. 考虑封装
一般而言,应该将类的属性私有化,对应的根据需要为其添加set和get方法,这样,将类自身的功能,尽量让其自己完成。而这里的set和get方法,以及Programmer类中的use()方法,同样实现了封装。
6. 考虑继承
如果需求发生变化,如,jesson不使用eclipse而使用Notepad++了,这时,就可以考虑使用继承了,因为这里从最开始就是新建的是开发工具类,而不单纯的是eclipse类,加之,不管是eclipseg还是Notepad++都属于开发工具,所以它们都可以从DevelopmentTool类来继承。
7. 考虑多态
在使用者进行使用时,在调用Programmer类中use()方法时,不管传入的是Eclipse类还是Notepad类,调用的就是谁的write()方法,这就是多态,当然了,多态也体现在其他方面。
下面给出这个例子的代码:
Programmer.java
/** * 程序员类 * 包括属性:名字 * 包括方法:使用(开发工具) * @author jesson * */ public class Programmer { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void use(DevelopmentTool tool){ tool.write(new ProgrammingLanguage("java")); } public void use(DevelopmentTool tool,ProgrammingLanguage language){ tool.write(language); } }DevelopmentTool.java
/** * 开发工具抽象类 * 声明一个write()抽象方法 * @author jesson * */ public abstract class DevelopmentTool { public abstract void write(ProgrammingLanguage language); }Eclipse.java
/** * Eclipse类,继承自抽象开发工具类,并实现其抽象方法 * @author jesson * */ public class Eclipse extends DevelopmentTool{ @Override public void write(ProgrammingLanguage language) { // TODO Auto-generated method stub System.out.println("我是eclipse,我有自动提示的功能,我在写"+language.getName()+"程序"); } }Notpad.java
/** * Notpad类,继承自开发工具类,实现write抽象方法 * @author jesson * */ public class Notpad extends DevelopmentTool { @Override public void write(ProgrammingLanguage language) { // TODO Auto-generated method stub System.out.println("我是notepad,我有语法高亮的功能,我在写"+language.getName()+"程序"); } }ProgrammingLanguage.java
/** * 程序语言类 包括属性 name 及set和get方法 * * @author jesson * */ public class ProgrammingLanguage { private String name; public ProgrammingLanguage(String name) { // TODO Auto-generated constructor stub this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }Test.java
/** * 测试类 * @author jesson * */ public class Test { public static void main(String[] args) { Programmer programmer = new Programmer(); programmer.setName("jesson"); programmer.use(new Eclipse()); programmer.use(new Notpad()); } }
设计模式 之 面向对象(OO)思维