JAva学習ノート『javaオブジェクト向けプログラミング』——オブジェクト向け開発方法の概要

6276 ワード

オブジェクト向け開発における核心思想と概念1、メッセージ:オブジェクト向けのサービスはオブジェクトの方法によって実現されるので、メッセージを送信することは実際には1つのオブジェクトを呼び出す方法である.2、インタフェース:java言語では、インタフェースには2つの意味があります.1つは概念的なインタフェース、すなわちシステムが対外的に提供するすべてのサービスを指し、オブジェクトの中でpublicタイプとして表現される方法の宣言です.第二に、インターネットキーワードで定義された実質的なインタフェースを指し、システムが対外的に提供するすべてのサービスを明確に記述し、システムの実現の詳細とインタフェースをより明確に分離することができる.3、継承:継承では、子クラスは親クラスの一部の属性とメソッドしか継承できません.親クラスでprivateで修飾された属性とメソッドは子クラスに対して透明です.4、ソフトウェアフレームワーク:汎用ソフトウェアアーキテクチャにはいくつかの拡張点が提供されている.これらの拡張点は、ユーザーに継承および拡張させるためのクラスです.これらのクラスはすでにいくつかの機能を備えており、ソフトウェアアーキテクチャ内の他のクラスと緊密に協力することができます.ユーザーは、これらのクラスのサブクラスを作成し、サブクラスに新しい機能を追加したり、いくつかの機能を再実装したりするだけです.ユーザーがカスタマイズしたクラスは、ソフトウェアアーキテクチャに調和して組み込まれ、ソフトウェアアーキテクチャ内の他のクラスとスムーズにコラボレーションできます.現在java分野で流行しているアーキテクチャソフトウェアには、J 2 EE-sun社が制定した分散型の企業アプリケーションのソフトウェアアーキテクチャが含まれており、企業アプリケーションを顧客層、javaweb層、アプリケーションサービス層、データベース層に分けている.Javaweb層の拡張点は主にサーブレットクラスとJSPであり,アプリケーションサービス層の拡張点は主にEJBコンポーネントである.Struct-ApacheオープンソースはJavaWebアプリケーションのために作成された汎用フレームワークを組織し、MVC設計モードを採用し、その主な拡張点はコントローラ層のActionクラスである.JSF-Sun社がJavaWebアプリケーションのインタフェースのために作成した汎用フレームワーク.Spring-Springオープンソース組織は、企業アプリケーションのサービス層のために作成された汎用フレームワークです.5、マルチステート:マルチステートとは、システムAがシステムBのサービスにアクセスする場合、システムBは、システムAに対して透明である複数の実装方法によってサービスを提供することができることを意味する.6、UML言語の紹介:UMLのいくつかのブロック図は今使っていないので見ていません.次に、クラス間の関係について説明します.≪関連付け|Associations|emdw≫:2つの相対的に独立したシステムの場合、1つのシステムのインスタンスが別のシステムの特定のインスタンスと固定的な対応関係がある場合、この2つのシステム間は関連付けられます.コードに表示されるのは、あるクラスが別のクラスのインスタンスを持つ属性であり、次に一般的にこのインスタンスを呼び出す方法です.依存:2つの相対的に独立したシステムについて、1つのシステムが別のシステムのインスタンスを構築したり、別のシステムのサービスに依存したりする場合、この2つのシステムの間には主に依存関係が現れます.コードでは、関連付けと比較して、別のクラスのインスタンス属性がなく、別のクラスのインスタンスを呼び出すメソッドをパラメータに直接伝えたり、別のクラスのインスタンスを生成して呼び出したりするメソッドが表示されます.関連と依存の意味の違い、例えば、人と自転車は、一人が持つべきものが特定の自転車であるため、「人」類には「自転車」の実例の属性があり、その2つの関連を示す.自転車と空気入れは、自転車に専用の空気入れが備わっていないため、「自転車」には「空気入れ」がない「のインスタンスプロパティではなく、パラメータを直接入力し、呼び出す」エアドラム「の方法でいいです.ギャザー:ギャザーは全体と部分の関係を表します.コード上、それは関連と似ています.このクラスには一部のクラスのインスタンス属性があります.彼ら2人の違いは意味的に明らかです.ギャザーには明らかな部分の全体関係があり、部分が全体から離れている場合、ほとんど意味がありません.例えば、人は頭、体幹、四肢などです構成、部分的に個別に存在しても意味がありません.集積は通常集積と強集積に分けられます.例えば、スタンドランプと電球が通常集積であっても、電球を置換することができます.スタンドランプと線路は強集積であり、線路は交換できません.現在コードでは、スタンドランプ類にスタンドランプsetBulb(Bulb bulb)を設置する方法がありますこれにより、スタンドランプを交換することができ、回線クラスに回線を設置する方法がない.汎化:汎化はクラス間の継承関係を指す.実現:実現はクラスとインタフェースの関係を指す.
最後に、Panelシステムの例があります.工場モードを使用しています.PanelとShapeFactoryは依存関係です.PanelはShapeFactoryのサービスであるgetShapeメソッドに依存しているからです.PanelとShapeも依存関係です.PanelはShapeFactoryが生成したShapeのdrawメソッドを使用しているからです.ShapefactoryとShapeも依存関係です.ShapefactoryはShapeのインスタンスを生成しているからです.例では反射(久しぶりに忘れた)が使われています.また、Mapの使い方も勉強しなければなりません.<>の中の2つはオブジェクトタイプでなければなりません.そうしないとintはintegerタイプに変換する必要はありません.また、静的コードブロックも勉強しなければなりません.次のコードを貼ります.
//Shape :
abstract public class Shape {
  abstract void draw();
}
//         
public class Circle extends Shape{
  public void draw(){
     System.out.println("draw a circle");
  }
}
public class Line extends Shape{
  public void draw(){
     System.out.println("draw a line");
  }

}
public class Rectangle extends Shape{
  public void draw(){
     System.out.println("draw a rectangle");
  }
}
//次は工場類
import java.util.HashMap;
import java.util.Map;

public class ShapeFactory {
  /**          */
  public static final int SHAPE_TYPE_CIRCLE=1;
  public static final int SHAPE_TYPE_RECTANGLE=2;
  public static final int SHAPE_TYPE_LINE=3;

  private static Map shapes=new HashMap();

  static{  //     , Java     ShapeFactory     ,        
    //                  
    shapes.put(new Integer(SHAPE_TYPE_CIRCLE),"Circle");
    shapes.put(new Integer(SHAPE_TYPE_RECTANGLE),"Rectangle");
    shapes.put(new Integer(SHAPE_TYPE_LINE),"Line");
  }
  /**      Shape  ,         */
  public static Shape getShape(int type){
    try{
      //              
      String className=shapes.get(new Integer(type));
      //  Java          
      return (Shape)Class.forName(className).newInstance();
    }catch(Exception e){return null;}
  }
}
//次はメインクラス
import java.io.*;
public class Panel {

  public void selectShape()throws Exception{
    System.out.println("       :");

    //              
    BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
    int shapeType=Integer.parseInt(input.readLine());

    //      
    Shape shape=ShapeFactory.getShape(shapeType);

    if(shape==null)
        System.out.println("          ");
    else
        shape.draw(); //   

  }
  public static void main(String[] args)throws Exception {
    new Panel().selectShape();
  }
}
/****************************************************
 * 著者:孫衛琴                                    *
 * ソース:<>                      *
 * テクニカルサポートWebサイト:www.javathinker.org               *
 ***************************************************/
intタイプの変数とstringタイプの変数を確立するためにmapsを用いたが,Sringタイプの配列でよいという別の方法も可能であるはずである.
static String[] shapes={"Circle","Rectangle","Line"};//  shapeFactory static   
String className=shapes[type];//  shapeFactory String className=shapes.get(new Integer(type));              
さらにはプロファイルの使用であり、プロファイルを使用したクラスは可変部分をプロファイルに書き込んでいるため、修正の際にこのクラスに対してプロファイルを修正するだけでよいので、コードを修正する必要はない.
プロファイルを使用したshapeFactoryクラスコードを次に示します.
import java.util.*;
import java.io.*;
public class ShapeFactory {
  private static Properties shapes=new Properties();
  static{
    try{
      InputStream in=ShapeFactory.class.getResourceAsStream("panel.properties");
      shapes.load(in); //        shapes   
    }catch(IOException e){throw new RuntimeException(e);}
  }
  public static Shape getShape(int type){
    try{
      //              
      String className=(String)shapes.get(String.valueOf(type));
      //  Java          
      return (Shape)Class.forName(className).newInstance();
    }catch(Exception e){return null;}
  }