開閉原則
一個實體(類)子產品和函數應該對擴充(提供方)開放,對修改關閉(使用方),用抽象建構架構,用實作擴充細節
增加功能盡量通過擴充,而不是修改
老規矩舉個例子:
定義一個畫圖程式,首先,你得根據傳進來的形狀類判斷形狀
class Type {
int type;
}
//根據圖形類型,畫不同的畫
class Editor{
public void draw(Type t){
if(t.type==0){
// 0是圓型
drawCir();
}else if(t.type==2){
// 1是方型
drawSqu();
}
}
public void drawCir(){
System.out.println("畫圓形");
}
public void drawSqu(){
System.out.println("畫方形");
}
}
class Circular extends Type{
public Circular(){
super.type=0;
}
}
class Square extends Type{
public Square(){
super.type=1;
}
}
這樣做看樣子是實作了需求,但這裡如果要定義其他類型呢?
1.建立其他類型的類
2.再加形狀判斷(if-else)
這樣就會對使用方進行更改,顯然這是不符合原則和麻煩的,if-else慢慢就成了屎山代碼了
是以,我們對上面代碼進行改進:
首先,判斷,都有一個方法畫圖,還有一個成員變量 表示類型。把這兩個整合成一個抽象類
讓其他形狀類繼承抽象類,這樣根據功能擴充其細節類即可,在操作端,也隻是傳入相應子類對象就能調用相應重寫的方法。
代碼:
//滿足開閉原則
//定義一個抽象類
abstract class Type1{
int type;
public abstract void draw();
}
class Circular1 extends Type1{
public Circular1(){
super.type=0;
}
@Override
public void draw() {
System.out.println("畫圓形");
}
}
class Square1 extends Type1{
public Square1(){
super.type=1;
}
@Override
public void draw() {
System.out.println("畫方形");
}
}
//使用類
class Editor2{
public void draw(Type1 t1) {
t1.draw();
}