面向对象设计原则

先占个坑,一边学习一边更新。

1.依赖倒置原则:要依赖抽象,不要依赖具体类。

举个例子吧:

假如我们要设计一个购物车,购物车用来装各种水果(苹果、香蕉等)

那么如果不依赖抽象,我们的代码看起来就是这个样子的:

苹果类:

public class Apple {
   
    private int price;

    public String getName() {
        return this.getClass().getSimpleName();
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }
}

香蕉类:

public class Banana {

    private int price;

    public String getName() {
        return this.getClass().getSimpleName();
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }
}

购物车类:

import java.util.ArrayList;
import java.util.List;

public class ShoppingCart {

    List items = new ArrayList();

    public void addApple(Apple apple){
        items.add(apple);
    }

    public void addBanana(Banana banana){
        items.add(banana);
    }

    public int getAmount(){
        int amount = 0;
        for(Object obj : items){
            if(obj instanceof Apple){
                amount+=((Apple) obj).getPrice();
            }
            if(obj instanceof Banana){
                amount+=((Banana) obj).getPrice();
            }
        }
        return amount;
    }
}

很乱对不对?别忘记了,这还只是两种水果,如果水果更多,我们的购物车类不仅惨不忍睹,而且维护起来也会让人发疯(每加一种水果,购物车类都需要改动),我们是负责任的程序员,不会写出这样难看难维护的代码的。

那怎么办呢?可以用到我们的设计原则啦!依赖抽象,而不是依赖具体。

用到这个例子上就是,我们可以抽象出来一个抽象水果类Fruit(或是接口),让苹果和香蕉都继承(或实现)Fruit,这样我们的代码应该是这个样子的:

水果抽象类:

public abstract class Fruit {
    
    private int price;

    public String getName() {
        return this.getClass().getSimpleName();
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }
}

苹果类:

public class Apple extends Fruit{
    @Override
    public String getName() {
        return "a red apple";
    }
}

香蕉类:

public class Banana extends Apple{
    @Override
    public String getName() {
        return "a bug banana";
    }
}

购物车类:

import java.util.ArrayList;
import java.util.List;

public class ShoppingCart {

    List<Fruit> items = new ArrayList();

    public void addFruit(Fruit fruit){
        items.add(fruit);
    }

    public int getAmount(){
        int amount = 0;
        for(Fruit fruit : items){
            amount+=fruit.getPrice();
        }
        return amount;
    }
}

是不是清爽了许多,而且以后如果要添加新的水果,只需要让它继承水果类就行了,购物车类不需改动!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值