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);
     }
}

 面向对象是一种将各个功能封装进对象的思想,强调了具备功能的对象,主体是对象,将过程简化。在实际开发中,以对象为核心,先明确好对象,再实现具体功能

 

posted @ 2014-07-05 10:03  iadanac  阅读(160)  评论(0编辑  收藏  举报