面向对象设计思想
2013-12-28 15:44
204 查看
面向对象设计的一个重要经验:
谁拥有数据,谁就对外提供操作这些数据的方法,
谁具有这项属性,谁就提供操作这些属性的方法。
经典案例分析:
1、人在黑板上画圆
这个案例有三个对象:Person,Blackboard,Circle
有一个动作画圆,画圆这个动作可以封装成一个方法draw(),那么,这个draw()方法应该封装在那个类中呢?我们知道,要画圆就必须知道圆心和半径,也就是draw()方法需要使用圆心(x,y)和半径radius这两个属性,而这两个属性正是圆的两个属性,所以方法draw()就应该封装在圆Circle类里面。
draw() {
(x,y)、radius
}
2、列车司机刹车
首先我们要知道车子本身就有与刹车有关的一些特性,假如车子没有刹车相关的属性,比如离合器之类的等等,那么车子不可能被刹下来。我们总不能说刹石头,刹房子吧。因为石头,房子本身就没有与刹相关的属性如离合器、轮子之类的等等。所以刹车这个方法就应该封装在车子这个类里面,列车司机只是调用了车子的刹方法。
3、我关门
类似刹车,门本身就有比如旋转轴等与关相关的属性,所以关这个方法就应该封装在门这个类里面,我只是调用了门的关方法。逆向思维,假如我们把关封装在“我”类里面,那我就可以调用“关”的方法去关任何与我有关的东西,这显然不合理。
4、售货员统计票据金额
这个案例与前面类似,首先是票据上有金额数据,所以统计金额这个方法就应该封装在票据这个对象上,售货员只是调用了票据的统计金额的方法。
5、“两块石头磨成一把石刀,石刀可以砍树,砍成木材,木材做成椅子”
有哪些显式对象:Stone、Stoneknife、Tree、Material、Chair
两块石头-->一把石刀 ==> 从这里我们就应该想到两块石头应该作为参数传进去,返回的结果是石刀,所以还需要一个用石头作原料制作石刀的类,这里是KnifeFactory,它提供一个方法createKnife(Stone first, Stone second)返回结果是StoneKnife。
石刀把树看成木材 ==> 这里我们应该想到StoneKnife需要提供一个方法cut(Tree)返回值是Material
木材-->椅子 ==> 需要额外增加个椅子工厂类ChairFactory提供制作椅子的方法makeChair(Material)返回结果是Chair
Stone
KnifeFactory
StoneKnife = KnifeFactory.createKnife(Stone first, Stone second)
Tree
Material = StoneKinfe.cut(Tree)
ChairFactory
Chair = ChairFactory.makeChair(Material)
6、“小球从绳子的一端移动到另一端”
有两个对象绳子Rope和球Ball,一个必须有的方法move()
示意代码:
class Rope {
private Point start;
private Point end;
public Rope(Point start, Point end) {
this.start = start;
this.end = end;
}
public Point nextPoint(Point currentPoint) {
return null;
}
}
class Ball {
private Rope rope;
private Point currentPoint;
public Ball(Rope rope, Point startPoint) {
this.rope = rope;
currentPoint = startPoint;
}
public void move() {
currentPoint = rope.nextPoint(currentPoint);
System.out.println("小球移动到了" + currentPoint);
}
}
谁拥有数据,谁就对外提供操作这些数据的方法,
谁具有这项属性,谁就提供操作这些属性的方法。
经典案例分析:
1、人在黑板上画圆
这个案例有三个对象:Person,Blackboard,Circle
有一个动作画圆,画圆这个动作可以封装成一个方法draw(),那么,这个draw()方法应该封装在那个类中呢?我们知道,要画圆就必须知道圆心和半径,也就是draw()方法需要使用圆心(x,y)和半径radius这两个属性,而这两个属性正是圆的两个属性,所以方法draw()就应该封装在圆Circle类里面。
draw() {
(x,y)、radius
}
2、列车司机刹车
首先我们要知道车子本身就有与刹车有关的一些特性,假如车子没有刹车相关的属性,比如离合器之类的等等,那么车子不可能被刹下来。我们总不能说刹石头,刹房子吧。因为石头,房子本身就没有与刹相关的属性如离合器、轮子之类的等等。所以刹车这个方法就应该封装在车子这个类里面,列车司机只是调用了车子的刹方法。
3、我关门
类似刹车,门本身就有比如旋转轴等与关相关的属性,所以关这个方法就应该封装在门这个类里面,我只是调用了门的关方法。逆向思维,假如我们把关封装在“我”类里面,那我就可以调用“关”的方法去关任何与我有关的东西,这显然不合理。
4、售货员统计票据金额
这个案例与前面类似,首先是票据上有金额数据,所以统计金额这个方法就应该封装在票据这个对象上,售货员只是调用了票据的统计金额的方法。
5、“两块石头磨成一把石刀,石刀可以砍树,砍成木材,木材做成椅子”
有哪些显式对象:Stone、Stoneknife、Tree、Material、Chair
两块石头-->一把石刀 ==> 从这里我们就应该想到两块石头应该作为参数传进去,返回的结果是石刀,所以还需要一个用石头作原料制作石刀的类,这里是KnifeFactory,它提供一个方法createKnife(Stone first, Stone second)返回结果是StoneKnife。
石刀把树看成木材 ==> 这里我们应该想到StoneKnife需要提供一个方法cut(Tree)返回值是Material
木材-->椅子 ==> 需要额外增加个椅子工厂类ChairFactory提供制作椅子的方法makeChair(Material)返回结果是Chair
Stone
KnifeFactory
StoneKnife = KnifeFactory.createKnife(Stone first, Stone second)
Tree
Material = StoneKinfe.cut(Tree)
ChairFactory
Chair = ChairFactory.makeChair(Material)
6、“小球从绳子的一端移动到另一端”
有两个对象绳子Rope和球Ball,一个必须有的方法move()
示意代码:
class Rope {
private Point start;
private Point end;
public Rope(Point start, Point end) {
this.start = start;
this.end = end;
}
public Point nextPoint(Point currentPoint) {
return null;
}
}
class Ball {
private Rope rope;
private Point currentPoint;
public Ball(Rope rope, Point startPoint) {
this.rope = rope;
currentPoint = startPoint;
}
public void move() {
currentPoint = rope.nextPoint(currentPoint);
System.out.println("小球移动到了" + currentPoint);
}
}
相关文章推荐
- 面向对象思想设计_计算器小程序(设计模式入门篇_01)
- linux内核设计与实现思想 – C风格的面向对象
- 封装,面向对象设计编程思想
- 面向对象设计模式的几个基本原则及其核心思想简介
- 面向对象思想的设计原则概述
- 面向对象思想设计原则及常见设计模式
- 面向对象思想设计原则
- 【我的Java笔记】Java面向对象思想设计原则及常见设计模式
- 转:Java之面向对象思想设计原则
- 黑马程序员——面向对象思想、设计类与创建对象、对象与函数、方法与函数、合理设计类
- iOS类的合理设计,面向对象思想
- 【设计模式】Object Oriented面向对象思想剖析
- 面向对象设计思想与常见设计模式小结
- 黑马程序员_面向对象思想分析与设计
- 鸡啄米:C++编程入门系列之十二(类与对象:面向对象设计的基本思想和特点)
- JavaSE---多线程、面向对象设计思想、设计模式
- 06-03 Java 面向对象思想概述、开发设计特征,类和对象的定义使用,对象内存图
- JAVA基础再回首(二十六)——面向对象思想设计原则、设计模式、简单工厂模式、工厂方法模式、单例设计模式之饿汉式和懒汉式、Runtime类
- (Java实现) HDOJ 2023 求平均成绩 面向对象设计思想
- OC面向对象思想,类和对象的关系,类的设计笔记