8. FrontendImpl используем только вместе с оператором new!
Frontend frontend = new FrontendImpl(…);
Во всех классах и методах используем только интерфейс Frontend
Аналогично для всех классов и интерфейсов
Если какая-то функция из Impl должны быть вызвана «снаружи»
объявляйте ее в интерфейсе
9. Переименовываем Frontend в FrontendImpl
Создаем пустой интерфейс Frontend
FrontendImpl implements Frontend
Компилируем, видим что ничего не изменилось
Меняем везде (кроме new) FrontendImpl на Frontend
Компилляция не проходит
Добавляем в Frontend все нужные обявления методов
27. final private Map<Integer, GameSession> userToSessions =
new HashMap<Integer, GameSession>();
public void run(){
while(true){
processMessages();
doGMStep();
replicateGamesToFrontend();
TimeHelper.sleep(SLEEP_TIME);
}
}
processMessages() – обработка сообщений от Frontend (команды пользователей)
doGMStep() – расчет изменений не связанных с текущими командами пользователей
replicateGamesToFrontend() – отправка на Frontend изменений User Session
38. 18. Распределение классов по пакетам.
Циклические зависимости между пакетами
19. Архитектура игрового сервера. Схема зависимостей модулей
20. Процесс работы игрового сервера, репликация
44. class UnitImpl … {
private Weapon weapon = new WeaponImpl(); //default value
private Armor armor = new ArmorImpl (); //default value
private Gear gear = new GearImpl (); //default value
void setWeapon(Weapon weapon){…}
void setArmor(Armor armor){…}
void setGear(Gear gear){…}
}
abstract class UnitBuilder {
protected UnitImpl unit;
public Unit getUnit(){return unit;}
public createUnit(){ this.unit = new UnitImpl(); }
public abstract assembleWeapon();
public abstract assembleArmor();
public abstract assembleGear();
}
45. class T3485Builder extends UnitBuilder {
public void assembleWeapon() {this.unit.setWeapon(new D5T85BM());}
public void assembleArmor() {this.unit.setWeapon(new A45());}
public void assembleGear() {this.unit.setWeapon(new T348560());}
}
class TigerPzKpfwVIBuilder extends UnitBuilder {
public void assembleWeapon() {this.unit.setWeapon(new KwK105cm42L28());}
public void assembleArmor() {this.unit.setWeapon(new A45());}
public void assembleGear() {this.unit.setWeapon(new T348560());}
}
46. class UnitFactory {
private UnitBuilder unitBuilder;
public void setBuilder(UnitBuilder currentBuilder){this.unitBuilder = currentBuilder;}
public Unit getUnit(){return unitBuilder.getUnit();}
public void constructUnit(){
unitBuilder.createUnit();
unitBuilder. assembleWeapon();
unitBuilder. assembleArmor();
unitBuilder. assembleGear();
}
}
49. class Weapon implements UnitPart{
…
void accept(DamageVisitor visitor){
visitor.visit(this);
}
…
}
class UnitImpl {
private UnitPart[] parts;
public void accept(DamageVisitor visitor){
for(UnitPart part : parts){
part.accept(visitor);
}
}
}
50. class FireDamage implements DamageVisitor{
public void visit(Weapon weapon){…}
public void visit(Armor armor){…}
public void visit(Gear gear){…)
}
class EMPDamage implements DamageVisitor{
public void visit(Weapon weapon){…}
public void visit(Armor armor){…}
public void visit(Gear gear){…)
}
class ProjectileDamage implements DamageVisitor{
public void visit(Weapon weapon){…}
public void visit(Armor armor){…}
public void visit(Gear gear){…)
}