Java OO类在现实生活中理发的设计实例

时间:2014-09-30 07:18:46

标签: java class oop

伙计们,我对OOP很新。 我想设计OO类来表示人类如何执行理发动作

我有这样的初级班级蓝图:

class Human {
    Human(){}
    class Hair{
        private int length;
        Hair(){
            this.length=10;
        }
    }
}
class Tools{
    Tools(){}
    class Scissors{
        Scissors(){}
    }
}
class HoldingScissors{
    public void makeHairCut(Human theHuman){
        theHuman.Hair.length = 5;
    }
}

但是,我不知道如何将它们之间的关系联系起来。 我希望人类先“抓住”剪刀,然后才能剪发。 有人可以告诉我如何实现这个目标吗?

2 个答案:

答案 0 :(得分:4)

HoldingScissor可能不应该是一个类,而是一个能够执行一类操作的属性。

然而,有一百万种方法可以对此进行建模。关于OO有两件事:消息传递和封装;不要只关注对象粒度,因为你会追逐错误的抽象

abstract class Action {
  public void perform();
}


public class CutHairsAction {

 Human agent,target;

 public  CutHairsAction(Human agent, Human target) {
   if (agent.getHolding() == null) throw new IllegalStateException("agent not holding scissors"); 
   if (! agent.getHolding() instanceOf Scissor) throw new IllegalStateException("agent not holding scissors"); 
 if (target.Hair.lenght < 5) throw new IllegalStateException("target hair short enough"); 

   this.target = target;
   this.agent = agent;
 }

 public void perform() {
 target.Hair.length = 5;
 }
}

答案 1 :(得分:2)

我认为你在这里缺少一些课程(更不用说这些课程应该是公开的 - 不是内部的,因为你已经写好了)。应该有Human的子类Barber(或者Stylist)。 只有理发师应该被允许改变人类的发型(特定的人类可以接受#34; barber&#34; - 包括理发的人 - 嘿,人们剪掉自己的头发所有的时间!)。

我认为定义一个剪刀类是不合适的,除非你打算模拟剪刀的动作(用你的简单概念很明显你打算模拟什么剪刀实际上做)。相反,理发师(或造型师)应该能够直接修改人类的剪发(让它保持真实 - 真的是这里的头发长度)。在现实生活中,理发师可能会使用剪刀(或剪切工),但你并没有将 的一部分建模,因此创建剪刀(或剪切工)课程是多余的。

如果您合法地拥有Scissors(或Shearers)课程,那么您需要区分不同的剪刀(或剪切者)剪头发的方式。如果你没有这样的区别,那么拥有这个课程毫无意义。例如,钝刀可能会比锋利的剪刀剪掉头发。因此,如果理发师使用钝刀(或者等级为#34;无光泽&#34;),对于使用不同剪刀的同一个理发师来说,它可能会有不同的切割 - 如果他们所有切割相同,那么你是不是建模剪刀,因此不需要Scissors类/对象。