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的修改省事多了。