100 likes | 237 Views
Exercises Set 2 Design Patterns, solution. Ready. Lift floor stepin () stepout () up() down(). State stepin () stepout () up() down(). Lifting. 1. LiftingUp. LiftingDown. I will only give pseudo code below!. class Lift { int floor State currentstate ;
E N D
Ready Lift floor stepin() stepout() up() down() State stepin() stepout() up() down() Lifting 1 LiftingUp LiftingDown I will only give pseudo code below! class Lift { int floor State currentstate ; File() { currentstate = new Ready(this) ; floor=0 } stepin() { currentstate.stepin() ; } stepout() { currentstate.stepout() ; } etc } class Ready extends State { Ready (Lift g) { super(g) } stepin() { f.currentstate = new Lifting(this) } } class Lifting extends State { Lifting(Lift g) { super(g) } stepout() { f.currentstate = new Ready(this) } up() { f.currentstate = new LiftingUp(this) ; lift.floor ++ } down() { f.currentstate = new LiftingDown(this) ; lift.floor -- } } class State { Lift lift State (Lift g) { lift = g } // provide do-nothing as default behavior. // Alternatively, you can choose to throw an // exception as default. stepin() { } stepout() { } ... }
class Lift { static READY = 0 static LIFTING = 1 static LIFTINGUP = 2 static LIFTINGDOWN = 3 int floor int state File() { currentstate = new Ready(this) ; floor=0 } stepin() { if (state==READY) state=LIFTING } stepout() { if (state!=READY) state=READY } up() { if (state==LIFTING) { state=LIFTINGUP; floor++ } else if (state==LIFTINGUP) floor++ } } stepout() Ready In highest floor stepout() [else] Lifting Up up() down() [floor < MAX-1] Lifting Down Adding a new state will force us to fix Lift, in the operations op, down, and perhaps also stepout. Using the DP we only need to fix up of LiftingUp. The rest is extensional.
class ConcreteGrade { Float val ; ... // constructor isWellFormed() { return val >= 0 } calcFinal() { return val ; } } * components Grade weight isWellFormed() : bool calcFinal() : Float class CompositeGrade { List<Grade> components ; ... // constructor isWellFormed() { for (Grade g : components) { if (! g.isWellFormed()) return false } return true } calcFinal() { for (Grade g : components) { totW += g.weight ; tot += g.,weight * g.calcFinal() ; } if (totW != 1.0) throw some exception ; return tot } } CompositeGrade ConcreteGrade val : Float
Course GradingAlg calc(grade) StandardSum calc(grade) { return grade.sum() } WeigthedSum calc(grade) { return grade.weigthedFinal() } WeigthedSumWithOutoFail
Button name : String do() base <<Interface>> Iterator next() : Object hasNext() : boolean ButtonDecorator iterator() : Iterator OnOff state doOff() ButtonDecoratorIterator Delay delay … class ButtonDecoratorIterator { ButtonDecoratorptr ButtonDecorator next ButtonDecoratorIterator(ButtonDecorator target) { ptr = null ; next = target} next() { ptr = next ; next = next.base ; return ptr ; } hasNext() { return (next instanceOfButtonDecorator) } }
Toon moveForward() moveBackward() turnRight() turnLeft() equipedItem equip(item) fire() class MoveForward { MoveForward(Toon t) { toon = t } execute() { toon.moveForward() } undo() { toon.moveBackward() } } GameClient MoveForward toon <<use>> MoveBackward Command execute() undo() TurnRight class Fire { Fire (Toon t) { toon = t } execute() { toon.fire() } undo() { throw exeception … can’t undo fire } } TurnLeft Fire Equip itemToEquip previousItem class Equip { Equip (Toon t, Item i ) { itemToEquip = i ; previousItem = null } execute() { if (previousItem == null) previousItem = toon.equipedItem ; toon.equip(itemToEquip) } undo() { toon.equip(previousItem) } }
showMOB(name) { f = new MOBFactory() ; f.createMob(name).show() ; } spawn() { randomly decide Mob-type ; f = new MOBFactory() ; Mob m = f.createMob(type ); put m in the game } Game showMOB(name : String) spawn() <<use>> MOBFactory createMob(type) : MOB MOB Name : String Description : String show() run() TechnoMOBFactory <<use>> for standard MOBfac : createMob(type) { if (type.equals(RABIDDUCK)) return new RabidDuck() else if (type.equals(TIGER)) return new Tiger() else return new GiantSpider() } PrehistoryRabidDuck RabidDuck TechnoRabidDuck Tiger GiantSpider
StandardMOBAbsFactory MOBAbstractFactory createDuck(..) : RabidDuck createTiger(..) : Tiger createSpider(..) : GiantSpider TechnoMOBAbsFactory PrehistoricMOBAbsFactory MOB Name : String Description : String show() run() class StandardMOBAbsFactory extends MOBAbstractFac { createDuck(type) { return new RabidDuck() } … } PrehistoryRabidDuck RabidDuck TechnoRabidDuck class TechnoMOBAbsFactory extends MOBAbstractFac { createDuck(type) { return new TechnoDuck() } … } Tiger GiantSpider
class MonsterAdapter extends Mob { Monster monster MonsterAdapter(m) { monster = m } walk() { monster.moveForward() } // run is just mapped to moveF run() { monster.moveForward() } turn() {monster.turnRight() } // ignore the k parameter equip(item,k) { monster.equip(item) } …. } Monster itemEquiped : Item + moveForward() + moveBackward() + turnRight() + turnLeft() + equip(item) + fire() Mob - itemslot : Item[] + walk() + run() + turnR() + turnL() + equip(item,itemslot) + fire() monster MonsterAdapter MonsterAdapter(monster)