大家帮忙看看我的设计是否有问题

时间:2008-08-27 09:01:47   来源:论坛整理  作者:  编辑:chinaitzhe
1.下面是一个题目,有2种电话供应商,当然我的程序可以加很多供应商,根据电话号码去找最长匹配的价格,然后2个不同供应商比较找出最小的价格。比如A有 Operator A:
1 0.9
268 5.1
46 0.17
4620 0.0
468 0.15
4631 0.15
4673 0.9
46732 1.1

Operator B:
1 0.92
44 0.5
46 0.2
467 1.0
48 1.2

给你一个号码4673212345,在 A中你就找到是1.1,在 B中就是1.0,然后你的程序给出的最低价格是1.0

为此我写了三个类,大家可以给我提提建议,哪里面向对象设计不好,或者没有遵守java规范。代码是可以运行的!
1.Operator.java
Java code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





import java.util.HashMap;

import java.util.Map;



public class Operator {

    

    private String name;



    private Map<Long, OperatorCallPrice> priceMap = new HashMap<Long, OperatorCallPrice>();



    public String getName() {

        return name;

    }



    public void setName(String name) {

        this.name = name;

    }



    /**

     * 读取一个前缀的数据

     * 

     * @param prefix

     * @return

     */

    public OperatorCallPrice getOperatorCallPrice(Long prefix) {

        return priceMap.get(prefix);

    }



    /**

     * 增加一个费用数据

     * 

     * @param prefix

     * @param price

     */

    public OperatorCallPrice addOperatorCallPrice(Long prefix, Double price) {

        OperatorCallPrice operatorCallPrice = new OperatorCallPrice();

        operatorCallPrice.setOperator(this);

        operatorCallPrice.setPrefix(prefix);

        operatorCallPrice.setPrice(price);

        priceMap.put(prefix, operatorCallPrice);

        return operatorCallPrice;

    }



    /**

     * 删除一个费用数据

     * 

     * @param prefix

     * @return

     */

    public OperatorCallPrice removeOperatorCallPrice(Long prefix) {

        return priceMap.remove(prefix);

    }



}




2. OperatorCallPrice.java
Java code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





public class OperatorCallPrice {



    private Operator operator;



    private Long prefix;



    private Double price;



    @Override

    public String toString() {

        return "Operator="   operator.getName()   "\r\nPrefix="   getPrefix()

                  "\r\nPrice="   getPrice();

    }



    /**

     * 

     * @return

     */

    public Operator getOperator() {

        return operator;

    }



    /**

     * 

     * @param operator

     */

    public void setOperator(Operator operator) {

        this.operator = operator;

    }



    public Long getPrefix() {

        return prefix;

    }



    public void setPrefix(Long prefix) {

        this.prefix = prefix;

    }



    public Double getPrice() {

        return price;

    }



    public void setPrice(Double price) {

        this.price = price;

    }



}




3.OperatorManager.java 这个类可以运行的
Java code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





import java.util.HashMap;

import java.util.Map;





/**

 * 供应商manager类

 * 

 *

 * 

 */

public class OperatorManager {



    // 供应商的名字对照

    private Map<String, Operator> operatorMap = new HashMap<String, Operator>();





    /**

     * 通过名字拿到供应商

     * 

     * @param name

     * @return

     */

    public Operator getOperator(String name) {

        return operatorMap.get(name);

    }



    /**

     * 增加供应商

     * 

     * @param op

     */

    public void addOperator(Operator operator) {

        operatorMap.put(operator.getName(), operator);

    }



    /**

     * 删除供应商

     * 

     * @param name

     * @return

     */

    public Operator removeOperator(String name) {

        return operatorMap.remove(name);

    }



    /**

     * 搜索,进行遍历

     * 

     * @param phone

     * @return

     */

    public OperatorCallPrice findByPhoneNumber(Long phone) {

        OperatorCallPrice operatorCallPrice = new OperatorCallPrice();

        operatorCallPrice.setPrice(Double.MAX_VALUE);

        operatorCallPrice.setPrefix(phone);

        OperatorCallPrice tmp = null;

        long phonetemp;

        for (Operator o : operatorMap.values()) {

            phonetemp = phone;

            while (phonetemp > 0) {

                tmp = o.getOperatorCallPrice(phonetemp);

                if (tmp != null) {

                    if (tmp.getPrice() < operatorCallPrice.getPrice()) {

                        operatorCallPrice.setOperator(tmp.getOperator());

                        operatorCallPrice.setPrice(tmp.getPrice());

                        operatorCallPrice.setPrefix(tmp.getPrefix());

                    }

                    break;

                }

                phonetemp /= 10;

            }

        }

        return operatorCallPrice;

    }



    /**

     * 添加不同类供应商和号码前缀、价格

     * 

     */

    private void init() {

        Operator operator = new Operator();

        operator.setName("Operator A");

        operator.addOperatorCallPrice(1L, 0.9);

        operator.addOperatorCallPrice(268L, 5.1);

        operator.addOperatorCallPrice(46L, 0.17);

        operator.addOperatorCallPrice(4620L, 0.0);

        operator.addOperatorCallPrice(468L, 0.15);

        operator.addOperatorCallPrice(4631L, 0.15);

        operator.addOperatorCallPrice(4673L, 0.9);

        operator.addOperatorCallPrice(46732L, 1.1);

        this.addOperator(operator);

        operator = new Operator();

        operator.setName("Operator B");

        operator.addOperatorCallPrice(1L, 0.92);

        operator.addOperatorCallPrice(44L, 0.5);

        operator.addOperatorCallPrice(46L, 0.2);

        operator.addOperatorCallPrice(467L, 1.0);

        operator.addOperatorCallPrice(48L, 1.2);

        this.addOperator(operator);

    }



    /**

     * 输入测试号码

     * 

     * @param args

     */

    public static void main(String[] args) {

        OperatorManager operatorManager = new OperatorManager();

        operatorManager.init();

        OperatorCallPrice operatorCallPrice = operatorManager.findByPhoneNumber(449812345L);

        System.out

                .println((operatorCallPrice == null || operatorCallPrice.getOperator() == null) ? "not found operator!"

                        : operatorCallPrice);

    }

}







网友回复:谢谢,很急,帮我看看有什么问题!面向对象设计 方面 还有任何有的问题!
网友回复:这也太长了吧,你自己不会试试吗,要是出错的话给你找些错误还行,
复制-->粘贴-->去瞧瞧,有答案的话给你说
网友回复:没有任何问题,而且代码 能跑! 就是设计上不知道 有什么不足
比如
网友回复:号码用long,不合适
第一长度有限,第二不能0开头
网友回复:没有从0开始的!我们不考虑这种情况!
网友回复:本来应该是建B 树
然后一个数字一个数字的匹配

现在看来没必要了,^_^
网友回复:楼上的,我的代码 面向对象方面没有问题吗?
有人说我的 operator和 operatorcallprice耦合性太强,
还有人说我的manager类 的逻辑 太复杂 就是那个findByPhoneNumber方法,复杂,不能复用!
网友回复:顶啊,路过的大佬!
网友回复:up


谢谢各位了!
网友回复:会的帮楼主答答啊!
网友回复:个人觉得
operatorcallprice
没多大必要

要是我会在operator里面加arraylist来保存价格

然后operator价格能的到相关号码price的函数
这样OperatorManager
就很简化了 容易理解
网友回复:map怎么办啊
网友回复:up!大牛们 人呢???
网友回复:
不知道你为什么要用map
我是没用过

我这些都直接用arraylist可控制大小.
查找也有相关的函数可以用operator直接返回价格
OperatorManager 就把所有的价格比下就完了
网友回复:map当然要用
数据多了,肯定不能用循环
网友回复:是的啊,正解!
关键字:问题,

相关文章

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面