Java面向对象思想
面向对象要把握一个重要的经验:谁拥有数据,谁就对外提供操作这些数据的方法 。
1.人在黑板上画圆
- 对于这个设计,上面有Person, Blackborad , Circle三个对象
- 动词 : 画
- 因为画的动作的数据:坐标(x,y),半径(randius) 是Circle拥有的数据,所以 draw()方法应该属于Circle对象,而不是动作的发出者Person。
注意:【动作发出者往往会委托动作承受者 】
2.司机紧急刹车
- 对于这个设计,上面有Driver, Car两个对象
- 动词 : 刹车
- 因为刹车的动作的数据:作用力power,作用时间time, 是Car拥有的数据,所以 stop()方法应该属于Car对象,而不是动作的发出者Driver。
3.售货员统计收获小票的金额 :售货员统计小票的动作会委托小票来完成。
4.小利把门关上了 :小利关门的动作会委托门本身来完成,所以关门这个动作应定义在Door对象中,而非小利中。
5.球从一根绳子的一段移动到了另一端
- 球的移动是需要修改球本身的参数,所以方法由球本身来提供
- 球参数的获取是通过委托绳子来完成,所以任何两个事物之间的交换最好使用委托模式 。
import java.awt.Point; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; class Line{ private Point startPoint; private Point endPoint; public Line(Point sPoint,Point ePoint){ startPoint = sPoint; endPoint = ePoint; } public Point getStartPoint() { return startPoint; } public void setStartPoint(Point startPoint) { this.startPoint = startPoint; } public Point getEndPoint() { return endPoint; } public void setEndPoint(Point endPoint) { this.endPoint = endPoint; } public Point nextPoint() { //计算下一个移动点 Point nextPoint =new Point(startPoint.getLocation()); if (nextPoint.distance(endPoint) >= 0) { return startPoint; }else if (nextPoint.distance(startPoint) < 0) { return startPoint; }else{ nextPoint.setLocation(startPoint.getX()+1, startPoint.getY()+1); return nextPoint; } } } class Ball { private Point myPoint; private Line line; public Ball() { line=new Line(new Point(1,1),new Point(5,5)); myPoint=line.getStartPoint(); System.out.println("小球的起始坐标为:("+myPoint.getX()+","+myPoint.getY()+")"); /*定时器timer,让小球1s后开始移动,并且每隔1s移动1次*/ ScheduledExecutorService timer = Executors.newScheduledThreadPool(1); timer.scheduleAtFixedRate(new Runnable() { @Override public void run() { System.out.println("小球现在的坐标为:("+myPoint.getX()+ "," + myPoint.getY()+")"); move(); } }, 1, 1, TimeUnit.SECONDS); } public void move() { myPoint=line.nextPoint(); } } public class Test{ public static void main(String[] args) { new Ball(); } }
6.两块石头磨成一把石刀,石刀可以砍树,砍成木材,木材做成椅子
//石头 class Stone{ public Stone(){} } //木材 class Wood{ public Wood(){} } //树 class Tree{ public Tree(){} //变成木材 public void toWood(){return new Wood();} } //椅子 class Chair{ pubilc Chair(){} } //石刀 class StoneKnife{ //砍树 public Wood[] cutTree(Tree tree) { return tree.toWood(); } } //石刀工厂 class StoneKnifeFactory{ //制造石刀 public StoneKnife makeStoneKnife(Stone[] stones){ return new StoneKnife(); } } //椅子工厂 class ChairFactory{ //制造椅子 public Chair makeChair(Wood woods){ return new Chair(); } } //主函数 class Program { public static void main(String[] args) { Stones[] stones = {new Stone(),new Stone()}; StoneKnife sk=StoneKnifeFactory.makeStoneKnife(stones); Wood wood=sk.cutTree(new Tree()); ChairFactory.makeChair(wood); } }
面向对象是一种将各个功能封装进对象的思想,强调了具备功能的对象,主体是对象,将过程简化。在实际开发中,以对象为核心,先明确好对象,再实现具体功能。