open for extention, close for modification
当需求发生变化时,不应该在相关类里面改变现有逻辑,而是通过实现相关接口完成业务功能。
电脑由cpu,memory,motherboard组成。
public class Cpu {
private String name;
private int price;
public Cpu(String name, int price) {
super();
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
public class Memory {
public Memory(String name, int price) {
super();
this.name = name;
this.price = price;
}
private String name;
private int price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
public class MotherBoard {
public MotherBoard(String name, int price) {
super();
this.name = name;
this.price = price;
}
private String name;
private int price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
public class Computer {
public double totalPrice(Object[] parts)
{
double totalPrice=0.0;
int size = parts.length;
for(int start=0;start<size;start++)
{
Object part=parts[start];
if(part instanceof Cpu)
{
totalPrice+=0.95*((Cpu)part).getPrice();
}
if(part instanceof Memory)
{
totalPrice+=1.2*((Memory)part).getPrice();
}
if(part instanceof MotherBoard)
{
totalPrice+=((MotherBoard)part).getPrice();
}
}
DebugLog.log("total price is "+totalPrice);
return totalPrice;
}
}
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Cpu aCpu=new Cpu("cpu",800);
Memory aMemory=new Memory("memory",300);
MotherBoard aMotherBoard=new MotherBoard("MotherBoard",900);
Object[] parts=new Object[]{aCpu,aMemory,aMotherBoard};
Computer computer=new Computer();
computer.totalPrice(parts);
}
}
现在需求发生了变化,用户需要自己购买点电源,由上面的代码可以看出,我需要修改totalPrice的逻辑,这就违反了ocp原则,那我们将代码重构如下:
public class Computer {
public double totalPrice(Object[] parts)
{
double totalPrice=0.0;
int size = parts.length;
for(int start=0;start<size;start++)
{
Object part=parts[start];
if(part instanceof PricePrivider)
{
totalPrice+=((PricePrivider)part).computePrice();
}
}
DebugLog.log("total price is "+totalPrice);
return totalPrice;
}
}
public class Cpu extends Part implements PricePrivider {
public Cpu(String name, int price) {
super(name, price);
}
@Override
public double computePrice() {
returnthis.getPrice()*0.85;
}
}