开放封闭原则(OCP)

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;

}

}

public class Memory extends Part implements PricePrivider {
 
private int size=1;
 
public Memory(String name, int price) {
super(name, price);
}
 
public Memory(String name, int price, int size) {
super(name, price);
this.size = size;
}
 
@Override
public double computePrice() {
double totalPrize = 0.0;
switch (size) {
case 3:
totalPrize = 0.8 * this.getPrice() * size;
break;
case 2:
totalPrize = 0.9 * this.getPrice() * size;
default:
totalPrize =  this.getPrice() * size;
break;
}
return totalPrize;
}
 
}
 
public class MotherBoard extends Part implements PricePrivider {
 
public MotherBoard(String name, int price) {
super(name, price);
}
 
@Override
public double computePrice() {
return 0.6*this.getPrice();
}
 
 
}
 
public class Part {
protected String name;
protected double price;
 
public Part(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 double getPrice() {
return price;
}
 
public void setPrice(double price) {
this.price = price;
}
 
}
 
public interface PricePrivider {
     double computePrice();
}
 
public class Test {
 
/**
* @param args
*/
public static void main(String[] args) {
Cpu aCpu=new Cpu("cpu",800);
Memory aMemory=new Memory("memory",300,2);
MotherBoard aMotherBoard=new MotherBoard("MotherBoard",900);
        Object[] parts=new Object[]{aCpu,aMemory,aMotherBoard};
        Computer computer=new Computer();
        computer.totalPrice(parts);
}
}
 
通过重构后我们就可以在不修改原有代码的前提下轻松的实现扩展。
 
原文地址:https://www.cnblogs.com/budoudou/p/2299634.html