面向对象设计原则

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

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 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;
    }
}

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

 

你可能感兴趣的:(设计模式)