Java デザイン パターンの外観パターンとデコレータ パターンの概要 (コード例)

不言
リリース: 2018-09-12 16:06:23
オリジナル
1983 人が閲覧しました

この記事では、Java デザイン パターンの外観モードとデコレータ モードについて説明します (コード例)。必要な方は参考にしていただければ幸いです。

はじめに

前の記事では、構造パターンのアダプターパターンとブリッジパターンについて学びました。この記事では、構造モードの外観モードとデコレータ モードについて学びます。

外観モード

概要

外観モードは、システムの複雑さを隠し、クライアントがシステムにアクセスできるインターフェイスを提供します。このタイプのデザイン パターンは、システムの複雑さを隠すために既存のシステムにインターフェイスを追加する構造パターンです。

簡単に言うと、外部へのシンプルなインターフェイスを提供し、実装ロジックを隠します。たとえば、一般的に使用されているコンピュータの電源ボタンの場合、電源ボタンを押すだけで起動またはシャットダウンできます。どのように起動するか (CPU の起動、メモリの起動、ハードディスクの起動) を知る必要はありません。 ) またはシャットダウンする方法 (ハードディスクの電源を切る、メモリの電源を切る、CPU の電源を切る)

ここでも、外観モードでゲームをプレイする例を簡単に説明します。
DNF、LOL、WOW などのオンライン ゲームがいくつかあります。ゲームを開始してプレイするには、コンピューター上のアイコンをダブルクリックするだけで済みます。ゲームの開始方法や実行方法を気にする必要はありません。

実装する必要がある手順は次のとおりです:

  1. ゲーム インターフェイスを確立します。

  2. LOL、DNF、および WOW クラスを確立し、ゲーム インターフェイスを実装します。

  3. に提供する外観クラスを定義します。クライアントからの電話。

  4. 外観クラスを呼び出します。

コード例:

interface Game{
    void play();
}

class DNF implements Game{

    @Override
    public void play() {
        System.out.println("正在玩DNF...");
    }
}

class LOL implements Game{
    @Override
    public void play() {
        System.out.println("正在玩LOL...");
    }
}

class WOW implements Game{
    @Override
    public void play() {
        System.out.println("正在玩WOW...");
    }
}

class Computer{
    
    private Game dnf;
    private Game lol;
    private Game wow;
    
    public Computer() {
        dnf=new DNF();
        lol=new LOL();
        wow=new WOW();
    }
    
    public void playDNF(){
        dnf.play();
    }
    
    public void playLOL(){
        lol.play();
    }
    
    public void playWOW(){
        wow.play();
    }   
}

public static void main(String[] args) {
        Computer computer=new Computer();
        computer.playDNF();
        computer.playLOL();
        computer.playWOW();
    }
ログイン後にコピー

実行結果:

    正在玩DNF...
    正在玩LOL...
    正在玩WOW...
ログイン後にコピー

上記のコード例では、ゲームをプレイする場合、外観クラスをインスタンス化し、ゲームメソッドを呼び出すだけです。ゲームの起動方法について心配する必要はありません。また、それぞれのゲームは独立しており、あるゲームがプレイできなくなったからといって、他のゲームも実行できなくなることはありません。実際、外観モードは私たちが通常使用する インターフェース に非常に似ていると感じます。どちらも外部世界へのインターフェースを提供するものであり、その実装方法を気にする必要はありません。

外観モードの利点:

結合が減少し、ある意味でセキュリティも向上します。

外観モードの欠点:

は開閉の原則に従っていないため、変更するのは簡単ではありません。

使用シナリオ

システム内に複数の複雑なモジュールまたはサブシステムがある場合。

Decorator パターン

はじめに

Decorator パターンを使用すると、構造を変更せずに既存のオブジェクトに新しい機能を追加できます。このタイプのデザイン パターンは構造パターンであり、既存のクラスのラッパーとして機能します。

デコレータ モードは、名前が示すように、追加機能を提供できるように何かを装飾することです。たとえば、人を装飾したり、さまざまなことを行うときにさまざまな衣装を着たりします。たとえば、ジャージを着るということは野球をする準備をすることを意味し、水着を着るということは水泳に行く準備をすることを意味します。

デコレータ パターンは、オブジェクトにいくつかの追加の責任を動的に追加できます。

ここでも例を使用して説明します。
現在の玩具モデルの中で、GUNDAMモデルMrGuモデルの2つのモデルが非常に人気があります。モデルを組み立てるときは、通常、最初にモデルを組み立ててから、武器などの追加のアクセサリーを追加します。ここではガンダムモデルザク(MrGu)モデルを組み立て、それぞれの武器を装備してみました。

具体的な実装手順は次のとおりです:

  1. アセンブリメソッドを使用して、抽象コンポーネントのモデルインターフェイスを作成します。

  2. 特定のコンポーネントのクラスを作成し(GUNDAMクラスとMrGuクラス)、上記のモデルインターフェイスを実装します。 ;

  3. クライアントのリクエストを受け入れ、クライアントのリクエストに従って対応する呼び出しを行うデコレーターを定義します。

  4. オブジェクトに対応する関数を追加するデコレーションを具体的に実装するクラスを定義します。

コード例:

interface Model{
    void  assemble();
}

class GUNDAM implements Model{
    @Override
    public void  assemble() {
        System.out.println("组装一个高达模型");
    }
}

class MrGu implements Model{
    @Override
    public void  assemble() {
        System.out.println("组装一个扎古模型");
    }
}

abstract class  AddExtra implements Model{
    protected  Model model;
    
    public AddExtra(Model model){
        this.model=model;
    }
    public  void assemble(){
        model.assemble();
    }
}

class LightSaber extends AddExtra{

    public LightSaber(Model model) {
        super(model);
    }
    
    public  void assemble(){
        model.assemble();
        addLightSaber();
    }
    public void addLightSaber(){
        System.out.println("添加光剑");
    }
}


class RocketLauncher extends AddExtra{

    public RocketLauncher(Model model) {
        super(model);
    }
    
    public  void assemble(){
        model.assemble();
        addRocketLauncher();
    }
    public void addRocketLauncher(){
        System.out.println("添加火箭筒");
    }
}

public static void main(String[] args) {
    
        Model gundam=new GUNDAM();
        Model mrgu=new MrGu();
        gundam.assemble();
        mrgu.assemble();
            
        Model gModel=new LightSaber(new GUNDAM());
        gModel.assemble();
        Model mModel=new RocketLauncher(new MrGu());
        mModel.assemble();
}
ログイン後にコピー

実行結果:

    组装一个高达模型
    组装一个扎古模型
    
    组装一个高达模型
    添加光剑
    组装一个扎古模型
    添加火箭筒
ログイン後にコピー

上記のコードでは、ガンダムやザクのモデルを組み立てたいだけであれば、モデルクラスを直接インスタンス化し、その中のメソッドを呼び出すことができます。できる。モデルを組み立てるときに武器を追加する必要がある場合は、デコレータ クラスを通じて対応する関数を追加するだけです。
この例を通じて、デコレータ パターンを使用しようとすると、一部のクラスは以前の関数に影響を与えることなく拡張でき、柔軟性が向上することがわかりました。

デコレータ パターンの利点:

装飾クラスと装飾クラスは、結合度が低く、拡張が容易で、柔軟性と利便性を備え、独立して開発できます。

デコレータ パターンの欠点:

クラスを装飾しすぎると、複雑さが増します。

使用シナリオ
プロトタイプは変更されず、いくつかの機能が動的に追加されます。

関連する推奨事項:

Java デザイン パターンのアダプター パターンとブリッジ パターンの紹介 (コード例)

Java デザイン パターンのビルダー パターンとプロトタイプ パターンの紹介 (コード例)

以上がJava デザイン パターンの外観パターンとデコレータ パターンの概要 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート