從多態思想,抽象工廠模式,代理模式談談"接口"是如何幫住我們鬆耦合的

 

前言:

       爲了講清楚接口鬆耦合的原理,我設計了一種接口鬆耦合設計模式,用到了面向對象思想,也用到了不被固定場景限制的動態反射思想,標題裏的三種模式是我認爲最能講解清楚接口鬆耦合設計模式的思想.

概述:

       java通過接口鬆耦合,實現了抽象父類的具體功能類的多態化,那麼,兩個實現了抽象類的具體類是怎麼耦合的呢? 

我們以Thread thread = new JumpThread(new BoyJump())爲例,還原泰坦尼克號Jack跳船的場景.

      將BoyJump類裏的run()方法做線程體,通過代理設計模式被JumpThread類裏的空白run()方法使用(PS:一個線程類的run()方法就是該線程的入口,作用類似main()方法).BoyJump是Jump的子類,JumpThread是Thread的子類.這兩個父類都implements了Runable接口.

      寫這兩個子類還有個好處,通過子類名他人一看就知道這個類是用在什麼場景的,滿足代碼命名自證其義的設計思想.不致於其他人閱讀我的代碼時一臉懵逼,猜不透Thread和Jump是用在什麼場景下的.

設計詳情

      Jump類裏寫好接口方法(將其改造成能用上這種接口),在jumpThread具體線程類裏通過構造方法接收boyJump類的對象,並讓本類裏的空白方法使用boyJump類繼承自Jump類的run方法,從而實現接口模式.這種設計模式的好處與應用法我會在結尾給大家做個總結.

代碼演示

      我們共計需要在工程內寫一個接口,兩個抽象實現類,兩個具體繼承類

  • 接口
/**
 *設計一個抽象接口,用於定義比Abstract還Abstract的功能方法
 *相當於定義了一個手機充電線插頭的形狀,是micro-C還是type-C,手機才能設計對應的被插的凹槽.
 */
public interface Runable{

    public void run();

}
  • Thread類實現該接口
/**
 *傳統的線程設計方法因爲implements了Runable接口,要重寫run方法.但是這樣一來這個線程就廢了,
 *只能用在固定的單一場景的線程不是好線程,所以我們先不重寫run方法,先不上枷鎖
 */
public class Thread implements Runable{

    public void run(){}

}

 

  • Jump類實現同一接口
/**
 * Jump實現跟Thread一樣的接口,它跟Thread的關係有點像手機充電插頭與手機凹槽的區別.
 */
public class Jump implements Runable{

    private String name = null; //跳船者的姓名,本來想設性別屬性,但性別完全可以用子類的命名體現
                                //比如class BoyJump extends Jump,一眼就看出子類性別是boy

    //簡單地重寫下run方法
    @override
    public void run(){
        System.out.println(“You jump,I jump!”);
    }

}

  • JumpThread繼承Thread類

public class JumpThread extends Thread{

    private Object uniObj;

    public JumpThread(Object realObj){

        this.uniObj = realObj; //享元模式常用的騷操作,將要操作的對象作爲參數放入構造方法中
                               //方便JumpThread;類操作realObj對象的方法與屬性.

    }

    @override

    public void run(){ //這一行的run是繼承自Thread類的run

        uniObj.run(); /*
                      這一行的run可以是Jump類的run,雖然代碼中沒有Runable這個接口名出現
                      但是我們要心知肚明,正是通過Runable接口,Thread類的run方法與Jump類的
                      run方法耦合到了一起,好處一是鬆耦合,二是這樣一來Thread可以靈活啓動不同
                      的場景,除了Jump,還可以是DownLoad,Copy,Transmit等待,非常方便
                      */

    }

}
  • 給Jump設個具體的子類
/**
 *類名BoyJump表示是男性跳船者
 */
public class BoyJump extends Jump{

    String name = “Jack”; //男主角Jack

    float liveProbality = 0.5 ;//Jack跳船生存的概率
   
    //run()方法有需要可以在Jump類的基礎上寫得再詳細點
    @override
    public void run(){
        System.out.println("Rose,You Jump,I Jump!");
    }

}

  • 至此所需模塊全部寫好,編寫Tset類運行下
import JumpThread;
import BoyJump;

@Test

public class BoyJumpThreadTest{
   public void main(String[] args){ 
    
    /*
    嵌套多態,JumpThread是對Thhread的多態,BoyJump是對Jump的多態
    好處是可以針對性地訪問子類裏從父類繼承並重寫的方法,或父類自身的方法
    這樣一來,我想用線程運行DownLoad功能時,寫個txtDownLoad類,並在JumpThread的構造方法裏
    把new BoyJump()替換成new txtDownLoad()即可讓線程實現動態變換多種功能
    */
    Thread boyJumpThread = new JumpThread(new BoyJump()); //不繼承BoyJump類也能調用到BoyJump類的方法,代理模式常用的騷操作.
    boyJumpThread.start(); //實際執行的是BoyJump裏的run方法

    try {
            Thread.sleep(2000);
            boyJumpThread.interrupt();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }  
} 

總結:

       線程是用來運行具體功能的.傳統的寫法需要在JumpThread類裏重寫run方法,大大限制了類的拓展與複用,即JumpThread類只能運行單一的方法集(寫死了),太浪費了.

一句話總結我的核心思想:

將已經重寫了run方法的具體Jump類的實例作具體Thread類構造方法的實參,從而在具體Thread類裏的run方法中調用該實例的run方法.間接實現多態.

     我的設計模式屬於先向Thread類的構造方法傳入具體的Jump類對象,再去做某事.這裏的某事既可以是BoyJump,也可以是GirlJump,不會出現把JumpThread類寫死的情況! 即符合人腦直覺做事法(線程調用具體對象做具體的事,而不是線程親自做事),又符合鬆耦合,方便拓展(線程構造方法換個調用對象便能實現其他功能,非常方便),模塊複用的要求.是典型的多態思想.

       順便提一下:OOP的三大特性,多態,繼承,封裝.爲什麼OOP的三大特性是它們呢? 因爲我們寫面向對象的程序時,幾乎每一種設計模式都會同時用到這三大概念.而在三大特性之上的抽象更是整個計算機科學的十大思想之一.23種設計模式,樣樣都有抽象,繼承,多態,封裝的痕跡.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章