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);
}
}
面向对象是一种将各个功能封装进对象的思想,强调了具备功能的对象,主体是对象,将过程简化。在实际开发中,以对象为核心,先明确好对象,再实现具体功能。
浙公网安备 33010602011771号