2011-02-03 11 views
1

開発中のプロジェクトでは、同じエンティティクラスの軽量で重量のあるオブジェクトが必要です。私たちは単純な解決策を持っていますが、専門家の視点からより良い解決策があるかどうかを知る必要があります。私たちのソリューションは以下の通りです:同じオブジェクトの重量と軽量バージョン

public interface User{ 

//Some variables and methods 

} 

public class LightWeightUser implements User{ 

//Lightweight code goes here 

} 

public class HeavyWeightUser implements User{ 

//HeavyWeight code goes here 

} 

私たちはデータベースハンドリングのためにhibernateを使う予定です。

public class User { 
    //Light-weight code goes here. 
} 

public class HeavyWeightUser extends User { 
    // Heavy-weight code goes here. 
} 
+0

遅延読み込みを実装するのに適したソリューションではありませんか?その提案はありますが、ほとんどの場合、遅延ロードが機能します。オプションのパラメータにlazy loadedとマークを付けてください。 –

答えて

2

は、ここに1つの可能な選択肢です。

public class HeavyWeightUser { 
//HeavyWeightUser properties here 
//.... 
private User user; 
//exposing user properties here 
public Something getUserProperty(){return something;} 
public void serUserProperty(Something something){this.user.setSomething(something);} 
} 

これは、のような利点があります:あなたは、このオプションジェットを使用していませんでしため

  • あなたはSENCE
  • あなたのオブジェクトを作るだけのプロパティを公開することができ、フォームの親クラスを継承するのは自由です

    1. 継承のように密接に結びついているわけではありません。これは通常、実装をより簡単に変更できることを意味します。

    短所:あなたはあなたのコードが簡単にアップグレードする必要があります非機能要件を持っている場合

    1. もっとコーディング
  • 1

    委任を使用することであろう考慮すべきもう一つのaproachは、相続のinsted:

    1

    私は、このためDecoratorパターンを使用します。これは、次のようになります。

    //first define a basic layout for your class 
    public abstract class User{ 
         public abstract String foo(String bar); 
    } 
    
    //then extend it and implement real behavior 
    public class concreteUser extends User { 
        public String foo(String bar) { 
         ... 
        } 
    } 
    
    //now comes the interesting part... the decorator. At first we need to define a layout for our decorators, that extends your implementation 
    public abstract class UserDecorator extends User { 
        @Override 
        public abstract String foo(String bar); 
    } 
    
    //now you are ready to do everything you want 
    

    あなたが今、あなたのクラスに可能なあらゆる方法でヘビー級と軽量な行動を「飾る」を開始することができます。この3つのクラスで。例を持っているとデコレータを作成することができます:

    public class AsdfUserDecorator extends UserDecorator { 
        private final User user; 
    
        public AsdfUserDecorator(User user) { 
         this.user = user; 
        } 
    
        @Override 
        public String foo(String bar) { 
         //do stuff 
         ... 
         //propagate everything to other decorators (this is the magic) 
         return foo(user.foo(bar)); 
        } 
    
        private String additionalHeavyweightStuff(String asdasd) { 
         return blubb; 
        } 
    } 
    
    //and another one 
    public class QwerUserDecorator extends UserDecorator { 
        //no changes in the class in this example... its the same as AsdfUserDecorator.... 
        private final User user; 
    
        public AsdfUserDecorator(User user) { 
         this.user = user; 
        } 
    
        @Override 
        public String foo(String bar) { 
         //do stuff 
         ... 
         //propagate everything to other decorators (this is the magic) 
         return foo(user.foo(bar)); 
        } 
    
        private String additionalHeavyweightStuff(String asdasd) { 
         return blubb; 
        } 
    } 
    

    今、あなたは、次のコードを持つユーザー飾ることができます。これは本当に強力なパターンである

    public static void main(String args[]) { 
        User user = new concreteUser(); 
        user = new AsdfUserDecorator(user); 
        user = new QwerUserDecorator(user); 
        user.foo("sadf"); 
    } 
    

    を、私はあなたを助けることができる願っています。

    よろしくお願いいたします。