加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 直觉与设计原则

发布时间:2020-12-14 05:46:44 所属栏目:Java 来源:网络整理
导读:我有一个类层次结构,像这个饮料 – 咖啡 – 拿铁. 当饮料是由咖啡延伸的抽象超类.咖啡类然后添加一些行为,但也是抽象的.拿铁延伸咖啡班,是一个具体的班级.我使用继承来添加行为.而继承确实有超类方法的可见性的缺点,使代码变得脆弱,代码紧密耦合.因此,编程原
我有一个类层次结构,像这个饮料 – >咖啡 – >拿铁.
当饮料是由咖啡延伸的抽象超类.咖啡类然后添加一些行为,但也是抽象的.拿铁延伸咖啡班,是一个具体的班级.我使用继承来添加行为.而继承确实有超类方法的可见性的缺点,使代码变得脆弱,代码紧密耦合.因此,编程原理规定组合应优于继承.但在这种情况下,继承感觉如此自然,因为Latte是一种咖啡和咖啡是一种使用组合添加行为的饮料,尽管有其好处.所以这里的问题是
应该直觉超越设计原则?

饮料:

public abstract class Beverage {

    private final String name;
    private final double price;

    Beverage(String name,double price){
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }
    public double getPrice() {
        return price;
    }

    public abstract void make();
    }

咖啡:

public abstract class Coffee extends Beverage {

    public Coffee(String name,double price) {
        super(name,price);
    }


    public final void make(){
        grindBeans();
        takeShot();
        frothMilk();
        addCondiments();
    }

    public void grindBeans(){
        System.out.println("Grinding Beans...");
    }

    public void takeShot(){
        System.out.println("Taking Shot....");
    }

    public abstract void frothMilk();
    public abstract void addCondiments();


}

拿铁:

public class Latte extends Coffee {

    public Latte() {
        super("Latte",4.0);
    }

    @Override
    public void frothMilk() {
        System.out.println("Frothing milk to create micro foam");

    }

    @Override
    public void addCondiments() {
        // TODO Auto-generated method stub

    }

}

编辑:向现有结构添加糖.只显示新的代码.

public abstract class Beverage {

private Sugar sugar;

public Sugar getSugar() {
    return sugar;
}

public void setSugar(Sugar sugar) {
    this.sugar = sugar;
}

}

咖啡:

public abstract class Coffee extends Beverage {

public final void make(){
    grindBeans();
    takeShot();
    frothMilk();
    addSugar();
    addCondiments();
}

public void addSugar(){
    Sugar sugar = super.getSugar();
    if(!(sugar instanceof NoSugar)){
        System.out.println("adding " + sugar.getTeaspoon() + " teaspoon sugar");
    }
}

解决方法

虽然组合与遗产有很多好处,但使用继承感觉是自然的(即在真正的关系中)没有任何问题.如果它是自然的,请继续使用它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读