首页 > 代码库 > 黑马程序员_Java面向对象思想

黑马程序员_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);     }}

面向对象是一种将各个功能封装进对象的思想,强调了具备功能的对象,主体是对象,将过程简化。在实际开发中,以对象为核心,先明确好对象,再实现具体功能。面向对象是一种思想理论,要远远高于编程语言。不深入理解面向对象理论就无法做到编写比较高级的软件,而且往往这些软件不能有效应对变化,不能复用,不能扩展,不能维护等。使用抽象方法还能应对软件的复杂度,因为抽象是对事物的简化方法。首先在学习面向对象前明白你的目的然后讲方法(这个很重要,如果目的不明,任何事情都做不好,而且肯定方法不对)。