先占个坑,一边学习一边更新。
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;
}
}
是不是清爽了许多,而且以后如果要添加新的水果,只需要让它继承水果类就行了,购物车类不需改动!