Java設計モードの従[暗黒破壊神"装備モザイク宝石システム"]分析ブリッジモード


暴雪会社の有名なゲームの暗黒破壊神の中で、1つの経典の“モザイクシステム”があって、例えば、武器のためにルビー、サファイアをモザイクして攻撃の特効あるいは攻撃力のプラスを得ることができて、防具のためにルビー、サファイアをモザイクして攻撃の特効あるいは防御力のプラスを得ることができます.異なる宝石を異なる装備に加えると異なる効果があり、宝石を武器に加えると武器の攻撃力が向上し、防具に加えると防御力が向上する.
剣類(Sword)と盾類(Shield)を確立し,ルビー類(Ruby)とサファイア類(Sapphire)を確立したと仮定する.装備は宝石を埋め込むことができるため、この2つの部分は2つの組み合わせが可能で、そのために、私たちは4つのクラスを書いてそれらのすべての組み合わせを表現しなければなりません:SwordWithRuby、SwordWithSapphire、ShieldWithRuby、ShieldWithSapphire、コードの作成は非常に煩雑です.このような状況が発生したのは,「装備モザイク宝石」にはこの2つの次元の変化(武器の種類,宝石の種類)が存在し,n種類の武器,m種類の宝石があると仮定し,このメカニズムを実現するためにm*nクラスを構築せざるを得ないためである.
このとき、ブリッジモードで設計することができます.
ブリッジモードの意図は、抽象部分とその実装部分を分離し、独立して変化させることである.モザイクシステムでは、抽象的な部分は何ですか?抽象部分は武器に宝石を埋め込む抽象類(EquipmentRubyBridge)である.実現部分は何であるか.実現部分は各宝石の効果(Jewel)である.コードは以下の通りである.
interface Jewel {
    String name() ;
}

class Ruby implements Jewel {
    public String name (){
        return "   ";
    }
}

class Sapphire implements Jewel {
    public String name (){
        return "   ";
    }
}

class Sword extends EquipmentRubyBridge{
    public Sword(Jewel j) {
        super(j);
    }
    public void print(){
        System.out.println("       " + getJewel().name() );
    }
}

class Shield extends EquipmentRubyBridge{
    public Shield(Jewel j) {
        super(j);
    }
    public void print(){
        System.out.println("       " + getJewel().name() );
    }
}

abstract class EquipmentRubyBridge{
    private Jewel jewel;
    protected Jewel getJewel () { return jewel;}
    public EquipmentRubyBridge(Jewel j){
        jewel = j;
    }
    public abstract void print();
}


class Bridge {
    public static void main(String[] args) {
        Jewel sapphire = new Sapphire();
        Jewel ruby = new Ruby();
        EquipmentRubyBridge sword = new Sword(ruby);
        EquipmentRubyBridge shield = new Shield(sapphire);
        sword.print();
        shield.print();
    }
}
実行結果:
剣にルビーを盾にサファイアを埋め込んだ
上のコードを簡単に分析してください.EquipmentRubyBridgeはモザイクメカニズムの抽象であり,そのサブクラスにJewelインタフェースが含まれ,Jewelインタフェースは宝石の実装インタフェースであることを規定している.EquipmentRubyBridgeのサブクラスについては、必ずJewelオブジェクトを組み合わせます.つまり、EquipmentRubyBridgeは橋のように、そのサブクラスと実装部分(Jewel)を組み合わせています.ShieldクラスのようにEquipmentRubyBridgeに継承され、printメソッドではJewelのgetJewel()が呼び出される.name()メソッドであるEquipmentRubyBridgeサブクラスはprintメソッドを独自に拡張したり,各種Jewelクラスに転送したりすることができ,抽象部分と実装部分の独立を実現する.
『デザインモード』では、抽象とその実装の間に固定的なバインドモードが望まれない場合(この例では、武器が特定の宝石にバインドされていない場合)ブリッジを使用できます.クラスの抽象化とその実装は、サブクラスを生成する方法で拡張できるはずです.EquipmentRubyBridgeを継承して新しい武器を構築したり、Jewelを継承して新しい宝石を構築したりすることができます.