文章目录
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 :
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());
代码架构 如图;
开闭原则 大体就是 能够提炼出不同对象里面 相似的共通之处,对其进行抽象化,成为一个对接不同操作对象的接口,从而使不同对象间相互独立。