JAva設計モード学習ノート--逆転原則に依存

3374 ワード

依存逆転の原則の概要
1.ハイレベルモジュールは低層モジュールに依存すべきではなく、両方ともその抽象に依存すべきである
2.抽象は細部に依存すべきではなく、細部は抽象に依存すべきである.
3.逆転中心思想に依存する場合のインタフェース向けプログラミング
4.逆転の原則に依存する場合、細部の多変性に対して抽象的なものはずっと安定しているという設計理念に基づいている.抽象に基づいて構築されたアーキテクチャは、詳細に基づいて構築されたアーキテクチャよりもずっと安定しています.Javaでは、抽象は時インタフェースまたは抽象クラスを指し、詳細は具体的な実装クラスである.
5.インタフェースまたは抽象クラスの目的を使用する場合、具体的な操作にかかわらず規範を規定し、詳細を示すタスクを彼らの実現クラスに渡して完成させる.
逆転原則に依存する3つの実現方式
1.インタフェース転送
2.構築方法伝達
3.setter方式伝達
インスタンスの適用
依存逆転の原則は使用されていません
public class DependecyInversion {
    public static void main(String[] args) {
        Person p = new Person();
        p.receive(new Email());
    }
}

/*
 *   Person       
 *  1  
 *1.   ,      
 *2.             ,    ,    ,  Person            
 *3.    :         IReceiver,     ,  Person     IReceiver    
 *  Email,  ,         ,      IReceiver   ok ,             
 */
class Email{
    public String getInfo() {
        return "      :hello, world";
    }
}
class Person{
    public void receive(Email email) {
        System.out.println(email.getInfo());
    }
}

インタフェース転送
public class DependecyInversionTest {
    public static void main(String[] args) {
        //  1,      
        ChangHong changHong = new ChangHong();  //  ChangHong    
        OpenAndClose openAndClose = new OpenAndClose();  //  OpenAndClose    
        openAndClose.open(changHong);     //      
    }
}

//  1:        
interface IOpenAndClose {
    public void open(ITV tv);
}

interface ITV {
    public void play();
}

class OpenAndClose implements IOpenAndClose{
    public void open(ITV tv) {
        tv.play();
    }
}

class ChangHong implements ITV{
    public void play() {
        System.out.println("  ");
    }
}

コンストラクションメソッド伝達
public class DependecyInversionTest {
    public static void main(String[] args) {
        //  2,       
        ChangHong changHong = new ChangHong();  //  ChangHong    
        OpenAndClose openAndClose= new OpenAndClose(changHong);  //  OpenAndClose    
        openAndClose.open();    //          
    }
}

//  2,          
interface IOpenAndClose {
    public void open();
}

interface ITV{
    public void play();
}

class OpenAndClose{
    public ITV tv;
    public OpenAndClose(ITV tv) {
        this.tv = tv;
    }
    public void open() {
        this.tv.play();
    }
}

class ChangHong implements ITV{
    
    @Override
    public void play() {
        // TODO Auto-generated method stub
        System.out.println("  ");
    }
    
}

setter方式伝達
public class DependecyInversionTest {
    public static void main(String[] args) {
        //  3,  setter    
        ChangHong changHong = new ChangHong();   //  ChangHong    
        OpenAndClose openAndClose = new OpenAndClose();  //  ChangHong    
        openAndClose.setTV(changHong);  //  setter    
        openAndClose.open();  //  open()  
    }
}

//  3,  setter    
interface IOpenAndClose{
    public void open();
}

interface ITV{
    public void play();
}

class ChangHong implements ITV{
    public ITV tv;
    public void play() {
        System.out.println("  ");
    }
}

class OpenAndClose implements IOpenAndClose{
    public ITV tv;
    public void setTV(ITV tv) {
        this.tv = tv;
    }
    public void open() {
        this.tv.play();
    }
}