白话 Android 设计模式之开闭原则

文章目录

1、简介

开闭原则:对扩展开放,对修改关闭。
对这句话的理解在含有对象的编程语言里,可认为是为自己的程序定义一个相对稳定的抽象层,同时将不同的实现行为一道具体的实现层完成。
在很多面向对象的编程语言都有接口和抽象的机制,可以通过他们为自己的程序设置一个抽象层,再通过具体的类来实现扩展。
如果需要对系统进行修改,不需要对抽象层进行修改,只需要增加新的具体类就可以实现新的业务。
实现不修改原来的功能基础之上实现新的功能的添加。

就好像是如下的图形模式
在这里插入图片描述

空口说起来比较抽象,我们依照示例来理解

2、示例

假设我们有一个店铺 shop ,我们现在卖衣服 cloth,鞋子 shoes,但是我们不保证以后会不会再卖什么化妆品,毛绒玩具等。
我们想设计一个程序来统计我们每个类别获的 总价。

这个时候我们可以想到不能将程序写死,最好能够将每种产品进行分离,互不干扰,而且还能够有统一的接口。

那重要的一点就是 这个接口怎么写,怎么实现。

所谓接口,其实也就是找出他们共通的地方,设定一个规范。
此例中 统计总价 = 单价 * 数量
1)我们先设定一个 计算总价的接口

package myapplication.lum.com.openclose;

public interface TotalPriceInterface {
    public void setPrice(int price);
    public void setNum(int  num);
    public int getTotalPrice();
}

2) 现在 我们要卖衣服,让衣服引用这个接口,
就可以完成对衣服的一个 单价 、数量 、总价的一个框架设计

package myapplication.lum.com.openclose;

public  class Clothes implements TotalPriceInterface{
    private int  price ;
    private int num;

    @Override
    public void setPrice(int price) {
        this.price = price;
    }

    @Override
    public void setNum(int num) {
        this.num = num;
    }

    @Override
    public int getTotalPrice() {
        return this.price * this.num;
    }
}

3)同理 现在让 鞋子 引入这个接口

package myapplication.lum.com.openclose;

public class Shoes implements  TotalPriceInterface {
    private int price;
    private int num;
    @Override
    public void setPrice(int price) {
        this.price = price;
    }

    @Override
    public void setNum(int num) {
        this.num = num;
    }

    @Override
    public int getTotalPrice() {
        return this.price * this.num;
    }
}

4) 我们在主程序中对 衣服、鞋子的总价 进行设置引用

package myapplication.lum.com.openclose;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    private String TAG = "TAG_";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Clothes clothes = new Clothes();
        clothes.setPrice(200);
        clothes.setNum(100);
        Log.i(TAG,"clothes total price " + clothes.getTotalPrice());


        Shoes shoes = new Shoes();
        shoes.setPrice(300);
        shoes.setNum(200);
        Log.i(TAG,"shoes total price " + shoes.getTotalPrice());
    }
}

打印log :
在这里插入图片描述

  1. 比如这个时候 我们想添加 口红的 总价,那只需要 在添加一个口红的类,而不需要去修改 原有的 衣服或者鞋子的类从而实现 扩展开放,修改封闭。
package myapplication.lum.com.openclose;

public class Lipstick implements TotalPriceInterface {
    private int  price;
    private  int  num;
    @Override
    public void setPrice(int price) {
        this.price = price;
        
    }

    @Override
    public void setNum(int num) {
        this.num = num;
    }

    @Override
    public int getTotalPrice() {
        return this.price * this.num;
    }
}

在主程序引用:

        Lipstick lipstick = new Lipstick();
        lipstick.setPrice(500);
        lipstick.setNum(20);
        Log.i(TAG,"Lipstick total price " + lipstick.getTotalPrice());

在这里插入图片描述
代码架构 如图;
在这里插入图片描述

开闭原则 大体就是 能够提炼出不同对象里面 相似的共通之处,对其进行抽象化,成为一个对接不同操作对象的接口,从而使不同对象间相互独立。

原创文章 375 获赞 138 访问量 53万+

猜你喜欢

转载自blog.csdn.net/qq_27061049/article/details/104819399