Rarestyleへようこそ
C#,デザインパターン,UML,オブジェクト指向,Webサービス,iPAQ(モバイル) アクセス数: Number_0Number_1Number_3Number_9Number_3Number_0Number_8Number_9
インデント OCPとデザインパターン
インデント サンプルコードについて
インデント デザインパターン ひとくちメモ
インデント FactoryMethodパターン
インデント AbstractFactoryパターン
インデント Builderパターン
インデント Prototypeパターン
インデント Adapterパターン
インデント Bridgeパターン
インデント Compositeパターン
インデント Decoratorパターン
インデント Facadeパターン
インデント Flyweightパターン
インデント Proxyパターン
インデント TemplateMethodパターン
インデント Chain of Responsibilityパターン
インデント Commandパターン
インデント Iteratorパターン
インデント Mediatorパターン
インデント Mementoパターン
インデント Observerパターン
インデント Stateパターン
インデント Strategyパターン
インデント Visitorパターン
インデント 速習!デザインパターン第一回
インデント 速習!デザインパターン第二回
インデント 速習!デザインパターン第三回
インデント UMLとは
インデント UML入門
インデント オブジェクト指向
インデント クラス図
インデント アクティビティ図
インデント インタラクション図
インデント ユースケース図
インデント Rarestyle証明書サービス
インデント QRコード発行WSDL
インデント QRコード発行サンプル
インデント J2EE覚書
インデント FreeMind実践レポート
インデント モバイル情報
インデント Homeページ
インデント イベント&デジタルファッション
インデント ごあいさつ・免責情報
インデント お問い合わせ
デザインパターンでキャリアアップ

Bridgeパターン (デザインパターン)

Bridgeパターン 導入

Bridgeパターンは、機能と実装を分離してそれぞれ独立できるようにするパターンです。

Bridgeパターン ポイント

実装の違いで同一な機能を行いたい場合 (クラスの実装がその実行環境に依存する場合など) その実装をクラスの 機能と分離することで、それぞれの拡張を独立して行えるようになります。

補足

抽象機能(このサンプルでは,Abstractionクラス)の操作を属性でImprementor保持していますが、 Collectionとして複数の実装を考慮してもかまわないと思います。

UML Bridgeパターン

C#ソースコード

Sample.cs

using System;

namespace Bridge
{

   //-------------------------------------------------------------
   //  デザインパターン Bridge
   //      機能と実装を分離してそれぞれ独立に拡張できるようにします。
   //
   //-------------------------------------------------------------

   //機能の抽象化
   //「機能とはあらかた予定されているもの」
   //「機能」はImplementorの操作を組み合わせて実装されます。
   //今回の抽象化された機能をMedia機能としてモデルに考えます。
   public abstract class Abstraction
   {
       private Implementor imp;

       //実装をプロパティとして保持します。
       public Implementor PropImplementor
       {
           set{this.imp=value;}
           get{return this.imp;}
       }

       //このメソッドで、Media機能の実行を定義します。
       public virtual void Operation()
       {
           this.PropImplementor.OperationImp();
       }

   }

   //機能の拡張
   //機能はImprementor(実行操作)でもって実装されます。
   //Imprementor(実行操作)の操作の組み合わせで、それぞれ異なる目的に
   //使用出来るようにすることができます。
   public class RefinedAbstraction:Abstraction
   {

   }

   //実装者
   public abstract class Implementor
   {
       public abstract void OperationImp();
   }

   //具象実装グラフィック(実際の内容)
   public class ConcreteImplementor_Graphic :Implementor
   {

       public override void OperationImp()
       {
           Console.WriteLine("映像を映し出すことができる。");
       }
   }

   //具象実装サウンド(実際の内容)
   public class ConcreteImplementor_Sound :Implementor
   {
       public override void OperationImp()
       {
           Console.WriteLine("音声を出すことができる。");
       }
   }

   //具象実装グラフィックサウンド(実際の内容)
   public class ConcreteImplementor_GraphicSound :ConcreteImplementor_Graphic
   {
       public override void OperationImp()
       {
           base.OperationImp();
           Console.WriteLine("3Dサラウンド機能搭載。");
       }
   }

   /// <summary>
   /// Class1 の概要の説明です。
   /// </summary>
   class Class1
   {
       /// <summary>
       /// アプリケーションのメイン エントリ ポイントです。
       /// </summary>
       [STAThread]
       static void Main(string[] args)
       {
           //拡張機能クラスのインスタンスの抽象機能を定めます。
           //各インスタンスは、Media機能がそれぞれ実装の拡張を受けている
           //ことを確認します。

           Abstraction Radio =new RefinedAbstraction();            //ラジオを実現
           Abstraction TV   =new RefinedAbstraction();         //TVテレビを実現
           Abstraction HomeTheater =new RefinedAbstraction();  //シアターを実現

           //各オブジェクトに具象実装を実装します。
           Radio.PropImplementor   =new ConcreteImplementor_Sound();
           TV.PropImplementor      =new ConcreteImplementor_Graphic();
           HomeTheater.PropImplementor=new ConcreteImplementor_GraphicSound();

           //機能拡張されたオブジェクトの振る舞い
           Radio.Operation();
           TV.Operation();
           HomeTheater.Operation();

           //------------------------------------------------------------
           //  ポイント 機能と実装を分離する
           //
           //  実装の違いで同一な機能を行いたい場合
           //  (クラスの実装がその実行環境に依存する場合など)    その実装をクラスの
           //  機能と分離することで、それぞれの拡張を独立して行えるようになります。
           //
           //------------------------------------------------------------
       }
   }
}

bridge 実行結果

bridge_fig

UMLプラグインによる描画 Bridgeパターン

Javaソースコード Bridgeパターン

Implementor.java
   1: package bridge;
   2: 
   3: public abstract class Implementor {
   4: 
   5:     abstract void operationImp();
   6: }
Abstraction.java
   1: package bridge;
   2: 
   3: //機能の抽象化
   4: 
   5: //機能とはImplementor(実行操作)の組み合わせで
   6: //実装されます。「機能」とはあらかた予定されているものを
   7: //いいます。
   8: //今回はMedia機能を抽象化することで
   9: //モデルをまとめました。
  10: public abstract class Abstraction {
  11: 
  12:     
  13:     private Implementor implementor;
  14: 
  15:     public Implementor getImplementor() {
  16:         return implementor;
  17:     }
  18: 
  19:     public void setImplementor(Implementor implementor) {
  20:         this.implementor = implementor;
  21:     }
  22: 
  23:     //実装した機能を実行します。
  24:     //Clientはここを実行します
  25:     public void operation() {
  26:         this.getImplementor().operationImp();
  27:     }
  28: 
  29: }
ConcreteImplementor_Graphic.java
   1: package bridge;
   2: 
   3: //具象実装(グラフィック)
   4: public class ConcreteImplementor_Graphic extends Implementor {
   5: 
   6:     public void operationImp() {
   7:         System.out.println("映像を映し出すことができる。");
   8:     }
   9: 
  10: }
ConcreteImplementor_Sound.java
   1: package bridge;
   2: 
   3: //具象実装(サウンド)
   4: public class ConcreteImplementor_Sound extends Implementor {
   5: 
   6:     public void operationImp() {
   7:         System.out.println("音声を出すことが出来る");
   8:     }
   9: 
  10: }
ConcreteInplementor_GraphicSound.java
   1: package bridge;
   2: 
   3: public class ConcreteInplementor_GraphicSound extends ConcreteImplementor_Graphic {
   4:     
   5:     //overrideされます。
   6:     public void operationImp() {
   7:         super.operationImp();
   8:         System.out.println("3Dサラウンド機能搭載。");
   9:     }
  10: 
  11: }
RefinedAbstraction.java
   1: package bridge;
   2: 
   3: //具象機能
   4: //Abstractionに実行操作の実体が追加されることで
   5: public class RefinedAbstraction extends Abstraction {
   6: 
   7: }
   8: 
Client.java
   1: package bridge;
   2: 
   3: public class Client {
   4: 
   5:     public static void main(String[] args) {
   6:         //Media機能を定めます。
   7:         Abstraction absRadio         =new RefinedAbstraction();    //ラジオ
   8:         Abstraction absTV             =new RefinedAbstraction();    //テレビ
   9:         Abstraction absHomeTheater  =new RefinedAbstraction();    //シアター
  10:         //各機能を実装します。
  11:         absRadio.setImplementor(new ConcreteImplementor_Sound());
  12:         absTV.setImplementor(new ConcreteImplementor_Graphic());
  13:         absHomeTheater.setImplementor(new ConcreteInplementor_GraphicSound());
  14:         //各機能の振る舞い
  15:         absRadio.operation();
  16:         absTV.operation();
  17:         absHomeTheater.operation();
  18:     }
  19: }



コミュニティマーカーデザインパターン「ひとくちメモ」へ

コミュニティマーカーHomeへもどる

お天気情報
東京都 東京 - 今日の天気
曇り - リンク先
最高 最低
気温 - -
湿度 - -
取得日:2012/02/05 17:00:00  ST: True
東京都 東京 - 明日の天気
晴のち雨 - リンク先
最高 最低
気温 9 3
湿度 48.2 37.4
取得日:2012/02/05 17:00:00  ST: True
東京都 東京 - あさっての天気
晴時々曇 - リンク先
最高 最低
気温 11 4
湿度 51.8 39.2
取得日:2012/02/05 17:00:00  ST: True
大阪府 大阪 - 今日の天気
晴のち曇 - リンク先
最高 最低
気温 - -
湿度 - -
取得日:2012/02/05 17:00:00  ST: True
大阪府 大阪 - 明日の天気
- リンク先
最高 最低
気温 11 5
湿度 51.8 41
取得日:2012/02/05 17:00:00  ST: True
大阪府 大阪 - あさっての天気
曇時々晴 - リンク先
最高 最低
気温 7 3
湿度 44.6 37.4
取得日:2012/02/05 17:00:00  ST: True
livedoorのWebサービスより提供
【工事中】お天気配信 ユーザー登録
rarestyle
Copyright 2006 Rarestyle このページへのリンクは確認不要です。
Programming by Xenon Project Team     postmaster@rarestyle.net
免責事項について
レアスタイルサイト内検索