zoukankan      html  css  js  c++  java
  • 开放封闭原则(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);
    }
    }
     
    通过重构后我们就可以在不修改原有代码的前提下轻松的实现扩展。
     
  • 相关阅读:
    Redis面试题(46题)
    公共组件及脚手架webpack模板
    css3中@font-face模块自定义字体
    字段加密实践(django-fernet-fields)
    django导入导出excel实践
    vue-loader和单页组件介绍
    Axios介绍和使用
    微服务架构理解及微服务架构局限性
    v-model的双向数据绑定(表单)
    eureka集群
  • 原文地址:https://www.cnblogs.com/budoudou/p/2299634.html
Copyright © 2011-2022 走看看