デザインモード-ブリッジモード(ノキア:保存できると思います)

記事のディレクトリ

ここに画像の説明を挿入します

引例


スマートフォンは市場の大部分を占めていますが、ノキアなどの旧ブランドの携帯電話は、依然として高齢者の電話や学生の電話などに使用できます。

要件:さまざまな種類の携帯電話(ボタン電話:Nokia、フリップ電話:Newman、スマートフォン:Huawei、Xiaomiなど)のさまざまなブランドの操作プログラミング(電源のオン、オフ、電話の発信など)を実現します。

最初に一般的な解決策について説明します。親の携帯電話からさまざまな種類の携帯電話を継承し、最後に各ブランドが対応する携帯電話の種類を継承します。
ここに画像の説明を挿入します

短所:一見問題ありませんが、実際には拡張が容易ではありません(クラス爆発)。新しい携帯電話タイプ(新しい折りたたみタイプなど)が追加された場合、各携帯電話ブランドのクラスは次のことを行う必要があります。継承するために追加されます(スマートフォンを継承したHuawei Xiaomiなど)。同様に、携帯電話のブランドを追加する場合は、各携帯電話のスタイルカテゴリにも追加する必要があります。単一責任の原則への違反と高い維持費。

解決策は次の主人公です:ブリッジモード。

ブリッジモード


ブリッジモード(ブリッジ)は構造設計モードです。名前が示すように、それは接続するためのブリッジを構築するようなものであり、カプセル化、集約、継承を使用して、さまざまなクラスがさまざまな責任を引き受けることができます。実装と抽象化は2つの異なるクラスレベルに配置されるため、2つのレベルで各パーツの独立性を維持し、機能の拡張に対応します。

原理図
ここに画像の説明を挿入します

  • クライアントクラス:クライアント呼び出し
  • 抽象抽象クラス:ブリッジクラスとして機能し、Implementorインターフェイス(つまり、その実装クラスConcreteImplementorA ...)を維持します。
  • RefindAbstractionクラス:抽象クラスのサブクラスです
  • 実装者インターフェース:動作実装インターフェース
  • ConcreteImplementorA / Bクラス:動作の具体的な実装クラス

UMLクラス図から、抽象クラスとインターフェースが集約された関係、つまり呼び出しと呼び出しの関係にあることがわかります。このように、ブリッジが構築された後、特定の実装クラスはメソッド= "親クラス抽象クラスメソッド=" behavior interface method = "特定のインターフェイス動作実装クラスを呼び出して接続を完了します。同時に、2つ互いに独立していて、簡単に拡張できます。
ここに画像の説明を挿入します

実例


ブリッジモードを使用して、引用した例の実際の問題を解決します。
クラス図:

ここに画像の説明を挿入します

インタースティシャルアンチクライミング情報)Blogger CSDNアドレス:https://wzlodq.blog.csdn.net/

コード:

//接口
public interface Brand {
    
    
	void open(); //开机
	void close(); //关机
	void call();//打电话
}

//接口实现类
public class NOKIA implements Brand{
    
    
    @Override
    public void open() {
    
    
        System.out.println("诺基亚手机开机");
    }
    @Override
    public void close() {
    
    
        System.out.println("诺基亚手机关机");
    }
    @Override
    public void call() {
    
    
        System.out.println("诺基亚手机打电话");
    }
}

public class Newsmy implements Brand{
    
    
    @Override
    public void open() {
    
    
        System.out.println("纽曼手机开机");
    }
    @Override
    public void close() {
    
    
        System.out.println("纽曼手机关机");
    }
    @Override
    public void call() {
    
    
        System.out.println("纽曼手机打电话");
    }
}

public class Huawei implements Brand{
    
    
    @Override
    public void open() {
    
    
        System.out.println("华为手机开机");
    }
    @Override
    public void close() {
    
    
        System.out.println("华为手机关机");
    }
    @Override
    public void call() {
    
    
        System.out.println("华为手机打电话");
    }
}

public class Xiaomi implements Brand{
    
    
    @Override
    public void open() {
    
    
        System.out.println("小米手机开机");
    }
    @Override
    public void close() {
    
    
        System.out.println("小米手机关机");
    }
    @Override
    public void call() {
    
    
        System.out.println("小米手机打电话");
    }
}
//抽象类
public abstract class Phone {
    
    
	private Brand brand;//手机品牌接口
	public Phone(Brand brand) {
    
    //构造器
		super();
		this.brand = brand;
	}
	public void open() {
    
    
		this.brand.open();
	}
	public void close() {
    
    
		this.brand.close();
	}
	public void call() {
    
     this.brand.call(); }
}

//抽象子类
public class ButtonPhone extends Phone{
    
    
    public ButtonPhone(Brand brand) {
    
    
        super(brand);
    }
    public void open() {
    
    
        super.open();
        System.out.println("按键手机");
    }
    public void close() {
    
    
        super.close();
        System.out.println("按键手机");
    }
    public void call() {
    
    
        super.call();
        System.out.println("按键手机");
    }
}

public class SlidePhone extends Phone{
    
    
    public SlidePhone(Brand brand) {
    
    
        super(brand);
    }
    public void open() {
    
    
        super.open();
        System.out.println("翻盖手机");
    }
    public void close() {
    
    
        super.close();
        System.out.println("翻盖手机");
    }
    public void call() {
    
    
        super.call();
        System.out.println("翻盖手机");
    }
}

public class SmartPhone  extends Phone{
    
    
    public SmartPhone(Brand brand) {
    
    
        super(brand);
    }
    public void open() {
    
    
        super.open();
        System.out.println("智能手机");
    }
    public void close() {
    
    
        super.close();
        System.out.println("智能手机");
    }
    public void call() {
    
    
        super.call();
        System.out.println("智能手机");
    }
}
//客户端调用
public class Client {
    
    
    public static void main(String[] args) {
    
    
        Phone phone1 = new ButtonPhone(new NOKIA());
        phone1.open();
        phone1.call();
        phone1.close();

        System.out.println("=======================");
        Phone phone2 = new SlidePhone(new Newsmy());
        phone2.open();
        phone2.call();
        phone2.close();

        System.out.println("=======================");
        Phone phone3 = new SmartPhone(new Huawei());
        phone3.open();
        phone3.call();
        phone3.close();
    }
}

ここに画像の説明を挿入します

総括する


  • 抽象化部分と実現部分の分離が実現され、システムの柔軟性が大幅に向上し、抽象化部分と
    実現部分が独立するため、システムを階層的に設計できるため、より構造化されたシステムが作成されます。
  • ブリッジングモデルは、マルチレイヤー継承スキームに置き換わるものであり、サブクラスの数を減らし、システムの管理および保守コストを削減できます。
  • ブリッジモードの導入により、システムの理解と設計が難しくなります。集約関係は抽象層で確立
    されるため開発者は抽象化のための設計とプログラミングを行う必要があります。
  • 一般的なアプリケーションシナリオ:-JDBCドライバー-
    銀行振込システム
    転送分類:オンライン転送、カウンター転送、AMT転送
    転送ユーザータイプ:通常ユーザー、シルバーカードユーザー、ゴールドカードユーザー...-メッセージ
    管理
    メッセージタイプ:インスタントメッセージング、遅延メッセージ
    メッセージ分類:携帯電話のテキストメッセージ、電子メールメッセージ、QQメッセージ...

オリジナルは簡単ではありません、再版ないでくださいこれは裕福な訪問では悪化します
ブロガーのホームページ:https//wzlodq.blog.csdn.net/WeChat
パブリックアカウント記事があなたに役立つ場合は、クリックすることを忘れないでください3つのリンク❤唔仄lo咚锵

おすすめ

転載: blog.csdn.net/qq_45034708/article/details/114900871