JAva設計モデル——分かりやすい7つの原則


皆さん、こんにちは.王さんです.Javaデザインモデルを勉強している大学3年生です.Javaデザインモデルシリーズを連載して、自分で後で復習してみんなと討論するつもりです.私は初心者なので、立っている角度がもっと多いのは何なのか、私たちはどのようにする角度で考えて、間違いがあるところは皆さんの大牛の指摘を歓迎して、次は直接本題に入ります.
一、引用
どうして七つの原則を認識するのですか.私たちが学ぶ23種類の設計モードは、7つの原則に従い、各設計モードを制約し、拡張性とメンテナンス性を高めることです.この文章では、以下の2つの角度から「俗っぽい」例で説明し、できるだけ分かりやすく説明します.
  • 公式サイトによると
  • 自己理解
  • 二、分類
    1.単一職責原則2.インターフェース隔離原則3.依存逆転原則4.リッツ置換原則5.開閉原則6.ディミット法則7.合成復元原則
    三、詳細説明
    1.単一職責原則
  • 公式定義:職責とはクラスの変化の原因を指す.1つのクラスに1つ以上の動機が変更されると、このクラスは1つ以上の職責を有します.単一の職責の原則は、1つのクラスまたはモジュールが存在し、1つの変更の原因しかないことを意味します.
  • 自分で理解します:実は上の言い方を見て私も理解できませんが、簡単に言えば1つの思想を説明して、1つの類(対象)は1つの事しかできません.例えば自転車を修理している人は、ベンツを修理するように要求してはいけませんよ.ベンツを修理するには、4 s店を探しに行かなければなりませんね.Javaでも同様に、各クラスは自分の責任を負うべき機能を担当し、独自にしなければならない.

  • 2.インタフェースの隔離原則
  • の公式定義:1.1つのクラスの他のクラスへの依存性は、最小のインタフェースに確立されるべきである.2.お客様に不要な方法に依存させるべきではありません.インタフェースは顧客に属し、クラス階層には属しません.
  • 自分で理解します:どんな意味ですか、例えば1つのインタフェースは3つの方法を定義しました:1.広東省の総人口数を調べます()2.広東省の市級数を調べます()3.広東省の第一線の都市数を調べます()今私は1つの需要があって、私は広東省の総人口数と広東市級数を調べる必要がありますしかし、インタフェースの3つ目の方法:広東省の一線都市数を調べるのは私には必要ありませんが、私は自分の需要のために、私もそれを実現しなければなりません.このインタフェースには、私が望んでいない方法が多いので、最小インタフェースに依存しないことになります.これは、あるクラスの他のクラスへの依存性が最小インタフェースに確立されていることに違反します.そのため、私は上のインタフェースの3つの方法を1つずつ分割して、それからどんな機能が必要なのか、対応する方法を実現しなければなりません.

  • 3.逆転依存の原則
  • の公式定義:プログラムは抽象インタフェースに依存し、具体的な実装に依存しないでください.簡単に言えば、抽象的なプログラミングを要求し、実装をプログラミングしないでください.これにより、お客様と実装モジュール間の結合が低下します.
  • 自己理解:たとえばlaowangというクラスがありますが、goToBeijingはパラメータ:Car(自動車オブジェクト)を受信します.
    class Laowang{
        public  void  goToBeijing(Car car){
            System.out.println("    "+car.name+"   ");
        }
    }
    
    //         
    class Car{
    	public String name="  ";
    } 
    
    //main  
    public static void main(String[] args) {
        Laowang laowang = new Laowang();
        Car car = new Car();
        laowang.goToBeijing(car);
    }
    
           :
    	         
    
    今新しい面倒が来て、王さんの车は壊れて、この时1台の飞行机(AirPort)を买って、しかし北京に行く方法は1つの自动车の対象を受け入れるパラメータ(Car)だけを定义して、これはどうしますか??解決策は簡単で、パラメータを飛行機タイプ(AirPort)に変更すればいい.でもこれで本当にいいの???もし私が今度飛行機が壊れたら、調和号を買いましたか?またコードを変更しなければなりませんか?正しい解決策は、自動車、飛行機を交通機関類(Vehicle)に継承させ、王さんに北京に行ってパラメータを(Vehicle)に変更させることだ.この时、あなたは私にアウディをあげて、私はアウディを運転して、あなたは私に飛行機をあげて、私は飛行機を運転して、あなたは私に調和号をあげて、私は調和号を運転して北京に行きます.何を喜んでやらないのか.コードは以下の通りです:
    class Laowang{
        public  void  goToBeijing(Vehicle vehicle){
            System.out.println("    "+vehicle.name+"   ");
        }
    }
    
    //     
    class Vehicle{
       public String name;
    }
    //   
    class Car extends Vehicle{
        public Car(){
            super.name="  ";
        }
    }
    //   
    class AirPort extends Vehicle{
        public AirPort(){
            super.name="  ";
        }
    }
    //main  
    public static void main(String[] args) {
        Laowang laowang = new Laowang();
        Car car = new Car();
        AirPort airPort=new AirPort();
        //     
        laowang.goToBeijing(car);
        //     
        laowang.goToBeijing(airPort);
    }
          :
    	         
    	         
    
    各位は理解しましたか?これが逆転依存の原則だ.王さんは北京へ行くには自動車という類に依存しないで、自動車のインタフェースや抽象類に依存しなければならない.Vehicle交通機関は、プログラムを拡張するのに役立つ.

  • 4.リッツ置換の原則
  • の公式定義:1.各タイプSのオブジェクトo 1に対して、Tで定義されたすべてのプログラムPがすべてのオブジェクトo 1に置き換えられたときに、プログラムPの動作が変化しないように、タイプSがタイプTのサブタイプである.(見ないでください.あなたは読めません.私も読めません)2.すべてのベースクラスを参照する場所は、そのサブクラスのオブジェクトを透明に使用する必要があります.
  • 自己理解:定義は複雑に見えますが、考えは簡単です.リ氏置換の原則は継承に向けられており、BクラスがAクラスを継承する場合は、親クラス(Aクラス)の方法を書き直さないでください.やむを得ない場合は、BクラスがAクラスを継承しないようにし、依存、集約、組合せなどで親メソッドを呼び出す.

  • 5.開閉原則(OCP)
  • 公式定義:1.開閉原則は「ソフトウェア内のオブジェクト(クラス、モジュール、関数など)は拡張に対して開放的であるべきであるが、修正に対しては閉鎖的である」と規定している.
  • 自己理解:この公式定義は矛盾しているように見えますが、拡張に開放され、修正に閉鎖されていることを保証していますか?どのようにこの言叶を理解して、このようにです:(提供者)に対して开いて、(使用者)に対して修正して闭锁します.例を挙げると、脳回路が依存逆転中にジャンプ!!!王さんの車が壊れた後、飛行機で北京に行きたいなら、2つの場所を修正しなければなりませんか:(1)王さんのgoToBeiJingパラメータを飛行機に変更しなければなりません.(2)飛行機類を増やした.実はこれは開閉の原則に違反している.提供者は飛行機で、その修正コードは大丈夫ですが、使用者(王さん)にはソースコードを修正する必要があります.これは開閉の原則に違反している.だから王さんgoToBeiJingパラメータに抽象クラスを受信させるべきで、このようにあなたが何を持って私に開いても、私は王さんのコードを修正する必要はありません.

  • 6.ディミットの法則
  • 公式定義:ディミット法(Law of Demeter)はまた最低知識原則と呼ばれ、1つのクラスは他のクラスについて知っていることが少なければ少ないほど良い.つまり、1つのオブジェクトは他のオブジェクトに対してできるだけ少ない理解を持って、友达と通信して、知らない人と話をしないべきだ.
  • は、オブジェクトが直接の友人としか通信できないことを自分で理解しています.直接の友達は何ですか.クラスのメンバー変数、メンバーメソッドパラメータ、戻り値に表示されるオブジェクトを直接友達と呼ぶことができます.それは直接の友达がいれば、知らない人がいます.例えば、
    class Laowang{
    	public  void  goToBeijing(Vehicle vehicle){
            System.out.println("    "+vehicle.name+"   ");
            Car car = new Car;
        }
    }
    
    このクラスでは、Vehicleがメソッドパラメータに現れると、それは直接の友达ですが、メソッド体では、newがオブジェクトCarを持っているので、知らない人に属しています.そのため、ディミットの法則を守って、友达の個数を減らして、知らない人と話をしないでください.

  • 7.合成復元の原則
  • 公式定義:合成/集約多重化の原則は、新しいオブジェクトの中に既存のオブジェクトを使用して、新しいオブジェクトの一部にすることである.新しいオブジェクトは、これらのオブジェクトへの委任によって既存の機能を多重化する目的を達成します.
  • 自分で理解します:合成多重化の意味は、もしあなたが1つのオブジェクトの中のある方法を使いたいならば、例えば私がA類のa方法を使いたいならば、あなたはいくつかの方法がありますか?(1)継承して呼び出します.(2)依存して呼び出します.(3)集約して呼び出す.(4)を組み合わせて呼び出します.合成多重化の原則は,この場合,依存,重合,組合せを優先的に選択することを強調する.どうして?継承はリスクがあるため、継承システムを破壊する可能性があります.メンテナンスが困難になる.

  • 四、終わりの言葉
    Javaを学んで2年になって、しかし対象の思想に対してまだとても理解していないで、以前はただこのようなものがあることを知っていて、今デザインのモードを学んで、多く使って、やっと十分な認識があります.例えば継承、パッケージング、マルチステートは、設計モードで十分に体現されています.次にデザインモデルを学ぶたびに、私は自分の理解を連載します.勉強が終わったら、自分がやったプロジェクトを再構築し、自分が続けられると信じています.