繼續(xù)講解第二個(gè)重要的設(shè)計(jì)模式原則——開(kāi)閉原則~
一.定義
????????開(kāi)閉原則,在面向?qū)ο缶幊填I(lǐng)域中,規(guī)定“軟件中的對(duì)象(類,模塊,函數(shù)等等)應(yīng)該對(duì)于擴(kuò)展是開(kāi)放的,但是對(duì)于修改是封閉的”,這意味著一個(gè)實(shí)體是允許在不改變它的源代碼的前提下變更它的行為。
歸納總結(jié)如下:
- 開(kāi)閉原則(Open Closed Principle)是編程中最基礎(chǔ)、最重要的設(shè)計(jì)原則。
- 一個(gè)軟件實(shí)體如類,模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開(kāi)放(對(duì)提供方),對(duì)修改關(guān)閉(對(duì)使用方)。用抽象構(gòu)建框架,用實(shí)現(xiàn)擴(kuò)展細(xì)節(jié)。
- 當(dāng)軟件需要變化時(shí),盡量通過(guò)擴(kuò)展軟件實(shí)體的行為來(lái)實(shí)現(xiàn)變化,而不是通過(guò)修改已有的代碼來(lái)實(shí)現(xiàn)變化。
- 編程中遵循其它原則,以及使用設(shè)計(jì)模式的目的就是遵循開(kāi)閉原則。
- 所謂對(duì)擴(kuò)展開(kāi)放:指的是我們系統(tǒng)中的模塊、類、方法對(duì)它們的提供者(開(kāi)發(fā)者)應(yīng)該是開(kāi)放的,提供者可以對(duì)系統(tǒng)進(jìn)行擴(kuò)展(新增)新的功能。
- 所謂對(duì)修改關(guān)閉:指的是系統(tǒng)中的模塊、類、方法對(duì)它們的使用者(調(diào)用者)應(yīng)該是關(guān)閉的,使用者使用這些功能時(shí),不會(huì)因?yàn)樘峁┓叫略隽斯δ芏鴮?dǎo)致使用者也進(jìn)行相應(yīng)修改。
二.描述
開(kāi)閉原則是面向?qū)ο蟪绦蛟O(shè)計(jì)的終極目標(biāo),它使軟件實(shí)體擁有一定的適應(yīng)性和靈活性的同時(shí)具備穩(wěn)定性和延續(xù)性~
- 對(duì)軟件測(cè)試的影響
- 可以提高代碼的可復(fù)用性
- 可以提高軟件的可維護(hù)性
三.案例
舉個(gè)簡(jiǎn)單的例子,假設(shè)你的女票(使用方)有一天收到了你送給她的禮物——這禮物有可能是情書(shū),也有可能是手工書(shū)~則實(shí)現(xiàn)的代碼如下:
//禮物類基類
class gift{
String type;
}
class Letter extends gift{
Letter(){
super.type="Letter";
}
}
class Handwork extends gift{
Handwork(){
super.type="Handwork";
}
}
//使用方類,也就是接收方類
class girlfriend{
public void drawShape(gift g) {
if (g.type == "Letter")
getLetter(g);
else if (g.type == "Handwork")
getHandwork(g);
}
public void getLetter(gift r) {
System.out.println("收到的禮物是情書(shū)!");
}
public void getHandwork(gift r) {
System.out.println("收到的禮物是手工書(shū)!");
}
}
public class Main {
public static void main(String[] args) {
girlfriend hyh = new girlfriend();
hyh.drawShape(new Letter());
hyh.drawShape(new Handwork());
}
}
?這時(shí)加入禮物種類添加了一種類型——奢侈品,則對(duì)代碼的修改如下:
//禮物類基類
class gift{
String type;
}
class Letter extends gift{
Letter(){
super.type="Letter";
}
}
class Handwork extends gift{
Handwork(){
super.type="Handwork";
}
}
class luxury extends gift{
luxury(){
super.type="luxury";
}
}
//使用方類,也就是接收方類
class girlfriend{
public void getgift(gift g) {
if (g.type == "Letter")
getLetter(g);
else if (g.type == "Handwork")
getHandwork(g);
else if (g.type == "Luxury")
getLuxury(g);
}
public void getLetter(gift r) {
System.out.println("收到的禮物是情書(shū)!");
}
public void getHandwork(gift r) {
System.out.println("收到的禮物是手工書(shū)!");
}
public void getLuxury(gift r) {
System.out.println("收到的禮物是奢侈品!");
}
}
public class Main {
public static void main(String[] args) {
girlfriend hyh = new girlfriend();
hyh.getgift(new Letter());
hyh.getgift(new Handwork());
hyh.getgift(new luxury());
}
}
此時(shí)不難發(fā)現(xiàn),不僅修改了提供方(gift類)的代碼,也修改了使用方(girlfriend類)的代碼,即違反了所謂的開(kāi)閉原則~(對(duì)修改關(guān)閉)
?
?????????也就是說(shuō),當(dāng)發(fā)生變更時(shí),提供方是允許修改的,而使用方則不允許,這就是所謂的【對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉】。
做出如下修改,即可避免:
/**
*
*/
//gift類,基類
abstract class gift {
//聲明為一個(gè)抽象類~
String type;
public abstract void get();//抽象方法
}
class Letter extends gift {
Letter() {
super.type ="Letter";
}
//重點(diǎn)在于不同的類內(nèi)部具體實(shí)現(xiàn)所謂的方法——即重寫(xiě)
@Override
public void get() {
System.out.println("收到的禮物是情書(shū)~");
}
}
class Handwork extends gift {
Handwork() {
super.type =" Handwork";
}
//重點(diǎn)在于不同的類內(nèi)部具體實(shí)現(xiàn)所謂的方法——即重寫(xiě)
@Override
public void get() {
System.out.println("收到的禮物是手工書(shū)~");
}
}
class girlfriend {
public void getgift(gift g) {
g.get();
}
}
public class Main {
public static void main(String[] args) {
girlfriend hyh = new girlfriend();
hyh.getgift(new Letter());
hyh.getgift(new Handwork());
}
}
此時(shí)我們想要再添加奢侈品Luxury類,只需要修改提供方即可,不需要修改使用方的代碼:
/**
*
*/
//gift類,基類
abstract class gift {
//聲明為一個(gè)抽象類~
String type;
public abstract void get();//抽象方法
}
class Letter extends gift {
Letter() {
super.type ="Letter";
}
//重點(diǎn)在于不同的類內(nèi)部具體實(shí)現(xiàn)所謂的方法——即重寫(xiě)
@Override
public void get() {
System.out.println("收到的禮物是情書(shū)~");
}
}
class Handwork extends gift {
Handwork() {
super.type =" Handwork";
}
//重點(diǎn)在于不同的類內(nèi)部具體實(shí)現(xiàn)所謂的方法——即重寫(xiě)
@Override
public void get() {
System.out.println("收到的禮物是手工書(shū)~");
}
}
class Luxury extends gift {
Luxury() {
super.type ="Luxury";
}
//重點(diǎn)在于不同的類內(nèi)部具體實(shí)現(xiàn)所謂的方法——即重寫(xiě)
@Override
public void get() {
System.out.println("收到的禮物是奢侈品~");
}
}
class girlfriend {
public void getgift(gift g) {
g.get();
}
}
public class Main {
public static void main(String[] args) {
girlfriend hyh = new girlfriend();
hyh.getgift(new Letter());
hyh.getgift(new Handwork());
hyh.getgift(new Luxury());
}
}
?做個(gè)總結(jié)——牢記對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉~
(某種意義上,也可以作為【多態(tài)】的示例~)
在20世紀(jì)90年代,開(kāi)閉原則被廣泛的重新定義由于抽象化接口的使用,在這中間實(shí)現(xiàn)可以被改變,多種實(shí)現(xiàn)可以被創(chuàng)建,并且多態(tài)化的替換不同的實(shí)現(xiàn)。
相比梅耶的使用方式,多態(tài)開(kāi)閉原則的定義倡導(dǎo)對(duì)抽象基類的繼承。接口規(guī)約可以通過(guò)繼承來(lái)重用,但是實(shí)現(xiàn)不必重用。已存在的接口對(duì)于修改是封閉的,并且新的實(shí)現(xiàn)必須,至少,實(shí)現(xiàn)那個(gè)接口。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-742496.html
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-742496.html
到了這里,關(guān)于軟件設(shè)計(jì)模式原則(二)開(kāi)閉原則的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!