首页 > 代码库 > 设计模式 之 面向对象(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)思维