就很抽象,加上这么多条条框框,两个字,“郁闷”。我们不妨从分析GP代码入手效果很 很不错,我学习过程中就是这样的。要不我们现在就看看一个例子。以行为型模式State为 例。(模式的实现例子网络上有很多。Java的实现也很多,比如,Together ControlCent er里面就内置了这种基于GP的编程模板,详细内容大家用用就知道了。) 大家知道,State的用意在于,允许一个对象在其内部状态改变时改变它的行为。对象 看起来似乎修改了他的类。我们先看http://www.javacoder.net/patterns.jsp 上提供的 GOF SOFTWARE DESIGN PATTERNS CATALOGUE的State模式源码实现。 首先看接口类,State.java public interface State { public void handle(); } 以定义接口以封装与Conext(代码稍候陈述!)的一个特定状态相关的行为。 然后看,接口的实现类。第一个,ConcreteState1.java public class ConcreteState1 implements State { public void handle() { System.out.println("ConcreteState1.handle() executing"); } } 第二个,ConcreteState2.java public class ConcreteState2 implements State { public void handle() { System.out.println("ConcreteState2.handle() executing");
} } 这两个类实现了State接口。 然后再看,Context.java是如何将上述三个.java文件联系起来。 public class Context { public static final int STATE_ONE = 0; public static final int STATE_TWO = 1; //大家注意,这句话很关键,该模式做手脚的地方! private State currentState = new ConcreteState1(); public void request() { currentState.handle(); } public void changeState(int state) { switch (state) { case STATE_ONE: currentState = new ConcreteState1();//关键点 break; case STATE_TWO: currentState = new ConcreteState2();//关键点 break; } }
} 这样,写好4个.java文件后,其实您已经实现了State设计模式,很有趣,对吧?就是这样 简单。 再看看如何使用该设计模式了。写一个Client.java看看。 public class Client { public static void main(String[] args) { // 构造Context Context ctx = new Context(); // 唤起Context.request() ctx.request(); // 改变ctx的状态?为什么改变了呢?大家想想看。 ctx.changeState(Context.STATE_TWO); // 再次唤起Context.request(),结果大不一样。 ctx.request(); } } 是不是您也想试试呢?要不自己动手运行一下看看就知道了。 大家分析完成后,就知道了State模式是如何巧妙的实现了”移花接木”,或者说狸猫换太 子,等等都可以了。 到了这一步,对这个模式的分析还没有结束,您最好回到教科书,再看一遍,如果现在你 看这个模式还有问题,我想我写得很失败! 复杂问题简单化!!!!!