国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目次
Num3:建造(Builder)模式
Num7:Java で一般的に使用されるデザイン パターンは何ですか?
Num5:適配器(Adapter)模式
Java で一般的に使用されるデザイン パターンは何ですか?:
Java で一般的に使用されるデザイン パターンは何ですか?模式:
ホームページ Java &#&ベース Java で一般的に使用されるデザイン パターンは何ですか?

Java で一般的に使用されるデザイン パターンは何ですか?

May 25, 2021 pm 01:51 PM
java デザインパターン

Java で一般的に使用される設(shè)計パターン: 1. シングルトン モード; 2. ファクトリ モード; 3. ビルダー モード; 4. オブザーバー モード; 5. アダプター モード; 6. エージェント モード; 7. デコレーション モード。

Java で一般的に使用されるデザイン パターンは何ですか?

#このチュートリアルの動作環(huán)境: Windows7 システム、Java8 バージョン、DELL G3 コンピューター。

Num1: シングルトン モード

基本概念: クラスにはインスタンスが 1 つだけあることを確認し、それにアクセスするためのグローバル アクセス ポイントを提供します。

一般的な書き方:

飢えたスタイル

public class Singleton{
    private static Singleton singleton = new Singleton();
    private Singleton(){
    }
    public static Singleton getInstance(){
        return singleton;
    }
}

コール

Singleton.getInstance().method();

怠け者のスタイル

public class Singleton {  
    /* 持有私有靜態(tài)實例,防止被引用,此處賦值為null,目的是實現(xiàn)延遲加載 */  
    private static Singleton instance = null;  
  
    /* 私有構(gòu)造方法,防止被實例化 */  
    private Singleton() {}  
  
    /* 1:懶漢式,靜態(tài)工程方法,創(chuàng)建實例 */  
    public static Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
protected void method() {  
        System.out.println("SingletonInner");  
    }
}

呼び出し:

Singleton.getInstance().method();

利點: 遅延ロード (必要な場合のみロード)、シングルスレッド操作に適しています

欠點: スレッドが安全ではない、マルチスレッドでは同期が外れやすいデータベース オブジェクトに対して頻繁に読み取りおよび書き込み操作が実行される場合などです。

デュアル スレッド チェック モード

public class SingletonInner {  
    private static volatile SingletonInner sInst = null;  // <<< 這里添加了 volatile  
    /** 
     * 私有的構(gòu)造函數(shù) 
     */  
    private SingletonInner() {}  
  
    public static SingletonInner getInstance() {  
        if (inst == null) {            synchronized (SingletonInner.class) {if (inst == null) {
                    sInst = new SingletonInner();
                }
            }
        }        return sInst;  
    }    protected void method() {  
        System.out.println("SingletonInner");  
    }  
}

呼び出し:

Singleton.getInstance().method();

利點: スレッド セーフ、遅延読み込みのサポート、高い呼び出し効率

欠點:記述方法が複雑で簡潔ではない

內(nèi)部クラスの実裝

public class SingletonInner {  
    /** 
     * 內(nèi)部類實現(xiàn)單例模式 
     * 延遲加載,減少內(nèi)存開銷   
     */  
    private static class SingletonHolder {  
        private static SingletonInner instance = new SingletonInner();  
    }  
  
    /** 
     * 私有的構(gòu)造函數(shù) 
     */  
    private SingletonInner() {}  
  
    public static SingletonInner getInstance() {  
        return SingletonHolder.instance;  
    }  
  
    protected void method() {  
        System.out.println("SingletonInner");  
    }  
}

Call:

Singleton.getInstance().method();

利點: 遅延読み込み、スレッドセーフ(クラス読み込み時) Java では相互に排他的)、メモリ消費量も削減されるため、內(nèi)部クラス メソッドを使用することをお勧めします。

Num2: ファクトリ パターン

基本概念: 柔軟性を向上させるという目的を達成するために、オブジェクト作成の特定のプロセスを保護および分離するために、オブジェクトを作成するための遷移インターフェイスを提供します。

は 3 つのカテゴリに分類されます:

  • シンプル ファクトリー モデル

    シンプル ファクトリー: シリーズ製品の生産には適さない;

  • ファクトリ メソッド パターン

    ファクトリ メソッド: ポリモーフィック ファクトリとも呼ばれます;

  • 抽象ファクトリ パターン

    抽象ファクトリ: とも呼ばれますツールボックスは製品ファミリを生成しますが、新しい製品の生成には役立ちません;

これら 3 つのモードは上から下に徐々に抽象化され、より一般的になります。 GOF は、書籍『デザイン パターン』の中で、ファクトリ パターンをファクトリ メソッド パターン (Factory Method) とアブストラクト ファクトリ パターン (Abstract Factory) の 2 つのカテゴリに分類しています。 Simple Factory パターンは Factory Method パターンの特殊なケースと考えてください。この 2 つは同じカテゴリに分類されます。

シンプル ファクトリ パターン

シンプル ファクトリ パターンは、

靜的ファクトリ メソッド パターンとも呼ばれます。名前の変更から、このモードは非常に単純であることがわかります。その目的は単純で、オブジェクトを作成するためのインターフェイスを定義することです。

単純なファクトリ パターンでは、ファクトリ クラスが製品クラスのインスタンス化への呼び出しの中心にあり、通過する車両の流れの中に立つ交通警察官と同じように、どの製品クラスをインスタンス化するかを決定します。これは、車両をどちらの方向に流入させるかを決定することと同じです。

最初にその構(gòu)成を見てみましょう:

    ファクトリ ロール: これはこのモデルの中核であり、特定のビジネス ロジックと判斷ロジックが含まれています。 Java では、多くの場合、具象クラスによって実裝されます。
  • 製品の抽象的な役割: これは通常、特定の製品または実裝されたインターフェイスによって継承される親クラスです。 Javaではインターフェースまたは抽象クラスによって実裝されます。
  • 特定の製品ロール: ファクトリ クラスによって作成されたオブジェクトは、このロールのインスタンスです。 Javaの具象クラスによって実裝されます。
サンプル コード:

public class Factory{ //getClass 產(chǎn)生Sample 一般可使用動態(tài)類裝載裝入類。
    public static Sample creator(int which){ 
        if (which==1)
            return new SampleA();
        else if (which==2)
            return new SampleB();
    }
}

もう 1 つの一般的な標準は、靜的ファクトリ メソッドに

valueOf または getInstance という名前を付けることです。

valueOf: このメソッドによって返されるインスタンスは、そのパラメーターと同じ値を持ちます。例:

Integer a=Integer.valueOf(100); //返回取值為100的Integer對象
public class Complex {
    private final float re;
    private final float im;

    private Complex(float re, float im){
        this.re = re;
        this.im = im;
    }

    public static Complex valueOf(float re, float im){
        return new Complex(re, im);
    }

    public static Complex valueOfPolar(float r, float theta){
        return new Complex((float)(r * Math.cos(theta)), (float)(r * Math.sin(theta)));
    }
}

上記のコードからわかるように、valueOf( ) メソッドを?qū)g行できます。型変換操作。この例では、int 型の基本データを Integer オブジェクトに変換します。

getInstance: 返されたインスタンスはパラメーターと一致します。例:

Calendar cal=Calendar.getInstance(Locale.CHINA); //返回符合中國標準的日歷

ファクトリ メソッド パターン

ファクトリ メソッド パターンファクトリ パターンのさらなる抽象化と昇格により、ファクトリ メソッド パターンでは、どの製品クラスをインスタンス化するかを決定するのは単なるファクトリ クラスではなくなり、この決定は抽象ファクトリのサブクラスに委ねられます。

その構(gòu)成を見てみましょう:

  • 抽象工廠角色: 這是工廠方法模式的核心,它與應(yīng)用程序無關(guān)。是具體工廠角色必須實現(xiàn)的接口或者必須繼承的父類。在java中它由抽象類或者接口來實現(xiàn)。
  • 具體工廠角色:它含有和具體業(yè)務(wù)邏輯有關(guān)的代碼。由應(yīng)用程序調(diào)用以創(chuàng)建對應(yīng)的具體產(chǎn)品的對象
  • 抽象產(chǎn)品角色:它是具體產(chǎn)品繼承的父類或者是實現(xiàn)的接口。在java中一般有抽象類或者接口來實現(xiàn)。
  • 具體產(chǎn)品角色:具體工廠角色所創(chuàng)建的對象就是此角色的實例。在java中由具體的類來實現(xiàn)。

工廠方法模式使用繼承自抽象工廠角色的多個子類來代替簡單工廠模式中的“上帝類”。正如上面所說,這樣便分擔(dān)了對象承受的壓力;而且這樣使得結(jié)構(gòu)變得靈活 起來——當(dāng)有新的產(chǎn)品(即暴發(fā)戶的汽車)產(chǎn)生時,只要按照抽象產(chǎn)品角色、抽象工廠角色提供的合同來生成,那么就可以被客戶使用,而不必去修改任何已有的代 碼??梢钥闯龉S角色的結(jié)構(gòu)也是符合開閉原則的!

示例代碼:

//抽象產(chǎn)品角色
public interface Moveable {
    void run();
}
//具體產(chǎn)品角色
public class Plane implements Moveable {
    @Override
    public void run() {
        System.out.println("plane....");
    }
}
//具體產(chǎn)品角色
public class Broom implements Moveable {
    @Override
    public void run() {
        System.out.println("broom.....");
    }
}

//抽象工廠
public abstract class VehicleFactory {
    abstract Moveable create();
}
//具體工廠
public class PlaneFactory extends VehicleFactory{
    public Moveable create() {
        return new Plane();
    }
}
//具體工廠
public class BroomFactory extends VehicleFactory{
    public Moveable create() {
        return new Broom();
    }
}
//測試類
public class Test {
    public static void main(String[] args) {
        VehicleFactory factory = new BroomFactory();
        Moveable m = factory.create();
        m.run();
    }
}

可以看出工廠方法的加入,使得對象的數(shù)量成倍增長。當(dāng)產(chǎn)品種類非常多時,會出現(xiàn)大量的與之對應(yīng)的工廠對象,這不是我們所希望的。因為如果不能避免這種情 況,可以考慮使用簡單工廠模式與工廠方法模式相結(jié)合的方式來減少工廠類:即對于產(chǎn)品樹上類似的種類(一般是樹的葉子中互為兄弟的)使用簡單工廠模式來實 現(xiàn)。

簡單工廠和工廠方法模式的比較

工廠方法模式和簡單工廠模式在定義上的不同是很明顯的。工廠方法模式的核心是一個抽象工廠類,而不像簡單工廠模式, 把核心放在一個實類上。工廠方法模式可以允許很多實的工廠類從抽象工廠類繼承下來, 從而可以在實際上成為多個簡單工廠模式的綜合,從而推廣了簡單工廠模式。
反過來講,簡單工廠模式是由工廠方法模式退化而來。設(shè)想如果我們非常確定一個系統(tǒng)只需要一個實的工廠類, 那么就不妨把抽象工廠類合并到實的工廠類中去。而這樣一來,我們就退化到簡單工廠模式了。

抽象工廠模式

示例代碼:

//抽象工廠類
public abstract class AbstractFactory {
    public abstract Vehicle createVehicle();
    public abstract Weapon createWeapon();
    public abstract Food createFood();
}
//具體工廠類,其中Food,Vehicle,Weapon是抽象類,
public class DefaultFactory extends AbstractFactory{
    @Override
    public Food createFood() {
        return new Apple();
    }
    @Override
    public Vehicle createVehicle() {
        return new Car();
    }
    @Override
    public Weapon createWeapon() {
        return new AK47();
    }
}
//測試類
public class Test {
    public static void main(String[] args) {
        AbstractFactory f = new DefaultFactory();
        Vehicle v = f.createVehicle();
        v.run();
        Weapon w = f.createWeapon();
        w.shoot();
        Food a = f.createFood();
        a.printName();
    }
}

在抽象工廠模式中,抽象產(chǎn)品 (AbstractProduct) 可能是一個或多個,從而構(gòu)成一個或多個產(chǎn)品族(Product Family)。 在只有一個產(chǎn)品族的情況下,抽象工廠模式實際上退化到工廠方法模式。

總結(jié)

  • 簡單工廠模式是由一個具體的類去創(chuàng)建其他類的實例,父類是相同的,父類是具體的。

  • 工廠方法模式是有一個抽象的父類定義公共接口,子類負責(zé)生成具體的對象,這樣做的目的是將類的實例化操作延遲到子類中完成。

  • 抽象工廠模式提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無須指定他們具體的類。它針對的是有多個產(chǎn)品的等級結(jié)構(gòu)。而工廠方法模式針對的是一個產(chǎn)品的等級結(jié)構(gòu)。

Num3:建造(Builder)模式

基本概念:是一種對象構(gòu)建的設(shè)計模式,它可以將復(fù)雜對象的建造過程抽象出來(抽象類別),使這個抽象過程的不同實現(xiàn)方法可以構(gòu)造出不同表現(xiàn)(屬性)的對象。

Java で一般的に使用されるデザイン パターンは何ですか?是一步一步創(chuàng)建一個復(fù)雜的對象,它允許用戶可以只通過指定復(fù)雜對象的類型和內(nèi)容就可以構(gòu)建它們。用戶不知道內(nèi)部的具體構(gòu)建細節(jié)。Java で一般的に使用されるデザイン パターンは何ですか?是非常類似抽象工廠模式,細微的區(qū)別大概只有在反復(fù)使用中才能體會到。

UML結(jié)構(gòu)圖:

Java で一般的に使用されるデザイン パターンは何ですか?

上圖是Strategy 模式的結(jié)構(gòu)圖,讓我們可以進行更方便的描述:

  • Builder:為創(chuàng)建一個Product對象的各個部件指定抽象接口。

  • ConcreteBuilder:實現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個部件,定義并明確它所創(chuàng)建的表示,提供一個檢索產(chǎn)品的接口

  • Director:構(gòu)造一個使用Builder接口的對象。

  • Product:表示被構(gòu)造的復(fù)雜對象。ConcreateBuilder創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過程。

為何使用

是為了將構(gòu)建復(fù)雜對象的過程和它的部件解耦。注意:是解耦過程和部件。
因為一個復(fù)雜的對象,不但有很多大量組成部分,如汽車,有很多部件:車輪、方向盤、發(fā)動機,還有各種小零件等等,部件很多,但遠不止這些,如何將這些部件裝配成一輛汽車,這個裝配過程也很復(fù)雜(需要很好的組裝技術(shù)),Java で一般的に使用されるデザイン パターンは何ですか?就是為了將部件和組裝過程分開。

如何使用

首先假設(shè)一個復(fù)雜對象是由多個部件組成的,Java で一般的に使用されるデザイン パターンは何ですか?是把復(fù)雜對象的創(chuàng)建和部件的創(chuàng)建分別開來,分別用Builder類和Director類來表示。

首先,需要一個接口,它定義如何創(chuàng)建復(fù)雜對象的各個部件:

public interface Builder {
   //創(chuàng)建部件A  比如創(chuàng)建汽車車輪void buildPartA();
   //創(chuàng)建部件B 比如創(chuàng)建汽車方向盤void buildPartB();
   //創(chuàng)建部件C 比如創(chuàng)建汽車發(fā)動機void buildPartC();
   //返回最后組裝成品結(jié)果 (返回最后裝配好的汽車)
   //成品的組裝過程不在這里進行,而是轉(zhuǎn)移到下面的Director類中進行.
   //從而實現(xiàn)了解耦過程和部件    Product getResult();
}

用Director構(gòu)建最后的復(fù)雜對象,而在上面Builder接口中封裝的是如何創(chuàng)建一個個部件(復(fù)雜對象是由這些部件組成的),也就是說Director的內(nèi)容是如何將部件最后組裝成成品:

public class Director {
    private Builder builder;
    public Director( Builder builder ) {
        this.builder = builder;
   }
   // 將部件partA partB partC最后組成復(fù)雜對象
   //這里是將車輪 方向盤和發(fā)動機組裝成汽車的過程
    public void construct() {
        builder.buildPartA();
        builder.buildPartB();
        builder.buildPartC();
    }
}

Builder的具體實現(xiàn)ConcreteBuilder:

  • 通過具體完成接口Builder來構(gòu)建或裝配產(chǎn)品的部件;
  • 定義并明確它所要創(chuàng)建的是什么具體東西;
  • 提供一個可以重新獲取產(chǎn)品的接口。
public class ConcreteBuilder implements Builder {
 Part partA, partB, partC;
 public void buildPartA() {
  //這里是具體如何構(gòu)建 }
 public void buildPartB() {
  //這里是具體如何構(gòu)建 }
 public void buildPartC() {
  //這里是具體如何構(gòu)建 }
 public Product getResult() {
  //返回最后組裝成品結(jié)果 }
}

復(fù)雜對象:產(chǎn)品Product:

public interface Product { }

復(fù)雜對象的部件:

public interface Part { }

我們看看如何調(diào)用Java で一般的に使用されるデザイン パターンは何ですか?:

ConcreteBuilder builder = new ConcreteBuilder();
Director director = new Director( builder );
director.construct();
Product product = builder.getResult();

Java で一般的に使用されるデザイン パターンは何ですか?的應(yīng)用

在Java實際使用中,我們經(jīng)常用到"池"(Pool)的概念,當(dāng)資源提供者無法提供足夠的資源,并且這些資源需要被很多用戶反復(fù)共享時,就需要使用池。"池"實際是一段內(nèi)存,當(dāng)池中有一些復(fù)雜的資源的"斷肢"(比如數(shù)據(jù)庫的連接池,也許有時一個連接會中斷),如果循環(huán)再利用這些"斷肢",將提高內(nèi)存使用效率,提高池的性能。修改Java で一般的に使用されるデザイン パターンは何ですか?中Director類使之能診斷"斷肢"斷在哪個部件上,再修復(fù)這個部件。

Num4:Java で一般的に使用されるデザイン パターンは何ですか?

基本概念:Java で一般的に使用されるデザイン パターンは何ですか?定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽某一主題對象。這個主題對象在狀態(tài)發(fā)生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。Java で一般的に使用されるデザイン パターンは何ですか?又叫發(fā)布-訂閱(Publish/Subscribe)模式。

UML結(jié)構(gòu)圖

Java で一般的に使用されるデザイン パターンは何ですか?

上圖是Observer 模式的結(jié)構(gòu)圖,讓我們可以進行更方便的描述:

  • Subject類:它把所有對觀察者對象的引用保存在一個聚集里,每個主題都可以有任何數(shù)量的觀察著。抽象主題提供一個接口,可以增加和刪除觀察著對象。

  • Observer類:抽象觀察者,為所有的具體觀察者定義一個接口,在得到主題的通知時更新自己。

  • ConcreteSubject類:具體主題,將有關(guān)狀態(tài)存入具體觀察者對象;在具體主題的內(nèi)部狀態(tài)改變時,給所有登記過的觀察者發(fā)出通知。

  • ConcreteObserver類:具體觀察者,實現(xiàn)抽象觀察者角色所要求的更新接口,以便使本身的狀態(tài)與主題的狀態(tài)相協(xié)調(diào)。

如何使用

例如:老師有電話號碼,學(xué)生需要知道老師的電話號碼以便于在合適的時候撥打,在這樣的組合中,老師就是一個被觀察者(Subject),學(xué)生就是需要知道信息的觀察者,當(dāng)老師的電話號碼發(fā)生改變時,學(xué)生得到通知,并更新相應(yīng)的電話記錄。

先創(chuàng)建一個Subject類:

/**  
 * Subject(目標,Subject):    
 * 目標知道它的觀察者。可以有任意多個觀察者觀察同一個目標。  
 * 提供注冊和刪除觀察者對象的接口。  
 */  public interface Subject {  
    public void attach(Observer mObserver);  
    public void detach(Observer mObserver);        
    public void notice();  
}

創(chuàng)建Observer類:

/**  
 * Observer(觀察者,Observer):  
 * 為那些在目標發(fā)生改變時需要獲得通知的對象定義一個更新接口。   
 */  public interface Observer {  
    public void update();  
}

創(chuàng)建ConcreteSubject類:

/**  
 * ConcreteSubject(具體目標,Teacher)  
 * 將有關(guān)狀態(tài)存入各ConcreteObserve對象。  
 * 當(dāng)他的狀態(tài)發(fā)生改變時,向他的各個觀察者發(fā)出通知。   
 */  public class Teacher implements Subject{  
     
    private String phone;  
    private Vector students;  
    
    public Teacher(){  
        phone = "";  
        students = new Vector();  
    }  
  
    @Override  
    public void attach(Observer mObserver) {  
        students.add(mObserver);  
    }  
  
    @Override  
    public void detach(Observer mObserver) {  
        students.remove(mObserver);  
    }  
  
    @Override  
    public void notice() {  
        for(int i=0;i<students.size();i++){  
            ((Observer)students.get(i)).update();  
        }  
    }  
  
    public String getPhone() {  
        return phone;  
    }  
  
    public void setPhone(String phone) {  
        this.phone = phone;  
        notice();  
    }  
}

創(chuàng)建ConcreteObserver類:

/**  
 * ConcreteObserver(具體觀察者, Student):  
 * 維護一個指向ConcreteSubject對象的引用。  
 * 存儲有關(guān)狀態(tài),這些狀態(tài)應(yīng)與目標的狀態(tài)保持一致。  
 * 實現(xiàn)Observer的更新接口以使自身狀態(tài)與目標的狀態(tài)保持一致。  
 */  public class Student implements Observer{  
  
    private String name;  
    private String phone;  
    private Teacher mTeacher;  
      
    public Student(String name,Teacher t){  
       this.name = name;  
       mTeacher = t;  
    }  
      
    public void show(){  
       System.out.println("Name:"+name+"\nTeacher&#39;sphone:" + phone);  
    }  
      
    @Override  
    public void update() {  
        phone = mTeacher.getPhone();  
    }  
}

客戶端測試:

/**  
 * 觀察者(Observer)模式測試類   
 */  public class ObserverClient {  
    public static void main(String[] args) {  
       Vector students = new Vector();  
       Teacher t = new Teacher();  
       for(int i= 0;i<10;i++){  
           Student st = new Student("Andy.Chen"+i,t);  
           students.add(st);  
           t.attach(st);  
       }  
         
       System.out.println("Welcome to Andy.Chen Blog!" +"\n"   
                   +"Observer Patterns." +"\n"  
                   +"-------------------------------");  
         
       t.setPhone("12345678");  
       for(int i=0;i<3;i++)  
           ((Student)students.get(i)).show();  
         
       t.setPhone("87654321");  
       for(int i=0;i<3;i++)  
           ((Student)students.get(i)).show();  
    }  
}

程序運行結(jié)果如下:

Welcome to Andy.Chen Blog!  Observer Patterns.  
-------------------------------  Name:Andy.Chen0  
Teacher&#39;sphone:12345678  
Name:Andy.Chen1  
Teacher&#39;sphone:12345678  
Name:Andy.Chen2  
Teacher&#39;sphone:12345678  
Name:Andy.Chen0  
Teacher&#39;sphone:87654321  
Name:Andy.Chen1  
Teacher&#39;sphone:87654321  
Name:Andy.Chen2  
Teacher&#39;sphone:87654321

總結(jié)

Java で一般的に使用されるデザイン パターンは何ですか?何時適用?

  • 當(dāng)一個抽象模型有兩個方面,其中一個方面依賴于另一方面。將這二者封裝在獨立的對象中可以使他們各自獨立地改變和復(fù)用。

  • 當(dāng)對一個對象的改變需要同時改變其它對象,而不知道具體由多少對象有待改變。

  • 當(dāng)一個對象必須通知其他對象,而它又不能假定其他對象是誰,換言之,你不希望這些對象是緊密耦合的。讓耦合的雙方都依賴于抽象,而不是依賴于具體。

Num5:適配器(Adapter)模式

基本概念:適配器模式把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。

適配器模式的用途

用電器做例子,筆記本電腦的插頭一般都是三相的,即除了陽極、陰極外,還有一個地極。而有些地方的電源插座卻只有兩極,沒有地極。電源插座與筆記本電腦的電源插頭不匹配使得筆記本電腦無法使用。這時候一個三相到兩相的轉(zhuǎn)換器(適配器)就能解決此問題,而這正像是本模式所做的事情。

適配器模式的結(jié)構(gòu)
適配器模式有類的適配器模式對象的適配器模式兩種不同的形式。

Java で一般的に使用されるデザイン パターンは何ですか?:

Java で一般的に使用されるデザイン パターンは何ですか?

在上圖中可以看出,Adaptee類并沒有sampleOperation2()方法,而客戶端則期待這個方法。為使客戶端能夠使用Adaptee類,提供一個中間環(huán)節(jié),即類Adapter,把Adaptee的API與Target類的API銜接起來。Adapter與Adaptee是繼承關(guān)系,這決定了這個適配器模式是類的:

  • 目標(Target)角色:這就是所期待得到的接口。注意:由于這里討論的是Java で一般的に使用されるデザイン パターンは何ですか?,因此目標不可以是類。
  • 源(Adapee)角色:現(xiàn)在需要適配的接口。
  • 適配器(Adaper)角色:適配器類是本模式的核心。適配器把源接口轉(zhuǎn)換成目標接口。顯然,這一角色不可以是接口,而必須是具體類。
Java で一般的に使用されるデザイン パターンは何ですか?模式:

Java で一般的に使用されるデザイン パターンは何ですか?

從上圖可以看出,Adaptee類并沒有sampleOperation2()方法,而客戶端則期待這個方法。為使客戶端能夠使用Adaptee類,需要提供一個包裝(Wrapper)類Adapter。這個包裝類包裝了一個Adaptee的實例,從而此包裝類能夠把Adaptee的API與Target類的API銜接起來。Adapter與Adaptee是委派關(guān)系,這決定了適配器模式是對象的。

示例代碼:

public interface Target {    /**
     * 這是源類Adaptee也有的方法     */
    public void sampleOperation1(); 
    /**
     * 這是源類Adapteee沒有的方法     */
    public void sampleOperation2(); 
}public class Adaptee {    public void sampleOperation1(){}
}

適配器類:

public class Adapter {
    private Adaptee adaptee;
    public Adapter(Adaptee adaptee){
        this.adaptee = adaptee;
    }
    /**
     * 源類Adaptee有方法sampleOperation1
     * 因此適配器類直接委派即可
     */
    public void sampleOperation1(){
        this.adaptee.sampleOperation1();
    }
    /**
     * 源類Adaptee沒有方法sampleOperation2
     * 因此由適配器類需要補充此方法
     */
    public void sampleOperation2(){
        //寫相關(guān)的代碼
    }
}

類適配器和Java で一般的に使用されるデザイン パターンは何ですか?的權(quán)衡

  • 類適配器使用對象繼承的方式,是靜態(tài)的定義方式;而Java で一般的に使用されるデザイン パターンは何ですか?使用對象組合的方式,是動態(tài)組合的方式。
  • 對于類適配器由于適配器直接繼承了Adaptee,使得適配器不能和Adaptee的子類一起工作,因為繼承是靜態(tài)的關(guān)系,當(dāng)適配器繼承了Adaptee后,就不可能再去處理 Adaptee的子類了。

  • 對于Java で一般的に使用されるデザイン パターンは何ですか?一個適配器可以把多種不同的源適配到同一個目標。換言之,同一個適配器可以把源類和它的子類都適配到目標接口。因為Java で一般的に使用されるデザイン パターンは何ですか?采用的是對象組合的關(guān)系,只要對象類型正確,是不是子類都無所謂。

  • 對于類適配器適配器可以重定義Adaptee的部分行為,相當(dāng)于子類覆蓋父類的部分實現(xiàn)方法。

  • 對于Java で一般的に使用されるデザイン パターンは何ですか?要重定義Adaptee的行為比較困難,這種情況下,需要定義Adaptee的子類來實現(xiàn)重定義,然后讓適配器組合子類。雖然重定義Adaptee的行為比較困難,但是想要增加一些新的行為則方便的很,而且新增加的行為可同時適用于所有的源。

  • 對于類適配器,僅僅引入了一個對象,并不需要額外的引用來間接得到Adaptee。

  • 對于Java で一般的に使用されるデザイン パターンは何ですか?,需要額外的引用來間接得到Adaptee。

建議盡量使用Java で一般的に使用されるデザイン パターンは何ですか?的實現(xiàn)方式,多用合成或聚合、少用繼承。當(dāng)然,具體問題具體分析,根據(jù)需要來選用實現(xiàn)方式,最適合的才是最好的。

適配器模式的優(yōu)點

  • 更好的復(fù)用性:系統(tǒng)需要使用現(xiàn)有的類,而此類的接口不符合系統(tǒng)的需要。那么通過適配器模式就可以讓這些功能得到更好的復(fù)用。

  • 更好的擴展性:在實現(xiàn)適配器功能的時候,可以調(diào)用自己開發(fā)的功能,從而自然地擴展系統(tǒng)的功能。

適配器模式的缺點

  過多的使用適配器,會讓系統(tǒng)非常零亂,不易整體進行把握。比如,明明看到調(diào)用的是A接口,其實內(nèi)部被適配成了B接口的實現(xiàn),一個系統(tǒng)如果太多出現(xiàn)這種情況,無異于一場災(zāi)難。因此如果不是很有必要,可以不使用適配器,而是直接對系統(tǒng)進行重構(gòu)。

Num6:Java で一般的に使用されるデザイン パターンは何ですか?

基本概念:為其他對象提供一種代理以控制對這個對象的訪問。也可以說,在出發(fā)點到目的地之間有一道中間層,意為代理。

為什么要使用

  • 授權(quán)機制不同級別的用戶對同一對象擁有不同的訪問權(quán)利,如在論壇系統(tǒng)中,就使用Proxy進行授權(quán)機制控制,訪問論壇有兩種人:注冊用戶和游客(未注冊用戶),論壇就通過類似ForumProxy這樣的代理來控制這兩種用戶對論壇的訪問權(quán)限。

  • 某個客戶端不能直接操作到某個對象,但又必須和那個對象有所互動。

舉例兩個具體情況:

  • 如果那個對象是一個是很大的圖片,需要花費很長時間才能顯示出來,那么當(dāng)這個圖片包含在文檔中時,使用編輯器或瀏覽器打開這個文檔,打開文檔必須很迅速,不能等待大圖片處理完成,這時需要做個圖片Proxy來代替真正的圖片。
  • 如果那個對象在Internet的某個遠端服務(wù)器上,直接操作這個對象因為網(wǎng)絡(luò)速度原因可能比較慢,那我們可以先用Proxy來代替那個對象。

總之原則是,對于開銷很大的對象,只有在使用它時才創(chuàng)建,這個原則可以為我們節(jié)省很多寶貴的Java內(nèi)存。所以,有些人認為Java耗費資源內(nèi)存,我以為這和程序編制思路也有一定的關(guān)系。

如何使用

以論壇系統(tǒng)為例,訪問論壇系統(tǒng)的用戶有多種類型:注冊普通用戶、論壇管理者、系統(tǒng)管理者、游客。注冊普通用戶才能發(fā)言,論壇管理者可以管理他被授權(quán)的論壇,系統(tǒng)管理者可以管理所有事務(wù)等,這些權(quán)限劃分和管理是使用Proxy完成的。
在Forum中陳列了有關(guān)論壇操作的主要行為,如論壇名稱,論壇描述的獲取和修改,帖子發(fā)表刪除編輯等,在ForumPermissions中定義了各種級別權(quán)限的用戶:

public class ForumPermissions implements Cacheable {
    /**
    * Permission to read object.
    */
    public static final int READ = 0;

    /**
    * Permission to administer the entire sytem.
    */
    public static final int SYSTEM_ADMIN = 1;

    /**
    * Permission to administer a particular forum.
    */
    public static final int FORUM_ADMIN = 2;

    /**
    * Permission to administer a particular user.
    */
    public static final int USER_ADMIN = 3;

    /**
    * Permission to administer a particular group.
    */
    public static final int GROUP_ADMIN = 4;

    /**
    * Permission to moderate threads.
    */
    public static final int MODERATE_THREADS = 5;

    /**
    * Permission to create a new thread.
    */
    public static final int CREATE_THREAD = 6;

    /**
    * Permission to create a new message.
    */
    public static final int CREATE_MESSAGE = 7;

    /**
    * Permission to moderate messages.
    */
    public static final int MODERATE_MESSAGES = 8;
  
    public boolean isSystemOrForumAdmin() {
        return (values[FORUM_ADMIN] || values[SYSTEM_ADMIN]);
    }

//相關(guān)操作代碼
}

因此,F(xiàn)orum中各種操作權(quán)限是和ForumPermissions定義的用戶級別有關(guān)系的,作為接口Forum的實現(xiàn):ForumProxy正是將這種對應(yīng)關(guān)系聯(lián)系起來。比如,修改Forum的名稱,只有論壇管理者或系統(tǒng)管理者可以修改,代碼如下:

public class ForumProxy implements Forum {
    private ForumPermissions permissions;
    private Forum forum;
    this.authorization = authorization;

    public ForumProxy(Forum forum, Authorization authorization,ForumPermissions permissions){
        this.forum = forum;
        this.authorization = authorization;
        this.permissions = permissions;
    }
    .....
    public void setName(String name) throws UnauthorizedException,
        ForumAlreadyExistsException{
        //只有是系統(tǒng)或論壇管理者才可以修改名稱
      if (permissions.isSystemOrForumAdmin()) {
        forum.setName(name);
      }
    else {
    throw new UnauthorizedException();
    }
    }
    ...

}

而DbForum才是接口Forum的真正實現(xiàn),以修改論壇名稱為例:

public class DbForum implements Forum, Cacheable {
    ...
    public void setName(String name) throws ForumAlreadyExistsException {
  ....
        this.name = name;
       //這里真正將新名稱保存到數(shù)據(jù)庫中
       saveToDb();
  ....
    }
    ...
}

凡是涉及到對論壇名稱修改這一事件,其他程序都首先得和ForumProxy打交道,由ForumProxy決定是否有權(quán)限做某一樣事情,F(xiàn)orumProxy是個名副其實的"網(wǎng)關(guān)","安全代理系統(tǒng)"。
在平時應(yīng)用中,無可避免總要涉及到系統(tǒng)的授權(quán)或安全體系,不管你有無意識的使用Proxy,實際你已經(jīng)在使用Proxy了。

流程圖

Java で一般的に使用されるデザイン パターンは何ですか?

Num7:Java で一般的に使用されるデザイン パターンは何ですか?

基本概念:Java で一般的に使用されるデザイン パターンは何ですか?(Decorator),動態(tài)地給一個對象添加一些額外的職責(zé),就增加功能來說,Java で一般的に使用されるデザイン パターンは何ですか?比生成子類更為靈活。

UML結(jié)構(gòu)圖

Java で一般的に使用されるデザイン パターンは何ですか?

上圖是Decorator 模式的結(jié)構(gòu)圖,讓我們可以進行更方便的描述:

  • Component是定義一個對象接口,可以給這些對象動態(tài)地添加職責(zé)。

  • ConcreteComponent是定義了一個具體的對象,也可以給這個對象添加一些職責(zé)。

Decorator是裝飾抽象類,繼承了Component,從外類來擴展Component類的功能,但對于Component來說,是無需知道Decorator存在的。ConcreteDecorator就是具體的裝飾對象,起到給Component添加職責(zé)的功能。

如何使用

假設(shè)情景:某人裝扮自己形象,穿衣服,褲子,鞋子,戴帽子等來把自己給包裝起來,需要把所需的功能按正確的順序串聯(lián)起來進行控制,我們應(yīng)該如何設(shè)計才能做到呢?如下,先看下代碼結(jié)構(gòu)圖:

先創(chuàng)建一個接口類:Component.java

public interface Component {    
    void show();
}

創(chuàng)建一個具體的 ConcreteComponent 來實現(xiàn) Component 接口:Person.java

public class Person implements Component{
    private String name;
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Person(String name){
        this.name = name;
    }

    @Override
    public void show() {
        System.out.println("裝扮的" + name);
    }
}

創(chuàng)建裝飾類 Decorator 實現(xiàn) Component 接口

public class Decorator implements Component{
    private Component mComponent;
    public void decoratorObj(Component component){
        mComponent = component;
    }

    @Override
    public void show() {
        if(mComponent != null){
            mComponent.show();
        }
    }
}

分別創(chuàng)建具體的裝飾類:Jeans.java , Pelisse.java, Sandal.java ...等等,分別繼承 Decorator.java 類

/** 牛仔褲 */
public class Jeans extends Decorator {
    @Override
    public void show(){
        System.out.println("穿牛仔褲");
        super.show();
    }
    
}

客戶端測試類

/**
 * Java で一般的に使用されるデザイン パターンは何ですか?測試客戶端
 */
public class DecoratorClient {
    public static void main(String[] args) {
        System.out.println("Welcome to Andy.Chen Blog!" +"\n" 
                   +"Decorator Patterns." +"\n");
        
        Person mPerson = new Person("Andy");
        
        Sandal mSandal = new Sandal();
        Jeans mJeans = new Jeans();
        TShirt mShirt = new TShirt();
        
        mShirt.decoratorObj(mPerson);
        mJeans.decoratorObj(mShirt);
        mSandal.decoratorObj(mJeans);
        mSandal.show(); 
    }
}

測試結(jié)果

Welcome to Andy.Chen Blog!
Decorator Patterns.
  
穿涼鞋
穿牛仔褲
穿T-Shirt
裝扮的Andy

總結(jié)

Decorator模式有以下的優(yōu)缺點:

  • 靜的継承よりも柔軟なオブジェクトの靜的継承と比較して、デコレーター パターンはオブジェクトに責(zé)任を追加するためのより柔軟な方法を提供します。追加メソッドとデタッチ メソッドを使用したり、裝飾を使用して責(zé)任を追加したりできます。実行時に責(zé)任を取り除きます。継承メカニズムを使用して責(zé)任を追加するには、新しいサブクラスを作成する必要があります。元のすべてのサブクラスに機能を追加する必要がある場合、各サブクラスを書き直す必要があり、システムの複雑さが増加します。また、特定のコンポーネントに対して複數(shù)のサブクラスを提供することもできますclass.Decorator の場合、この種の混合と一致は、継承を使用して実現(xiàn)するのが困難です。

  • 階層の上位のクラスに機能が多すぎることを避けてください。Decorator パターンは、責(zé)任を追加するための「従量課金制」アプローチを提供します。カスタマイズ可能なクラスは、予測可能なすべての機能をサポートします。代わりに、単純なクラスを定義し、Decorator クラスを使用してそれに関數(shù)を徐々に追加し、単純なコンポーネントを組み合わせて複雑な関數(shù)を作成できます。

  • デコレータはそのコンポーネントとは異なります。デコレータは透明なパッケージです。オブジェクト識別の観點から始めると、裝飾されたコンポーネントとこのコンポーネントには違いがあるため、デコレータは次のようにする必要があります。オブジェクト識別子と一緒に使用することはできません。

  • 多數(shù)の小さなオブジェクトが生成されます。Decorator パターンを使用したシステム設(shè)計では、よく似た多數(shù)の小さなオブジェクトが生成されます。これらのオブジェクトは、相互の接続方法が異なるだけです。

推奨される関連ビデオ チュートリアル: Java ビデオ チュートリアル

以上がJava で一般的に使用されるデザイン パターンは何ですか?の詳細內(nèi)容です。詳細については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國語版

SublimeText3 中國語版

中國語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JDBCを使用してJavaのトランザクションを処理する方法は? JDBCを使用してJavaのトランザクションを処理する方法は? Aug 02, 2025 pm 12:29 PM

JDBCトランザクションを正しく処理するには、最初に自動コミットモードをオフにし、次に複數(shù)の操作を?qū)g行し、結(jié)果に応じて最終的にコミットまたはロールバックする必要があります。 1。CONN.SETAUTOCOMMIT(FALSE)を呼び出して、トランザクションを開始します。 2。挿入や更新など、複數(shù)のSQL操作を?qū)g行します。 3。すべての操作が成功した場合はconn.commit()を呼び出し、データの一貫性を確保するために例外が発生した場合はconn.rollback()を呼び出します。同時に、リソースを使用してリソースを管理し、例外を適切に処理し、接続を密接に接続するために、接続の漏れを避けるために使用する必要があります。さらに、接続プールを使用してセーブポイントを設(shè)定して部分的なロールバックを達成し、パフォーマンスを改善するためにトランザクションを可能な限り短く保つことをお勧めします。

Javaでカレンダーを操作する方法は? Javaでカレンダーを操作する方法は? Aug 02, 2025 am 02:38 AM

Java.Timeパッケージのクラスを使用して、古い日付とカレンダーのクラスを置き換えます。 2。LocalDate、LocalDateTime、LocalTimeを通じて現(xiàn)在の日付と時刻を取得します。 3。of()メソッドを使用して特定の日付と時刻を作成します。 4.プラス/マイナスメソッドを使用して、時間を不正に増加させて短縮します。 5. ZonedDateTimeとZoneIDを使用して、タイムゾーンを処理します。 6。DateTimeFormatterを介したフォーマットおよび解析の文字列。 7.インスタントを使用して、必要に応じて古い日付型と互換性があります。現(xiàn)代のJavaでの日付処理は、java.timeapiを使用することを優(yōu)先する必要があります。

Javaフレームワークの比較:Spring Boot vs Quarkus vs Micronaut Javaフレームワークの比較:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

Pre-formanceTartuptimeMemoryusage、quarkusandmicronautleadduetocopile-timeprocessingingandgraalvsupport、withquarkusoftentylightbetterine serverlessシナリオ。

ネットワークポートとファイアウォールの理解 ネットワークポートとファイアウォールの理解 Aug 01, 2025 am 06:40 AM

ネットワークポートアンドファイアワルクトグテルトエナブルコマニケーションwhiledensuringsecurity.1.networksarevirtualendpointsnumbered0–655 35、withwell-knownportslike80(http)、443(https)、22(ssh)、および25(smtp)識別pecificservices.2.portsoperateovertcp(信頼できる、c

Garbage CollectionはJavaでどのように機能しますか? Garbage CollectionはJavaでどのように機能しますか? Aug 02, 2025 pm 01:55 PM

JavaのGarbage Collection(GC)は、メモリを自動的に管理するメカニズムであり、到達不可能なオブジェクトを取り戻すことでメモリ漏れのリスクを軽減します。 1.GCルートオブジェクトからのオブジェクトのアクセシビリティ(スタック変數(shù)、アクティブスレッド、靜的フィールドなど)、および到達不可能なオブジェクトはゴミとしてマークされています。 2。マーククリアリングアルゴリズムに基づいて、すべての到達可能なオブジェクトをマークし、マークのないオブジェクトをクリアします。 3.世代の収集戦略を採用する:新世代(Eden、S0、S1)は頻繁にMinorGCを?qū)g行します。高齢者のパフォーマンスは少なくなりますが、MajorGCを?qū)g行するのに時間がかかります。 Metaspaceはクラスメタデータを保存します。 4。JVMはさまざまなGCデバイスを提供します。SerialGCは小さなアプリケーションに適しています。 ParallelGCはスループットを改善します。 CMSが減少します

Javaビルドツールの比較:Maven vs. Gradle Javaビルドツールの比較:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

gradleisthebetterchoiceformostnewprojectoitssuperorfficability、performance、andmoderntoolingsupport.1.gradle’sgroovy/kotlindslismoreconciseandexpressiveethanmaven’sverboseml.2.gradleorformsmavenbenbumebutedwitedwitedwitedspedexは

説明された延期聲明の例で進みます 説明された延期聲明の例で進みます Aug 02, 2025 am 06:26 AM

Deferは、クリーニングリソースなど、関數(shù)が戻る前に指定された操作を?qū)g行するために使用されます。パラメーターは、延期時にすぐに評価され、関數(shù)は最後のファーストアウト(LIFO)の順に実行されます。 1.複數(shù)の債務(wù)は、宣言の逆の順序で実行されます。 2.ファイルの閉鎖などの安全なクリーニングに一般的に使用されます。 3。指定された返品値を変更できます。 4.回復(fù)に適したパニックが発生した場合でも実行されます。 5。リソースの漏れを防ぐために、ループで延期の亂用を避けます。正しい使用により、コードのセキュリティと読みやすさが向上します。

ユーザーデータにHTML「入力」タイプを使用します ユーザーデータにHTML「入力」タイプを使用します Aug 03, 2025 am 11:07 AM

適切なHTMLinputタイプを選択すると、データの精度を向上させ、ユーザーエクスペリエンスを向上させ、使いやすさを向上させることができます。 1.テキスト、電子メール、電話、番號、日付など、データ型に従って対応する入力タイプを選択します。 2。HTML5を使用して、より直感的な相互作用方法を提供できるURL、色、範(fàn)囲、検索などの新しいタイプを追加します。 3.プレースホルダーと必要な屬性を使用して、フォームフィリングの効率と精度を改善しますが、プレースホルダーがラベルを置き換えることはできないことに注意してください。

See all articles