Iterator

Programming/Design Patterns 2007. 2. 21. 11:09









1 class DinerMenu{
2         public static var MAX_ITEMS = 6;
3         private var numberOfItems = 0;
4         private var menuItems:Array;
5
6         public function DinerMenu(){
7                 menuItems = new Array();
8
9                 addItem("채식주의자용 BLT", "통밀 위에(식물성) 베이컨, 상추, 토마토를 얹은 메뉴", true, 2.99);
10                 addItem("BLT", "통밀 위에 베이컨, 상추, 토마토를 얹은 메뉴", false, 2.99);
11                 addItem("오늘의 스프", "감자 샐러드를 곁들인 오늘의 스프", false, 3.29);
12                 addItem("핫도그", "사워크라우트, 갖은 양념, 양파, 치즈가 곁들여진 핫도그", false, 3.05);
13
14         }
15
16         public function addItem(name:String, description:String, vegetarian:Boolean, price:Number):Void{
17                 var menuItem:MenuItem = new MenuItem(name, description, vegetarian, price);
18                 if(numberOfItems >= MAX_ITEMS){
19                         trace("죄송합니다. 메뉴가 꽉 찼습니다. 더이상 추가할 수 없습니다.");
20                 }else{
21                         menuItems[numberOfItems] = menuItem;
22                         numberOfItems+=1;
23                 }
24         }
25         /* public function getMenuItems():Array{
26         return menuItems;
27 }*/

28         public function createIterator():Iterator{
29                 return new DinerMenuIterator(menuItems);
30         }
31
32 }

////////////////////////////////////////

 1 class DinerMenuIterator implements Iterator{
2         private var items:Array;
3         private var position:Number;
4
5         public function DinerMenuIterator(items:Array){
6                 this.items = items;
7                 this.position = 0;
8         }
9         public function next():Object{
10                 var menuItem:MenuItem = items[position];
11                 position += 1;
12                 return menuItem;
13         }
14         public function hasNext():Boolean{
15                 if(position>= items.length || items[position] == null){
16                         return false;
17                 }else{
18                         return true;
19                 }
20         }
21 }

///////////////////////////////////////////

 1 interface Iterator{
2         public function hasNext():Boolean;
3         public function next():Object;
4 }

///////////////////////////////////////////

 1 class MenuItem{
2         private var name;
3         private var description:String;
4         private var vegetarian:Boolean;
5         private var price:Number;
6
7         public function MenuItem(name:String, description:String, vegetarian:Boolean, price:Number){
8                 this.name = name;
9                 this.description = description;
10                 this.vegetarian = vegetarian;
11                 this.price = price;
12         }
13         public function getName():String{
14                 return name;
15         }
16         public function getDescription():String{
17                 return description;
18         }
19         public function getPrice():Number{
20                 return price;
21         }
22         public function isVegetarian():Boolean{
23                 return vegetarian;
24         }
25         public function toString():String{
26                 return name+" of MenuItem Object\n";
27         }
28 }

//////////////////////////////////////////

 1 class PancakeHouseMenu{
2         private var menuItems:Array;
3
4         public function PancakeHouseMenu(){
5                 menuItems = new Array();
6                 addItem("K&B 팬케이크 세트", "스크램블드 에그와 포스트가 곁들여진 팬케이크", true, 2.99);
7                 addItem("레귤러 팬케이크 세트", "달걀 후라이와 소시지가 곁들여진 팬케이크", false, 2.99);
8                 addItem("블루베리 팬케이크", "신선한 블루베리와 블루베리 시럽으로 만든 팬케이크", true, 3.49);
9                 addItem("와플", "와플, 취향에 따라 블루베리나 딸기를 얹을 수 있습니다.", true, 3,59);
10         }
11         public function addItem(name:String, description:String, vegetarian:Boolean, price:Number):Void{
12                 var menuItem:MenuItem = new MenuItem(name, description, vegetarian, price);
13                 menuItems.push(menuItem);
14         }
15         /* public function getMenuItems():Array{
16         return menuItems;
17 }*/

18         public function createIterator():Iterator{
19                 return new PancakeIterator(menuItems);
20         }
21 }

/////////////////////////////////////////////

1 class PancakeIterator implements Iterator{
2         private var items:Array;
3         private var position:Number;
4
5         public function PancakeIterator(items:Array){
6                 this.items = items;
7                 this.position = 0;
8         }
9         public function next():Object{
10                 var menuItem:MenuItem = items[position];
11                 position += 1;
12                 return menuItem;
13         }
14         public function hasNext():Boolean{
15                 if(position>= items.length || items[position] == null){
16                         return false;
17                 }else{
18                         return true;
19                 }
20         }
21 }

////////////////////////////////////////////////

 1 class Waitress{
2         private var pancakeHouseMenu:PancakeHouseMenu;
3         private var dinerMenu:DinerMenu;
4
5         public function Waitress(pancakeHouseMenu:PancakeHouseMenu, dinerMenu:DinerMenu){
6                 this.pancakeHouseMenu = pancakeHouseMenu;
7                 this.dinerMenu = dinerMenu;
8         }
9         public function printMenu():Void{
10                 var pancakeIterator:Iterator = pancakeHouseMenu.createIterator();
11                 var dinerIterator:Iterator = dinerMenu.createIterator();
12                 trace("메뉴 ----- \n 아침 메뉴");
13                 printMenuList(pancakeIterator);
14                 trace("\n점심 메뉴");
15                 printMenuList(dinerIterator);
16         }
17         private function printMenuList(iterator:Iterator):Void{
18                 while(iterator.hasNext()){
19                         var menuItem:MenuItem = MenuItem(iterator.next());
20                         trace(menuItem.getName()+", ");
21                         trace(menuItem.getPrice()+"--");
22                         trace(menuItem.getDescription());
23                 }
24
25         }
26 }

////////////////////////////////////////////

 1 class MenuTestDrive{
2         public function MenuTestDrive(){
3                 initialize();
4         }
5         private function initialize():Void{
6                 var pancakeHouseMenu:PancakeHouseMenu = new PancakeHouseMenu();
7                 var dinerMenu:DinerMenu = new DinerMenu();
8                 var waitress:Waitress = new Waitress(pancakeHouseMenu, dinerMenu);
9                 waitress.printMenu();
10         }
11 }
    

설정

트랙백

댓글

TemplateMethod

Programming/Design Patterns 2007. 2. 21. 11:09
 1 class CaffeineBeverage{
2         public function prepareRecipe():Void{
3                 boilWater();
4                 brew();
5                 pourInCup();
6                 if(hook()){
7                         addCondiments();
8                 }
9         }
10         public function brew():Void{
11
12         }
13         public function addCondiments():Void{
14
15         }
16         public function boilWater():Void{
17                 trace("물 끓이는 중");
18         }
19         public function pourInCup():Void{
20                 trace("컵에 따르는 중");
21         }
22         public function hook():Boolean{
23                 return true;
24         }
25 }

/////////////////////////////////////////////

 1 class Coffee extends CaffeineBeverage{
2         public function brew():Void{
3                 trace("필터로 커피를 우려내는 중");
4         }
5         public function addCondiments():Void{
6                 trace("설탕과 커피를 추가하는 중");
7         }
8         public function hook():Boolean{
9                 return false;
10         }
11 }

//////////////////////////////////////////////

 1 class Tea extends CaffeineBeverage{
2         public function brew():Void{
3                 trace("차를 우려내는 중");
4         }
5         public function addCondiments():Void{
6                 trace("레몬을 추가하는 중");
7         }
8 }

//////////////////////////////////////////////

 1 class TemplateTest{
2         public function TemplateTest(){
3                 init();
4         }
5         private function init():Void{
6                 var tea:CaffeineBeverage = new Tea();
7                 var coffee:CaffeineBeverage = new Coffee();
8
9                 trace("Tea Test..............");
10                 tea.prepareRecipe();
11
12                 trace("Coffee Test...........");
13                 coffee.prepareRecipe();
14         }
15 }
    

설정

트랙백

댓글

Adapter

Programming/Design Patterns 2007. 2. 21. 11:08
 1 interface Duck{
2         public function quack():Void;
3         public function fly():Void;
4 }

////////////////////////////////////

 1 class MallardDuck implements Duck{
2         public function quack():Void{
3                 trace("Quack");
4         }
5         public function fly():Void{
6                 trace("I'm flying");
7         }
8 }

/////////////////////////////////////

 1 interface Turkey{
2         public function gobble():Void;
3         public function fly():Void;
4 }

/////////////////////////////////////

class TurkeyAdapter implements Duck{
        private var turkey:Turkey;
        public function TurkeyAdapter(turkey:Turkey){
                this.turkey = turkey;
        }
        public function quack():Void{
                turkey.gobble();
        }
        public function fly():Void{
                for(var i=0;i<5;i++){
                        turkey.fly();
                }
        }
}


//////////////////////////////////////

 1 class WildTurkey implements Turkey{
2         public function gobble():Void{ 3 trace("Gobble gobble");
4         }
5         public function fly():Void{
6                 trace("I'm flying a short distance");
7         }
8 }

//////////////////////////////////////

 1 class DuckTestDrive{
2         public function DuckTestDrive(){
3                 initialize();
4         }
5         public function initialize():Void{
6                 var duck:MallardDuck = new MallardDuck();
7
8                 var turkey:WildTurkey = new WildTurkey();
9                 var turkeyAdapter:Duck = new TurkeyAdapter(turkey);
10
11                 trace("The Turkey says...");
12                 turkey.gobble();
13                 turkey.fly();
14
15                 trace("The Duck says...");
16                 testDuck(duck);
17
18                 trace("The TurkeyAdapter says...");
19                 testDuck(turkeyAdapter);
20         }
21         private function testDuck(duck:Duck):Void{
22                 duck.quack();
23                 duck.fly();
24         }
25
26 }
    

설정

트랙백

댓글

Command

Programming/Design Patterns 2007. 2. 21. 11:08
 1 interface Command{
2         public function execute();
3 }

///////////////////////////////

 1 class Light{
2         private var name:String;
3         public function Light(name:String){
4                 this.name = name;
5         }
6         public function lightOn():Void{
7                 trace(name+" : 불을 켜다");
8         }
9         public function lightOff():Void{
10                 trace(name+" : 불을 끄다");
11         }
12 }

/////////////////////////////////

 1 class LightOffCommand implements Command{
2         private var light:Light;
3
4         public function LightOffCommand(light:Light){
5                 this.light = light;
6         }
7         public function execute(){
8                 light.lightOff();
9         }
10 }

////////////////////////////////////

 1 class LightOnCommand implements Command{
2         private var light:Light;
3
4         public function LightOnCommand(light:Light){
5                 this.light = light;
6         }
7         public function execute(){
8                 light.lightOn();
9         }
10 }

/////////////////////////////////////

 1 class RemoteControl{
2         private var onCommands:Array;
3         private var offCommands:Array;
4
5         public function RemoteControl(){
6                 onCommands = new Array();
7                 offCommands = new Array();
8         }
9         public function setCommand(slot:Number, onCommand:LightOnCommand, offCommand:LightOffCommand):Void{
10                 onCommands[slot] = onCommand;
11                 offCommands[slot] = offCommand;
12         }
13         public function onButtonWasPressed(slot:Number):Void{
14                 onCommands[slot].execute();
15         }
16         public function offButtonWasPressed(slot:Number):Void{
17                 offCommands[slot].execute();
18         }
19 }

//////////////////////////////////////

 1 class RemoteControlTest
2 {
3         public function RemoteControlTest ()
4         {
5                 init ();
6         }
7         public function init () : Void
8         {
9                 var remote : RemoteControl = new RemoteControl ();
10                 var light : Light = new Light ("스텐드");
11                 var lightOn : LightOnCommand = new LightOnCommand (light);
12                 var lightOff : LightOffCommand = new LightOffCommand (light);
13                 remote.setCommand (0, lightOn, lightOff);
14                 remote.onButtonWasPressed (0);
15                 remote.offButtonWasPressed (0);
16         }
17 }

    

설정

트랙백

댓글

Singleton

Programming/Design Patterns 2007. 2. 21. 11:08
 1 class Singleton{
2         private static var uniqueInstance;
3
4         private function Singleton(){
5
6         }
7         public static function getInstance():Singleton{
8                 if(uniqueInstance == null){
9                         uniqueInstance = new Singleton();
10                 }
11                 return uniqueInstance;
12         }
13         public function getName(){
14                 trace("Singleton pattern");
15         }
16 }
    

설정

트랙백

댓글

Factory

Programming/Design Patterns 2007. 2. 21. 11:07
 1 class SimplePizzaFactory{
2         public function createPizza(type:String):Pizza{
3                 var pizza:Pizza = null;
4                 if(type == "cheese"){
5                         pizza = new CheesePizza();
6                 }else if(type == "pepperoni"){
7                         pizza = new PepperoniPizza();
8                 }else if(type == "clam"){
9                         pizza = new ClamPizza();
10                 }else if(type == "veggie"){
11                         pizza = new VeggiePizza();
12                 }
13                 return pizza;
14         }
15 }

////////////////////////////////////////

 1 class CheesePizza extends Pizza{
2         public function CheesePizza(){
3                 pizza_name = "CheesePizza";
4                 dough = "얇게";
5                 sauce = "짜게";
6         }
7
8         private function bake(){
9                 trace("Bake for 25 minutes at 350");
10         }
11         private function cut(){
12                 trace("Cutting the pizza into diagonal slices");
13         }
14         private function box(){
15                 trace("Place pizza in official PizzaStore box");
16         }
17         public function getName():String{
18                 return pizza_name;
19         }
20 }

/////////////////////////////////

 1 class VeggiePizza extends Pizza{
2         public function VeggiePizza(){
3                 pizza_name = "VeggiePizza";
4                 dough = "굵게";
5                 sauce = "달게";
6         }
7
8         private function bake(){
9                 trace("Bake for 25 minutes at 350");
10         }
11         private function cut(){
12                 trace("Cutting the pizza into diagonal slices");
13         }
14         private function box(){
15                 trace("Place pizza in official PizzaStore box");
16         }
17         public function getName():String{
18                 return pizza_name;
19         }
20 }

/////////////////////////////////////////////

 1 class ClamPizza extends Pizza{
2         public function ClamPizza(){
3                 pizza_name = "ClamPizza";
4                 dough = "굵게";
5                 sauce = "달게";
6         }
7
8         private function bake(){
9                 trace("Bake for 25 minutes at 350");
10         }
11         private function cut(){
12                 trace("Cutting the pizza into diagonal slices");
13         }
14         private function box(){
15                 trace("Place pizza in official PizzaStore box");
16         }
17         public function getName():String{
18                 return pizza_name;
19         }
20 }

//////////////////////////////////////

 1 class PepperoniPizza extends Pizza{
2         public function PepperoniPizza(){
3                 pizza_name = "PepperoniPizza";
4                 dough = "굵게";
5                 sauce = "달게";
6         }
7
8         private function bake(){
9                 trace("Bake for 25 minutes at 350");
10         }
11         private function cut(){
12                 trace("Cutting the pizza into diagonal slices");
13         }
14         private function box(){
15                 trace("Place pizza in official PizzaStore box");
16         }
17         public function getName():String{
18                 return pizza_name;
19         }
20 }

/////////////////////////////////////////

 1 class Pizza{
2         private var pizza_name:String;
3         private var dough:String;
4         private var sauce:String;
5         private var ary:Array = new Array();
6
7         public function prepare(){
8                 trace("피자이름 : "+pizza_name);
9
10         }
11         public function bake(){
12                 trace("Bake for 25 minutes at 350");
13         }
14         public function cut(){
15                 trace("Cutting the pizza into diagonal slices");
16         }
17         public function box(){
18                 trace("Place pizza in official PizzaStore box");
19         }
20         public function getName():String{
21                 return pizza_name;
22         }
23
24 }

///////////////////////////////////////

 1 class PizzaStore{
2         private var factory:SimplePizzaFactory;
3         public function PizzaStore(factory:SimplePizzaFactory){
4                 this.factory = factory;
5         }
6         public function orderPizza(type:String):Pizza{
7                 var pizza:Pizza; 8 pizza = factory.createPizza(type);
9                 pizza.prepare();
10                 // pizza.bake();
11                 // pizza.cut();
12                 // pizza.box();
13                 return pizza;
14         }
15 }

////////////////////////////////////////
var myPizzaStore:PizzaStore = new PizzaStore(new SimplePizzaFactory());
myPizzaStore.orderPizza("cheese");
myPizzaStore.orderPizza("pepperoni");
myPizzaStore.orderPizza("clam");
myPizzaStore.orderPizza("veggie");


    

설정

트랙백

댓글

Decorator

Programming/Design Patterns 2007. 2. 21. 11:07
 1 class Beverage{
2         private var descriptions:String = "제목없음";
3         public function getDescription():String{
4                 return descriptions;
5         }
6         public function cost():Number{
7                 return 0;
8         }
9 }

////////////////////////////////////

 1 class CondimentDecorator extends Beverage{
2         public function getDepscription(){
3
4         }
5 }

////////////////////////////////////

 1 class DarkRoast extends Beverage{
2         public function DarkRoast(){
3                 descriptions = "다트로스트 커피";
4         }
5         public function cost():Number{
6                 return 2.89;
7         }
8 }

/////////////////////////////////////

 1 class Espresso extends Beverage{
2         public function Espresso(){
3                 descriptions = "에스프레소";
4         }
5         public function cost():Number{
6                 return 1.99;
7         }
8 }

//////////////////////////////////////

 1 class HouseBlend extends Beverage{
2         public function HouseBlend(){
3                 descriptions = "하우스 브렌드 커피";
4         }
5         public function cost():Number{
6                 return .89;
7         }
8 }

//////////////////////////////////////

 1 class Mocha extends CondimentDecorator{
2         private var beverage:Beverage;
3         public function Mocha(beverage:Beverage){
4                 this.beverage = beverage;
5         }
6         public function getDescription():String{
7                 return beverage.getDescription()+", 모카";
8         }
9         public function cost():Number{
10                 return .20+beverage.cost();
11         }
12 }

///////////////////////////////////////

 1 class Whip extends Beverage{
2         private var beverage:Beverage;
3         public function Whip(beverage:Beverage){
4                 this.beverage = beverage; 5 } 6 public function getDescription():String{
7                 return beverage.getDescription()+", 휘핑";
8         }
9         public function cost():Number{
10                 return .20+beverage.cost();
11         }
12 }

///////////////////////////////////////

 1 class Main{
2         public function Main(){
3                 init();
4         }
5         private function init(){
6                 var beverage:Beverage = new Espresso();
7                 trace(beverage.getDescription()+" $"+beverage.cost());
8
9                 var beverage2:Beverage = new DarkRoast();
10                 beverage2 = new Mocha(beverage2);
11                 beverage2 = new Mocha(beverage2);
12                 beverage2 = new Whip(beverage2);
13                 trace(beverage2.getDescription()+" $"+beverage2.cost());
14
15                 var beverage3:Beverage = new HouseBlend();
16                 beverage3 = new Mocha(beverage3);
17                 beverage3 = new Whip(beverage3);
18                 trace(beverage3.getDescription()+" $"+beverage3.cost());
19
20         }
21 }
    

설정

트랙백

댓글

Observer

Programming/Design Patterns 2007. 2. 21. 11:06
 1 class CurrentConditionsDisplay implements Observer, DisplayElement{
2         private var temperature:Number;
3         private var humidity:Number;
4         private var pressure:Number;
5         private var weatherData:Subject;
6
7         public function CurrentConditionsDisplay(weatherData:Subject){
8                 this.weatherData = weatherData;
9                 weatherData.registerObserver(this);
10         }
11         public function update(temperature:Number, humidity:Number, pressure:Number):Void{
12                 this.temperature = temperature;
13                 this.humidity = humidity;
14                 this.pressure = pressure;
15                 display();
16         }
17         public function display():Void{
18                 trace("Temperature: "+temperature);
19                 trace("Humidity: "+humidity);
20                 trace("Pressure: "+pressure);
21                 trace("----------------------");
22         }
23 }

////////////////////////////////////////////////////////////////

 1 interface DisplayElement{
2         public function display():Void;
3 }

////////////////////////////////////////////////////////////////

 1 interface Observer{
2         public function update(temp:Number, humidity:Number, pressure:Number):Void;
3 }

///////////////////////////////////////////////////////////////
 1 interface Subject{
2         public function registerObserver(o:Observer):Void;
3         public function removeObserver(o:Observer):Void;
4         public function notifyObserver():Void;
5 }

///////////////////////////////////////////////////////////////

 1 class WeatherData implements Subject{
2         private var observers:Array;
3         private var temperature:Number;
4         private var humidity:Number;
5         private var pressure:Number;
6
7         public function WeatherData(){
8                 observers = new Array();
9         }
10         public function registerObserver(o:Observer):Void{
11                 observers.push(o);
12         }
13         public function removeObserver(o:Observer):Void{
14                 var lastIndex:Number = observers.length;
15                 for(var i=0;i<lastIndex;i++){
16                         if(observers[i] == o){
17                                 observers.splice(i,1);
18                         }
19                 }
20         }
21         public function notifyObserver():Void{
22                 var lastIndex:Number = observers.length;
23                 for(var i=0;i< lastIndex;i++){
24                         var observer:Observer = Observer(observers[i]);
25                         observer.update(temperature, humidity, pressure);
26                 }
27         }
28         public function measurementsChanged():Void{
29                 notifyObserver();
30         }
31         public function setMeasurements(temperature:Number, humidity:Number, pressure:Number):Void{
32                 this.temperature = temperature;
33                 this.humidity = humidity;
34                 this.pressure = pressure;
35                 measurementsChanged();
36         }
37 }

//////////////////////////////////////////////////////////////

 1 class WeatherStation{
2         public function WeatherStation(){
3                 var weatherData:WeatherData = new WeatherData();
4                 var weatherData2:WeatherData = new WeatherData();
5                 var currentDisplay:CurrentConditionsDisplay = new CurrentConditionsDisplay(weatherData);
6                 var currentDisplay:CurrentConditionsDisplay = new CurrentConditionsDisplay(weatherData2);
7                 weatherData.setMeasurements(80,30,23);
8                 weatherData2.setMeasurements(11,22,33);
9                 weatherData.setMeasurements(22,30,23);
10
11         }
12 }

///////////////////////////////////////////////////////////////////


    

설정

트랙백

댓글

StrategyPattern

Programming/Design Patterns 2007. 2. 21. 11:06
class Duck{
        public var flyBehavior:FlyBehavior;
        public var quackBehavior:QuackBehavior;

        public function Duck(){

        }
        public function swim():Void{

        }
        public function display():Void{

        }
        public function performQuack():Void{
                quackBehavior.quack();
        }
        public function performFly():Void{
                flyBehavior.fly();
        }
        public function setFlyBehavior(fb:FlyBehavior):Void{
                flyBehavior = fb;
        }
        public function setQuackBehavior(qb:QuackBehavior):Void{
                quackBehavior = qb;
        }
}

////////////////////////////////////////////////

interface FlyBehavior{
        public function fly():Void;
}
////////////////////////////////////////////////
class FlyNoWay implements FlyBehavior{
        public function fly():Void{
                trace("저 안 날아요");
        }
}
////////////////////////////////////////////////
class FlyWithWings implements FlyBehavior{
        public function fly():Void{
                trace("저 날아요");
        }
}
////////////////////////////////////////////////
class ModelDuck extends Duck{
        public function ModelDuck(){
                flyBehavior = new FlyNoWay();
                quackBehavior = new MuteQuack();
        }
        private function display():Void{
                trace("가짜 오리입니다");
        }
}
////////////////////////////////////////////////
class MuteQuack implements QuackBehavior{
        public function quack():Void{
                trace("나 벙어리");
        }
}
///////////////////////////////////////////////
class Quack implements QuackBehavior{
        public function quack():Void{
                trace("꽥꽥");
        }
}
/////////////////////////////////////////////////
interface QuackBehavior{
        public function quack():Void;
}
/////////////////////////////////////////////////
class Squack implements QuackBehavior{
        public function quack():Void{
                trace("삑삑");
        }
}
/////////////////////////////////////////////////
class Main{
        private var myDuck:Duck;
        public function Main(){
                myDuck = new ModelDuck();
                init();
        }
        private function init():Void{
                myDuck.display();
                myDuck.performFly();
                myDuck.performQuack();
                myDuck.setFlyBehavior(new FlyWithWings());
                myDuck.performFly();

        }
}
/////////////////////////////////////////////////
    

설정

트랙백

댓글