Тяжелый и легкий вариант одного и того же объекта - PullRequest
1 голос
/ 03 февраля 2011

Для проекта, который мы разрабатываем, нам нужен легкий и тяжелый объект того же класса сущности.У нас есть простое решение, но мы должны знать, есть ли лучшие решения с точки зрения экспертов.Наше решение заключается в следующем:

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 для обработки части базы данных.

Ответы [ 3 ]

2 голосов
/ 03 февраля 2011

Вот одна из возможных альтернатив:

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

public class HeavyWeightUser extends User {
    // Heavy-weight code goes here.
}
1 голос
/ 03 февраля 2011

Я бы использовал для этого шаблон декоратора, если у вас есть нефункциональное требование, чтобы ваш код легко обновлялся. Это выглядело бы следующим образом:

//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");
}

Это действительно мощная модель, я надеюсь, что смогу вам помочь.

Хорошего дня.

1 голос
/ 03 февраля 2011

Другим подходом, который следует рассмотреть, будет использование делегирования наследования.

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);}
}

Это имеет такие преимущества, как:

  1. вы можете наследовать родительский класс формы, потому что вы не использовали эту опцию jet
  2. Вы можете выставить только те свойства, которые имеют смысл
  3. ваш объект не так тесно связан с наследованием, что обычно означает, что вы можете изменить свою реализацию с большей легкостью.

Недостатки:

  1. Больше кодирования
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...