读书人

javase形式2

发布时间: 2012-10-26 10:30:59 作者: rapoo

javase模式2

六:命令模式

适用的情况:一个调用者,可以调用好多不同类型的物件的命令,那么把这么多的物件的定义成一个统一的接口,这个接口有一个统一的执行方法。

public interface Command {?public void execute();}

?子类:

public class LightOnCommand implements Command {?Light light;? ?public LightOnCommand(Light light) {??this.light = light;?}??public void execute() {??light.on();?}}

?

public class LightOffCommand implements Command {Light light; public LightOffCommand(Light light) {this.light = light;} public void execute() {light.off();}}

?

具体类:

public class Light {public Light() {}public void on() {System.out.println("Light is on");}public void off() {System.out.println("Light is off");}}

?

控制类:

public class SimpleRemoteControl {Command slot; public SimpleRemoteControl() {} public void setCommand(Command command) {slot = command;} public void buttonWasPressed() {slot.execute();}}

?

测试类:

public class RemoteControlTest {public static void main(String[] args) {SimpleRemoteControl remote = new SimpleRemoteControl();Light light = new Light();LightOnCommand lightOn = new LightOnCommand(light); remote.setCommand(lightOn);remote.buttonWasPressed();    }}

?

关键是每个动作都是以个动作类。(*^.^*)

七。适配器模式:

?? 当你的代码是旧的代码,而用户使用的是新的接口,你的代码提供的接口不符合用户的接口,可以使用适配器模式,

? 适配器模式有两种,

一种是对象适配器,一种是类适配器(通过多重继承可以是实现,但java不允许多重继承)。

?? 对象适配器:

?????????????? 用户接口? -------------》接口

??????????????????????????????????有一个??????? ^

??????????????????????????????????????????????????? |

??????????????????????????????????????????????? 适配器-----》有一个? 你的接口

?

这样在适配器种的方法就可以用你的具体类来实现了。

类适配器就是 适配器既实现用户的接口,又实现你的接口。这样用户就可以使用了。

??????? 外观模式:

????把很多类变量放到一个接口中,当使用一个方法时,会调用很多的类变量,这样 就把复杂的业务封装到一个系统中只提供给用户已个使用方法。

public class prarent{     var1;     var2;     var3; public void method(){     var1.domethod();     var2.domethod();    var3.domethod();}}

?这样把复杂的业务就封装到了方法中,外部的用户看不到。

?????和适配器模式不一样,适配器要实现别的接口,要有被实现接口的实例,而外观则只是把复杂的子系统封装在,一个接口中,一个方法调用 实现中会有子的来实现。

八.??模板方法--封装算法。

  public  class parent{             public final do()           {                  do1();                 do2();                do3();                  do4();             if(getAddDo5())//钩子            {                   do5();            }           }     public do1(){  println("in do 1");}       public do2(){  println("in do 2");}      public  abstract do3();      public do4(){println("in do 4");}            public boolean getAddDo5()    {         return true;     }}    

?子类:

public child extends parent{      public void do3()      {          println("in do3 ");        }        public boolean getaddDo5()//覆盖父类的钩子方法      {             //根据获取用户输入来返回            true                       false;       }}
Arrays的 public static void sort(Object[] a) {//模板方法,虽然不是很正统 但是排序也是由传入的数组的compareTo实现的        Object[] aux = (Object[])a.clone();        mergeSort(aux, a, 0, a.length, 0);    }            以及IFrame extends JFrame{    中的paint()方法}    

?????八。迭代器:

???? 继承自一个iterator 接口,

???? 女招待,有个菜单接口,可以传入不同菜单实现,每个菜单有一个创建迭代器的接口,可以创建迭代器,最后菜单传入的时候最好是以个集合,这样可以执行中传入菜单。

?

?

??????????????????????????????????????????????菜单接口<?------------ 女招待------------>? interface?? Iterator

???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ^

???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? |

???????????????????????????????????????????????????^ ^??????????????????????????????????????????????????????????????????????? |

??????????????????????????????????????????????????? |? \???????????????????????????????????????????????????????????????????????? |

????????????????????????????????????????????????????|???? \????????????????????????????????????????????????????????????????????? |

????????????????????????????????????????????????????|????? \???????????????????????????????????????????????????????????????????? |

??????????????????????????????????????????????????? 菜单1?\??????????????????????????????????????????????????????????????????? |

?????????????????????????????????????????????????????????????菜单2???????????????????????????????????????????????????????????? |

????????????????????????????????????????????????????????? |?????????????????????????????????????????????????????????????????????? |

????????????????????????????????????????????????????????? |

?????????????????????????????????????????????????????????? ————————>?createIterator---------------? 不同的Iterator 实现

?

?

当菜单中子菜单又有子菜单的时候这个时候这个就不适合了,要用树的概念来完成这个。整体是一个组合,包含组件,组件又分组合和叶子,这时候组件接口中有他们的功用方法

public abstract class MenuComponent {   public void add(MenuComponent menuComponent) {throw new UnsupportedOperationException();}public void remove(MenuComponent menuComponent) {throw new UnsupportedOperationException();}public MenuComponent getChild(int i) {throw new UnsupportedOperationException();}  public String getName() {throw new UnsupportedOperationException();}public String getDescription() {throw new UnsupportedOperationException();}public double getPrice() {throw new UnsupportedOperationException();}public boolean isVegetarian() {throw new UnsupportedOperationException();}public abstract Iterator createIterator(); public void print() {throw new UnsupportedOperationException();}}

?

菜单为:

import java.util.Iterator;import java.util.ArrayList;public class Menu extends MenuComponent { ArrayList menuComponents = new ArrayList();String name;String description;  public Menu(String name, String description) {this.name = name;this.description = description;} public void add(MenuComponent menuComponent) {menuComponents.add(menuComponent);} public void remove(MenuComponent menuComponent) {menuComponents.remove(menuComponent);} public MenuComponent getChild(int i) {return (MenuComponent)menuComponents.get(i);} public String getName() {return name;} public String getDescription() {return description;}  public Iterator createIterator() {return new CompositeIterator(menuComponents.iterator());}  public void print() {System.out.print("\n" + getName());System.out.println(", " + getDescription());System.out.println("---------------------");  Iterator iterator = menuComponents.iterator();while (iterator.hasNext()) {MenuComponent menuComponent = (MenuComponent)iterator.next();menuComponent.print();}}}

?叶子节点为:

import java.util.Iterator;import java.util.ArrayList;public class MenuItem extends MenuComponent { String name;String description;boolean vegetarian;double price;    public MenuItem(String name,                 String description,                 boolean vegetarian,                 double price) { this.name = name;this.description = description;this.vegetarian = vegetarian;this.price = price;}  public String getName() {return name;}  public String getDescription() {return description;}  public double getPrice() {return price;}  public boolean isVegetarian() {return vegetarian;}public Iterator createIterator() {return new NullIterator();} public void print() {System.out.print("  " + getName());if (isVegetarian()) {System.out.print("(v)");}System.out.println(", " + getPrice());System.out.println("     -- " + getDescription());}//vv MenuItemCompositeV2Main}

?

这样就实现了,获得一个总的菜单组合可以直接调用print()方法打印出来它所有的子菜单。

如果要想获得外部迭代的功能,如侍者打印所有的素食菜单。主要是在组件上加上createIterator()方法。

?九。状态模式:

?一个物件有很多种状态,对于每种状态的不同操作,会有不同的反应。这样把状态设计成类,都继承自已个状态接口,若想在状态类中操作物体的方法,则可以把物体传入,在物体类中分别有不同的状态,还有一个当前状态,这样对物体的操作变成对当前状态的操作,又委托给状态类来操作。

主部件:

public class GumballMachine { State soldOutState;State noQuarterState;State hasQuarterState;State soldState; State state = soldOutState;int count = 0; public GumballMachine(int numberGumballs) {soldOutState = new SoldOutState(this);noQuarterState = new NoQuarterState(this);hasQuarterState = new HasQuarterState(this);soldState = new SoldState(this);this.count = numberGumballs; if (numberGumballs > 0) {state = noQuarterState;} } public void insertQuarter() {state.insertQuarter();} public void ejectQuarter() {state.ejectQuarter();} public void turnCrank() {state.turnCrank();state.dispense();}void setState(State state) {this.state = state;} void releaseBall() {System.out.println("A gumball comes rolling out the slot...");if (count != 0) {count = count - 1;}} int getCount() {return count;} void refill(int count) {this.count = count;state = noQuarterState;}    public State getState() {        return state;    }    public State getSoldOutState() {        return soldOutState;    }    public State getNoQuarterState() {        return noQuarterState;    }    public State getHasQuarterState() {        return hasQuarterState;    }    public State getSoldState() {        return soldState;    } public String toString() {StringBuffer result = new StringBuffer();result.append("\nMighty Gumball, Inc.");result.append("\nJava-enabled Standing Gumball Model #2004");result.append("\nInventory: " + count + " gumball");if (count != 1) {result.append("s");}result.append("\n");result.append("Machine is " + state + "\n");return result.toString();}}

?状态接口:

public interface State { public void insertQuarter();public void ejectQuarter();public void turnCrank();public void dispense();}

?

其中的有币状态:

import java.util.Random;public class HasQuarterState implements State {Random randomWinner = new Random(System.currentTimeMillis());GumballMachine gumballMachine; public HasQuarterState(GumballMachine gumballMachine) {this.gumballMachine = gumballMachine;}  public void insertQuarter() {System.out.println("You can't insert another quarter");} public void ejectQuarter() {System.out.println("Quarter returned");gumballMachine.setState(gumballMachine.getNoQuarterState());} public void turnCrank() {System.out.println("You turned...");int winner = randomWinner.nextInt(10);if ((winner == 0) && (gumballMachine.getCount() > 1)) {gumballMachine.setState(gumballMachine.getWinnerState());} else {gumballMachine.setState(gumballMachine.getSoldState());}}    public void dispense() {        System.out.println("No gumball dispensed");    } public String toString() {return "waiting for turn of crank";}}

?winer状态以及普通的只出来一个状态:

public class SoldState implements State {    GumballMachine gumballMachine;     public SoldState(GumballMachine gumballMachine) {        this.gumballMachine = gumballMachine;    }       public void insertQuarter() {System.out.println("Please wait, we're already giving you a gumball");} public void ejectQuarter() {System.out.println("Sorry, you already turned the crank");} public void turnCrank() {System.out.println("Turning twice doesn't get you another gumball!");} public void dispense() {gumballMachine.releaseBall();if (gumballMachine.getCount() > 0) {gumballMachine.setState(gumballMachine.getNoQuarterState());} else {System.out.println("Oops, out of gumballs!");gumballMachine.setState(gumballMachine.getSoldOutState());}} public String toString() {return "dispensing a gumball";}} ////////////////////////public class WinnerState implements State {    GumballMachine gumballMachine;     public WinnerState(GumballMachine gumballMachine) {        this.gumballMachine = gumballMachine;    } public void insertQuarter() {System.out.println("Please wait, we're already giving you a Gumball");} public void ejectQuarter() {System.out.println("Please wait, we're already giving you a Gumball");} public void turnCrank() {System.out.println("Turning again doesn't get you another gumball!");} public void dispense() {System.out.println("YOU'RE A WINNER! You get two gumballs for your quarter");gumballMachine.releaseBall();if (gumballMachine.getCount() == 0) {gumballMachine.setState(gumballMachine.getSoldOutState());} else {gumballMachine.releaseBall();if (gumballMachine.getCount() > 0) {gumballMachine.setState(gumballMachine.getNoQuarterState());} else {            System.out.println("Oops, out of gumballs!");gumballMachine.setState(gumballMachine.getSoldOutState());}}} public String toString() {return "despensing two gumballs for your quarter, because YOU'RE A WINNER!";}}

?其中的winer状态是后面添加的这样比if--else的修改省事多了。

读书人网 >软件架构设计

热点推荐