java设计模式,本人贴上自己写的各种模式的实现代码来讲解;希望大家能学到。
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>BY--<wbr> 何泽江(凯捷国际)</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
创建模式
1.工厂方法模式(Factory Method) <wbr>将程序中创建对象的操作,单独出来处理,创建一个产品的工厂接口,把实际的工作转移到具体的子类。大大提高了系统扩展的柔性,接口的抽象化处理给相互依赖的对象创建提供了最好的抽象模式。</wbr>
- public<wbr></wbr>class<wbr>TestFactoryMethod<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>static<wbr></wbr>void<wbr>main(String[]<wbr>args)<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- AnimalFactory<wbr>af=</wbr>new<wbr>DogFactory();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Animal1<wbr>a=af.getAnimal();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- abstract<wbr></wbr>class<wbr>Animal1{}<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- class<wbr>Dog1<wbr></wbr></wbr>extends<wbr>Animal1{}<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- class<wbr>Cat1<wbr></wbr></wbr>extends<wbr>Animal1{}<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- abstract<wbr></wbr>class<wbr>AnimalFactory{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>abstract<wbr>Animal1<wbr>getAnimal();<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- class<wbr>DogFactory<wbr></wbr></wbr>extends<wbr>AnimalFactory{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr>Animal1<wbr>getAnimal(){<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- System.out.println("Dog");<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- return<wbr></wbr>new<wbr>Dog1();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- class<wbr>CatFactory<wbr></wbr></wbr>extends<wbr>AnimalFactory{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr>Animal1<wbr>getAnimal(){<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- System.out.println("Cat");<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- return<wbr></wbr>new<wbr>Cat1();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr><wbr></wbr></wbr></wbr>
public class TestFactoryMethod { public static void main(String[] args) { AnimalFactory af=new DogFactory(); Animal1 a=af.getAnimal(); } } abstract class Animal1{} class Dog1 extends Animal1{} class Cat1 extends Animal1{} abstract class AnimalFactory{ public abstract Animal1 getAnimal(); } class DogFactory extends AnimalFactory{ public Animal1 getAnimal(){ System.out.println("Dog"); return new Dog1(); } } class CatFactory extends AnimalFactory{ public Animal1 getAnimal(){ System.out.println("Cat"); return new Cat1(); } }
<wbr></wbr>
2.抽象工厂模式(Abstract Factory) 针对多个产品等级的情况,而工厂方法模式针对单一产品等级的情况。- import<wbr>java.awt.*;<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- import<wbr>javax.swing.*;<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- import<wbr>java.awt.event.*;<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>class<wbr>TestAbstractFactory<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>static<wbr></wbr>void<wbr>main(String[]<wbr>args)<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- GUIFactory<wbr>fact=</wbr>new<wbr>SwingFactory();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Frame<wbr>f=fact.getFrame();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Component<wbr>c1=fact.getButton();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Component<wbr>c2=fact.getTextField();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- f.setSize(500,300);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- f.setLayout(new<wbr>FlowLayout());<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- f.add(c1);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- f.add(c2);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- f.setVisible(true);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- f.addWindowListener(new<wbr>WindowAdapter(){<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>void<wbr>windowClosing(WindowEvent<wbr>e){<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- System.exit(0);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- });<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- abstract<wbr></wbr>class<wbr>GUIFactory{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>abstract<wbr>Component<wbr>getButton();<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>abstract<wbr>Component<wbr>getTextField();<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>abstract<wbr>Frame<wbr>getFrame();<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- class<wbr>AWTFactory<wbr></wbr></wbr>extends<wbr>GUIFactory{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr>Component<wbr>getButton()<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- return<wbr></wbr>new<wbr>Button(</wbr>"AWT<wbr>Button"</wbr>);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr>Frame<wbr>getFrame()<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- return<wbr></wbr>new<wbr>Frame(</wbr>"AWT<wbr>Frame"</wbr>);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr>Component<wbr>getTextField()<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- return<wbr></wbr>new<wbr>TextField(</wbr>20);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- class<wbr>SwingFactory<wbr></wbr></wbr>extends<wbr>GUIFactory{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr>Component<wbr>getButton()<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- return<wbr></wbr>new<wbr>JButton(</wbr>"Swing<wbr>Button"</wbr>);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr>Frame<wbr>getFrame()<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- return<wbr></wbr>new<wbr>JFrame(</wbr>"Swing<wbr>Frame"</wbr>);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr>Component<wbr>getTextField()<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- return<wbr></wbr>new<wbr>JTextField(</wbr>20);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr><wbr></wbr></wbr></wbr>
import java.awt.*; import javax.swing.*; import java.awt.event.*; public class TestAbstractFactory { public static void main(String[] args) { GUIFactory fact=new SwingFactory(); Frame f=fact.getFrame(); Component c1=fact.getButton(); Component c2=fact.getTextField(); f.setSize(500,300); f.setLayout(new FlowLayout()); f.add(c1); f.add(c2); f.setVisible(true); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } } abstract class GUIFactory{ public abstract Component getButton(); public abstract Component getTextField(); public abstract Frame getFrame(); } class AWTFactory extends GUIFactory{ public Component getButton() { return new Button("AWT Button"); } public Frame getFrame() { return new Frame("AWT Frame"); } public Component getTextField() { return new TextField(20); } } class SwingFactory extends GUIFactory{ public Component getButton() { return new JButton("Swing Button"); } public Frame getFrame() { return new JFrame("Swing Frame"); } public Component getTextField() { return new JTextField(20); } }3.单例模式(Singleton)改善全局变量和命名空间的冲突,可以说是一种改良了的全局变量。这种一个类只有一个实例,且提供一个访问全局点的方式,更加灵活的保证了实例的创建和访问约束。系统中只有一个实例,因此构造方法应该为私有饿汉式:类加载时直接创建静态实例 懒汉式:第一次需要时才创建一个实例,那么newInstance方法要加同步饿汉式比懒汉式要好,尽管资源利用率要差。但是不用同步。
- public<wbr></wbr>class<wbr>TestSingleton<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>static<wbr></wbr>void<wbr>main(String[]<wbr>args)<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- class<wbr>ClassA{<wbr></wbr></wbr>//饿汉式 <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- private<wbr></wbr>static<wbr>ClassA<wbr>i=</wbr></wbr>new<wbr>ClassA();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>static<wbr>ClassA<wbr>newInstance(){<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- return<wbr>i;<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- private<wbr>ClassA(){}<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- class<wbr>ClassB{<wbr></wbr></wbr>//懒汉式 <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- private<wbr></wbr>static<wbr>ClassB<wbr>i=</wbr></wbr>null;<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>static<wbr></wbr>synchronized<wbr>ClassB<wbr>newInstance(){<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- if<wbr>(i==</wbr>null)<wbr>i=</wbr>new<wbr>ClassB();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- return<wbr>i;<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- private<wbr>ClassB(){}<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr><wbr></wbr></wbr></wbr>
public class TestSingleton { public static void main(String[] args) { } } class ClassA{ //饿汉式 private static ClassA i=new ClassA(); public static ClassA newInstance(){ return i; } private ClassA(){} } class ClassB{ //懒汉式 private static ClassB i=null; public static synchronized ClassB newInstance(){ if (i==null) i=new ClassB(); return i; } private ClassB(){} }
4.建造模式(Builder)将一个对象的内部表象和建造过程分割,一个建造过程可以造出不同表象的对象。可简化为模版方法模式.
- public<wbr></wbr>class<wbr>TestBuilder<wbr>{<wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>static<wbr></wbr>void<wbr>main(String[]<wbr>args)<wbr>{<wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Builder<wbr>b=</wbr>new<wbr>BuilderImpl1();<wbr><wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Director<wbr>d=</wbr>new<wbr>Director(b);<wbr><wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Product<wbr>p=d.createProduct();<wbr><wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr></wbr>interface<wbr>Builder{<wbr><wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- void<wbr>buildPart1();<wbr><wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- void<wbr>buildPart2();<wbr><wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- void<wbr>buildPart3();<wbr><wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Product<wbr>getProduct();<wbr><wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- class<wbr>BuilderImpl1<wbr></wbr></wbr>implements<wbr>Builder{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>void<wbr>buildPart1()<wbr>{<wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- System.out.println("create<wbr>part1"</wbr>);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr>}<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>void<wbr>buildPart2()<wbr>{<wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- System.out.println("create<wbr>part2"</wbr>);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>void<wbr>buildPart3()<wbr>{<wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- System.out.println("create<wbr>part3"</wbr>);<wbr><wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr>Product<wbr>getProduct()<wbr>{<wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- return<wbr></wbr>new<wbr>Product();<wbr><wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- class<wbr>Director{<wbr><wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Builder<wbr>b;<wbr><wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr>Director(Builder<wbr>b){<wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- this.b=b;<wbr><wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr>Product<wbr>createProduct(){<wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- b.buildPart1();<wbr>b.buildPart2();<wbr><wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- b.buildPart3();<wbr><wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- return<wbr>b.getProduct();<wbr><wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr>}<wbr><wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- class<wbr>Product{}<wbr><wbr><wbr></wbr></wbr></wbr></wbr>
public class TestBuilder { public static void main(String[] args) { Builder b=new BuilderImpl1(); Director d=new Director(b); Product p=d.createProduct(); } } interface Builder{ void buildPart1(); void buildPart2(); void buildPart3(); Product getProduct(); } class BuilderImpl1 implements Builder{ public void buildPart1() { System.out.println("create part1"); } public void buildPart2() { System.out.println("create part2"); } public void buildPart3() { System.out.println("create part3"); } public Product getProduct() { return new Product(); } } class Director{ Builder b; public Director(Builder b){ this.b=b; } public Product createProduct(){ b.buildPart1(); b.buildPart2(); b.buildPart3(); return b.getProduct(); } } class Product{}
5.原型模式(ProtoType)通过一个原型对象来创建一个新对象(克隆)。Java中要给出Clonable接口的实现,具体类要实现这个接口,并给出clone()方法的实现细节,这就是简单原型模式的应用。 浅拷贝:只拷贝简单属性的值和对象属性的地址 深拷贝:拷贝本对象引用的对象,有可能会出现循环引用的情况。可以用串行化解决深拷贝。写到流里再读出来,这时会是一个对象的深拷贝结果。
- import<wbr>java.io.*;<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>class<wbr>TestClonealbe<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>static<wbr></wbr>void<wbr>main(String[]<wbr>args)<wbr></wbr></wbr></wbr>throws<wbr>Exception<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Father<wbr>f=</wbr>new<wbr>Father();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- User<wbr>u1=</wbr>new<wbr>User(</wbr>"123456",f);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- User<wbr>u2=(User)u1.clone();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- System.out.println(u1==u2);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- System.out.println(u1.f==u2.f);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- class<wbr>User<wbr></wbr></wbr>implements<wbr>Cloneable,Serializable{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- String<wbr>password;<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Father<wbr>f;<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr>User(String<wbr>password,Father<wbr>f){<wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- this.password=password;<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- this.f=f;<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr>Object<wbr>clone()<wbr></wbr></wbr></wbr>throws<wbr>CloneNotSupportedExcepti<wbr>on<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- //return<wbr>super.clone();</wbr> <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- ObjectOutputStream<wbr>out=</wbr>null;<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- ObjectInputStream<wbr>in=</wbr>null;<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- try<wbr>{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- ByteArrayOutputStream<wbr>bo=</wbr>new<wbr>ByteArrayOutputStream();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- out<wbr>=<wbr></wbr></wbr>new<wbr>ObjectOutputStream(bo);<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- out.writeObject(this);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- out.flush();<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- byte[]<wbr>bs=bo.toByteArray();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- ByteArrayInputStream<wbr>bi=</wbr>new<wbr>ByteArrayInputStream(bs);<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- in<wbr>=<wbr></wbr></wbr>new<wbr>ObjectInputStream(bi);<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Object<wbr>o=in.readObject();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- return<wbr>o;<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr></wbr>catch<wbr>(IOException<wbr>e)<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- e.printStackTrace();<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- return<wbr></wbr>null;<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr></wbr>catch<wbr>(ClassNotFoundException<wbr>e)<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- e.printStackTrace();<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- return<wbr></wbr>null;<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- finally{<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- try<wbr>{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- out.close();<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- in.close();<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr></wbr>catch<wbr>(IOException<wbr>e)<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- e.printStackTrace();<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- class<wbr>Father<wbr></wbr></wbr>implements<wbr>Serializable{}<wbr><wbr></wbr></wbr></wbr>
import java.io.*; public class TestClonealbe { public static void main(String[] args) throws Exception { Father f=new Father(); User u1=new User("123456",f); User u2=(User)u1.clone(); System.out.println(u1==u2); System.out.println(u1.f==u2.f); } } class User implements Cloneable,Serializable{ String password; Father f; public User(String password,Father f){ this.password=password; this.f=f; } public Object clone() throws CloneNotSupportedExcepti<wbr>on { //return super.clone(); ObjectOutputStream out=null; ObjectInputStream in=null; try { ByteArrayOutputStream bo=new ByteArrayOutputStream(); out = new ObjectOutputStream(bo); out.writeObject(this); out.flush(); byte[] bs=bo.toByteArray(); ByteArrayInputStream bi=new ByteArrayInputStream(bs); in = new ObjectInputStream(bi); Object o=in.readObject(); return o; } catch (IOException e) { e.printStackTrace(); return null; } catch (ClassNotFoundException e) { e.printStackTrace(); return null; } finally{ try { out.close(); in.close(); } catch (IOException e) { e.printStackTrace(); } } } } class Father implements Serializable{}</wbr>
结构模式 如何把简单的类根据某种结构组装为大的系统<wbr></wbr>
6.适配器模式(Adapter)在原类型不做任何改变的情况下,用一个适配器类把一个接口转成另一个接口,扩展了新的接口,灵活且多样的适配一切旧俗。这种打破旧框框,适配新格局的思想,是面向对象的精髓。以继承方式实现的类的 Adapter模式和以聚合方式实现的对象的Adapter模式,各有千秋,各取所长。
- public<wbr></wbr>class<wbr>TestAdapter<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>static<wbr></wbr>void<wbr>main(String[]<wbr>args)<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- USB<wbr>mouse=</wbr>new<wbr>Mouse();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- PC<wbr>pc=</wbr>new<wbr>PC();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- //pc.useMouse(mouse); <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- PS2<wbr>adapter=</wbr>new<wbr>USB2PS2Adapter(mouse);<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- pc.useMouse(adapter);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- interface<wbr>PS2{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- void<wbr>usePs2();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- interface<wbr>USB{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- void<wbr>useUsb();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- class<wbr>Mouse<wbr></wbr></wbr>implements<wbr>USB{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>void<wbr>useUsb(){<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- System.out.println("通过USB接口工作");<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- class<wbr>PC{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>void<wbr>useMouse(PS2<wbr>ps2Mouse){<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- ps2Mouse.usePs2();<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- class<wbr>USB2PS2Adapter<wbr></wbr></wbr>implements<wbr>PS2{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- private<wbr>USB<wbr>usb;<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr>USB2PS2Adapter(USB<wbr>usb)<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- this.usb<wbr>=<wbr>usb;<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>void<wbr>usePs2(){<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- System.out.println("把对usePS2的方法调用转换成对useUSB的方法调用");<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- usb.useUsb();<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr><wbr></wbr></wbr></wbr>
public class TestAdapter { public static void main(String[] args) { USB mouse=new Mouse(); PC pc=new PC(); //pc.useMouse(mouse); PS2 adapter=new USB2PS2Adapter(mouse); pc.useMouse(adapter); } } interface PS2{ void usePs2(); } interface USB{ void useUsb(); } class Mouse implements USB{ public void useUsb(){ System.out.println("通过USB接口工作"); } } class PC{ public void useMouse(PS2 ps2Mouse){ ps2Mouse.usePs2(); } } class USB2PS2Adapter implements PS2{ private USB usb; public USB2PS2Adapter(USB usb) { this.usb = usb; } public void usePs2(){ System.out.println("把对usePS2的方法调用转换成对useUSB的方法调用"); usb.useUsb(); } }
<wbr></wbr>
7.组合模式(Composite) 把整体和局部的关系用树状结构描述出来,使得客户端把整体对象和局部对象同等看待。
- import<wbr>java.util.*;<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>class<wbr>TestComposite<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>static<wbr></wbr>void<wbr>main(String[]<wbr>args)<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Node<wbr>n1=</wbr>new<wbr>LeafNode(</wbr>3);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Node<wbr>n2=</wbr>new<wbr>LeafNode(</wbr>4);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Node<wbr>n3=</wbr>new<wbr>LeafNode(</wbr>6);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Node<wbr>n4=</wbr>new<wbr>LeafNode(</wbr>5);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Node<wbr>n5=</wbr>new<wbr>LeafNode(</wbr>2);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Node<wbr>n6=</wbr>new<wbr>LeafNode(</wbr>9);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Node<wbr>n7=</wbr>new<wbr>LeafNode(</wbr>12);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Node<wbr>n8=</wbr>new<wbr>LeafNode(</wbr>7);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Node<wbr>n9=</wbr>new<wbr>LeafNode(</wbr>8);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Node<wbr>c1=</wbr>new<wbr>CompositeNode(n1,n2,n3);<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Node<wbr>c4=</wbr>new<wbr>CompositeNode(n8,n9);<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Node<wbr>c3=</wbr>new<wbr>CompositeNode(n5,c4);<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Node<wbr>c2=</wbr>new<wbr>CompositeNode(n4,c3);<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Node<wbr>c5=</wbr>new<wbr>CompositeNode(n6,n7);<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Node<wbr>root=</wbr>new<wbr>CompositeNode(c1,c2,c5);<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- System.out.println(root.getValue());<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- abstract<wbr></wbr>class<wbr>Node{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>abstract<wbr></wbr>int<wbr>getValue();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- class<wbr>LeafNode<wbr></wbr></wbr>extends<wbr>Node{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- int<wbr>value;<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr>LeafNode(</wbr>int<wbr>value){<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- this.value=value;<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>int<wbr>getValue(){<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- return<wbr>value;<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- class<wbr>CompositeNode<wbr></wbr></wbr>extends<wbr>Node{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- private<wbr>List<wbr>children=</wbr></wbr>new<wbr>ArrayList();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr>CompositeNode(Node...<wbr>nodes){<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- for(Node<wbr>n:nodes){<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- children.add(n);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>int<wbr>getValue(){<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- int<wbr>result=</wbr>0;<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- for(Node<wbr>n:children){<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- result+=n.getValue();<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- return<wbr>result;<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr><wbr></wbr></wbr></wbr>
import java.util.*; public class TestComposite { public static void main(String[] args) { Node n1=new LeafNode(3); Node n2=new LeafNode(4); Node n3=new LeafNode(6); Node n4=new LeafNode(5); Node n5=new LeafNode(2); Node n6=new LeafNode(9); Node n7=new LeafNode(12); Node n8=new LeafNode(7); Node n9=new LeafNode(8); Node c1=new CompositeNode(n1,n2,n3); Node c4=new CompositeNode(n8,n9); Node c3=new CompositeNode(n5,c4); Node c2=new CompositeNode(n4,c3); Node c5=new CompositeNode(n6,n7); Node root=new CompositeNode(c1,c2,c5); System.out.println(root.getValue()); } } abstract class Node{ public abstract int getValue(); } class LeafNode extends Node{ int value; public LeafNode(int value){ this.value=value; } public int getValue(){ return value; } } class CompositeNode extends Node{ private List children=new ArrayList(); public CompositeNode(Node... nodes){ for(Node n:nodes){ children.add(n); } } public int getValue(){ int result=0; for(Node n:children){ result+=n.getValue(); } return result; } }
8.装饰模式(Decorator) 以对客户透明的方式来扩展对象的功能。用户根据功能需求随意选取组成对象的成分,通过方法的链式调用来实现。 可以给对象动态的增加功能,比继承灵活性更大。
- public<wbr></wbr>class<wbr>TestDecorator<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>static<wbr></wbr>void<wbr>main(String[]<wbr>args)<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Teacher<wbr>t1=</wbr>new<wbr>SimpleTeacher();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Teacher<wbr>t2=</wbr>new<wbr>CppTeacher(t1);<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Teacher<wbr>t3=</wbr>new<wbr>JavaTeacher(t2);<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- t3.teach();<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- //t.teach(); <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- abstract<wbr></wbr>class<wbr>Teacher{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>abstract<wbr></wbr>void<wbr>teach();<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- class<wbr>SimpleTeacher<wbr></wbr></wbr>extends<wbr>Teacher{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>void<wbr>teach(){<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- System.out.println("Good<wbr>Good<wbr>Study,<wbr>Day<wbr>Day<wbr>Up"</wbr></wbr></wbr></wbr></wbr>);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- class<wbr>JavaTeacher<wbr></wbr></wbr>extends<wbr>Teacher{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Teacher<wbr>teacher;<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr>JavaTeacher(Teacher<wbr>t){<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- this.teacher=t;<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>void<wbr>teach(){<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- teacher.teach();<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- System.out.println("Teach<wbr>Java"</wbr>);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- class<wbr>CppTeacher<wbr></wbr></wbr>extends<wbr>Teacher{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- Teacher<wbr>teacher;<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr>CppTeacher(Teacher<wbr>t){<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- this.teacher=t;<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>void<wbr>teach(){<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- teacher.teach();<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- System.out.println("Teach<wbr>C++"</wbr>);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr><wbr></wbr></wbr></wbr>
public class TestDecorator { public static void main(String[] args) { Teacher t1=new SimpleTeacher(); Teacher t2=new CppTeacher(t1); Teacher t3=new JavaTeacher(t2); t3.teach(); //t.teach(); } } abstract class Teacher{ public abstract void teach(); } class SimpleTeacher extends Teacher{ public void teach(){ System.out.println("Good Good Study, Day Day Up"); } } class JavaTeacher extends Teacher{ Teacher teacher; public JavaTeacher(Teacher t){ this.teacher=t; } public void teach(){ teacher.teach(); System.out.println("Teach Java"); } } class CppTeacher extends Teacher{ Teacher teacher; public CppTeacher(Teacher t){ this.teacher=t; } public void teach(){ teacher.teach(); System.out.println("Teach C++"); } }
9.代理模式(Proxy) 用一个代理对象来作为另一个对象的代理,对客户来说是透明的。存在一个抽象主题类,具体主题类和代理主题类都继承(实现)抽象主题,代理主题类中的方法会调用具体主题类中相对应的方法。
10.享元模式(Flyweight Pattern)对象的状态分为内蕴状态和外蕴状态。内蕴状态不随环境变化而变化,因此可以作成系统共享.<wbr></wbr>
11.门面模式(Facade) 访问子系统的时候,通过一个Façade对象访问。Facade类是单例的。客户代码只需要和门面对象通信,不需要和具体子系统内部的对象通信,使得他们之间的耦合关系减弱。这次将表现层和逻辑层隔离,封装底层的复杂处理,为用户提供简单的接口,这样的例子随处可见。
门面模式很多时候更是一种系统架构的设计,在我所做的项目中,就实现了门面模式的接口,为复杂系统的解耦提供了最好的解决方案。<wbr></wbr>
12.桥梁模式(Bridge)将抽象和实现脱耦,使得二者可以单独变化。使得一个继承关系不承担两个变化因素.使用合成来代替继承的一种体现.
- public<wbr>YuanUser(BankAccount<wbr>account)<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- super(account);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>void<wbr>getMoney()<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- System.out.print("人民币");<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- account.withdraw();<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>void<wbr>saveMoney()<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- System.out.print("人民币");<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- account.deposit();<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- class<wbr>DollarUser<wbr></wbr></wbr>extends<wbr>BankUser{<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr>DollarUser(BankAccount<wbr>account)<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- super(account);<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>void<wbr>getMoney()<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- System.out.print("美元");<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- account.withdraw();<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- public<wbr></wbr>void<wbr>saveMoney()<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- System.out.print("美元");<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- account.deposit();<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- }<wbr><wbr><wbr></wbr></wbr></wbr>
public YuanUser(BankAccount account) { super(account); } public void getMoney() { System.out.print("人民币"); account.withdraw(); } public void saveMoney() { System.out.print("人民币"); account.deposit(); } } class DollarUser extends BankUser{ public DollarUser(BankAccount account) { super(account); } public void getMoney() { System.out.print("美元"); account.withdraw(); } public void saveMoney() { System.out.print("美元"); account.deposit(); } }<wbr><p><span style="font-weight:bold; text-decoration:underline">行为模式</span> 描述如何在对象之间划分责任<wbr></wbr></p> <p>13.策略模式(Strategy)如同LayoutManager和具体的布局管理器的关系,在抽象策略类中定义方法,将易于变化的部分封装为接口,通常Strategy 封装一些运算法则,使之能互换。Bruce Zhang在他的博客中提到策略模式其实是一种“面向接口”的编程方法,真是恰如其分。在具体策略子类中实现,客户代码根据不同的需要选择相应的具体类,例如电子商务中多种价格算法。一种策略一旦选中,整个系统运行期是不变化的</p> <div> <div> <div> <strong>[java]</strong> <a title="view plain" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#"> view plain</a><a title="copy" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#">copy</a><a title="print" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#">print</a><a title="?" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#">?</a> </div> </div> <ol> <li> <span><span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">class</span></strong></span><span><wbr>TestStrategy<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></span></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">static</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>main(String[]<wbr>args)<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Strategy<wbr>s1=</wbr></span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>May1Strategy();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Strategy<wbr>s2=</wbr></span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>June1Strategy();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Book<wbr>b=</wbr></span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>Book(</wbr></span><span><span style="color:#c00000">100</span></span><span>);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>b.setS(s2);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>System.out.println(b.getPrice());<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">class</span></strong></span><span><wbr>Book{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Strategy<wbr>s;<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr>Book(</wbr></span><span><strong><span style="color:#006699">double</span></strong></span><span><wbr>price){<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">this</span></strong></span><span>.price=price;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">private</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">double</span></strong></span><span><wbr>price;<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>setS(Strategy<wbr>s)<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">this</span></strong></span><span>.s<wbr>=<wbr>s;<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">double</span></strong></span><span><wbr>getPrice(){<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">return</span></strong></span><span><wbr>price*s.getZheKou();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">interface</span></strong></span><span><wbr>Strategy{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">double</span></strong></span><span><wbr>getZheKou();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">class</span></strong></span><span><wbr>May1Strategy<wbr></wbr></wbr></span><span><strong><span style="color:#006699">implements</span></strong></span><span><wbr>Strategy{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">double</span></strong></span><span><wbr>getZheKou(){<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">return</span></strong></span><span><wbr></wbr></span><span><span style="color:#c00000">0.8</span></span><span>;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">class</span></strong></span><span><wbr>June1Strategy<wbr></wbr></wbr></span><span><strong><span style="color:#006699">implements</span></strong></span><span><wbr>Strategy{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">double</span></strong></span><span><wbr>getZheKou(){<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">return</span></strong></span><span><wbr></wbr></span><span><span style="color:#c00000">0.7</span></span><span>;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr><wbr></wbr></wbr></wbr></span> </li> </ol> </div> <pre style="DISPLAY: none" name="code">public class TestStrategy { public static void main(String[] args) { Strategy s1=new May1Strategy(); Strategy s2=new June1Strategy(); Book b=new Book(100); b.setS(s2); System.out.println(b.getPrice()); } } class Book{ Strategy s; public Book(double price){ this.price=price; } private double price; public void setS(Strategy s) { this.s = s; } public double getPrice(){ return price*s.getZheKou(); } } interface Strategy{ double getZheKou(); } class May1Strategy implements Strategy{ public double getZheKou(){ return 0.8; } } class June1Strategy implements Strategy{ public double getZheKou(){ return 0.7; } }</pre>14.模板方法(Template Method)准备一个抽象类,把部分确定的逻辑定义在某些方法中,用其他抽象方法实现剩余的逻辑。不同子类对这些逻辑有不同的实现。用法:定义多个抽象操作,定义并实现一个模板方法,将步骤放在这个具体方法里,推迟到子类实现。子类可以改变父类的可变部分,但不能改变模板方法所代表的顶级逻辑。 <div> <div> <div> <strong>[java]</strong> <a title="view plain" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#"> view plain</a><a title="copy" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#">copy</a><a title="print" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#">print</a><a title="?" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#">?</a> </div> </div> <ol> <li> <span><span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">class</span></strong></span><span><wbr>TestTemplateMethod<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></span></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">static</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>main(String[]<wbr>args)<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>XiaoPin<wbr>xp=</wbr></span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>DaPuKe();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>xp.act();<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">abstract</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">class</span></strong></span><span><wbr>XiaoPin{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">abstract</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>jiaoLiu();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">abstract</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>xuShi();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">abstract</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>gaoXiao();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">abstract</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>shanQing();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">final</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>act(){<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>jiaoLiu();<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>xuShi();<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>gaoXiao();<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>shanQing();<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">class</span></strong></span><span><wbr>DaPuKe<wbr></wbr></wbr></span><span><strong><span style="color:#006699">extends</span></strong></span><span><wbr>XiaoPin{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>jiaoLiu(){<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>System.out.println(</span><span><span style="color:#0000ff">"顺口溜"</span></span><span>);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>xuShi(){<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>System.out.println(</span><span><span style="color:#0000ff">"火车除夕,老同学见面"</span></span><span>);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>gaoXiao(){<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>System.out.println(</span><span><span style="color:#0000ff">"名片当作扑克"</span></span><span>);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>shanQing(){<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>System.out.println(</span><span><span style="color:#0000ff">"马家军"</span></span><span>);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr><wbr></wbr></wbr></wbr></span> </li> </ol> </div> <pre style="DISPLAY: none" name="code">public class TestTemplateMethod { public static void main(String[] args) { XiaoPin xp=new DaPuKe(); xp.act(); } } abstract class XiaoPin{ public abstract void jiaoLiu(); public abstract void xuShi(); public abstract void gaoXiao(); public abstract void shanQing(); public final void act(){ jiaoLiu(); xuShi(); gaoXiao(); shanQing(); } } class DaPuKe extends XiaoPin{ public void jiaoLiu(){ System.out.println("顺口溜"); } public void xuShi(){ System.out.println("火车除夕,老同学见面"); } public void gaoXiao(){ System.out.println("名片当作扑克"); } public void shanQing(){ System.out.println("马家军"); } }</pre> <wbr><p><wbr></wbr></p> <p>15.观察者模式(Observer) 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。观察者和被观察者的分开,为模块划分提供了清晰的界限。在低耦合的对象间完成协调。 Java中的事件模型就是一个应用。</p> <p>16.迭代器模式(Iterator)类似于集合中的Iterator,使用迭代器来统一不同集合对象的遍历方式。在绝大多数的系统中,都会用到数组、集合、链表、队列这样的类型,关心迭代模式的来龙去脉非常有必要。在遍历算法中,迭代模式提供了遍历的顺序访问容器,GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。.NET中就是使用了迭代器来创建用于foreach的集合。</p> <div> <div> <strong>[java]</strong> <a title="view plain" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#"> view plain</a><a title="copy" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#">copy</a><a title="print" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#">print</a><a title="?" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#">?</a> </div> </div> <div> <ol> <li> <span><span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">class</span></strong></span><span><wbr>TestIterator<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></span></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">static</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>main(String[]<wbr>args)<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Stack<wbr>s=</wbr></span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>Stack();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>s.push(</span><span><span style="color:#0000ff">"Liucy"</span></span><span>);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>s.push(</span><span><span style="color:#0000ff">"Huxz"</span></span><span>);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>s.push(</span><span><span style="color:#0000ff">"George"</span></span><span>);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>LinkedList<wbr>l=</wbr></span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>LinkedList();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>l.addFirst(</span><span><span style="color:#0000ff">"Liucy"</span></span><span>);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>l.addFirst(</span><span><span style="color:#0000ff">"Huxz"</span></span><span>);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>l.addFirst(</span><span><span style="color:#0000ff">"George"</span></span><span>);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>print(l.iterator());<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">static</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>print(Itr<wbr>it){<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">while</span></strong></span><span>(it.hasNext()){<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>System.out.println(it.next());<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">interface</span></strong></span><span><wbr>Itr{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">boolean</span></strong></span><span><wbr>hasNext();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Object<wbr>next();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">class</span></strong></span><span><wbr>Stack{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Object[]<wbr>os=</wbr></span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>Object[</wbr></span><span><span style="color:#c00000">10</span></span><span>];<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">int</span></strong></span><span><wbr>index=</wbr></span><span><span style="color:#c00000">0</span></span><span>;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">private</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>expand(){<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Object[]<wbr>os2=</wbr></span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>Object[os.length*</wbr></span><span><span style="color:#c00000">2</span></span><span>];<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>System.arraycopy(os,</span><span><span style="color:#c00000">0</span></span><span>,os2,</span><span><span style="color:#c00000">0</span></span><span>,os.length);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>os=os2;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>push(Object<wbr>o){<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">if</span></strong></span><span><wbr>(index==os.length)<wbr>expand();<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>os[index]=o;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>index++;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr>Object<wbr>pop(){<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>index--;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Object<wbr>o=os[index];<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>os[index]=</span><span><strong><span style="color:#006699">null</span></strong></span><span>;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">return</span></strong></span><span><wbr>o;<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">private</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">class</span></strong></span><span><wbr>StackItr<wbr></wbr></wbr></span><span><strong><span style="color:#006699">implements</span></strong></span><span><wbr>Itr{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">int</span></strong></span><span><wbr>cursor=</wbr></span><span><span style="color:#c00000">0</span></span><span>;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">boolean</span></strong></span><span><wbr>hasNext(){<wbr><wbr></wbr></wbr></wbr></span> </li> </ol> </div> <ol> <li> <span><strong><span style="color:#006699">return</span></strong></span><span><wbr>cursor}<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr>Object<wbr>next(){<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">return</span></strong></span><span><wbr>os[cursor++];<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr>Itr<wbr>iterator(){<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">return</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>StackItr();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">class</span></strong></span><span><wbr>LinkedList{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">private</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">class</span></strong></span><span><wbr>Node{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Object<wbr>o;<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Node<wbr>next;<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr>Node(Object<wbr>o){<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">this</span></strong></span><span>.o=o;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>setNext(Node<wbr>next){<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">this</span></strong></span><span>.next=next;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr>Node<wbr>getNext(){<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">return</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">this</span></strong></span><span>.next;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Node<wbr>head;<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>addFirst(Object<wbr>o){<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Node<wbr>n=</wbr></span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>Node(o);<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>n.setNext(head);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>head=n;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr>Object<wbr>removeFirst(){<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Node<wbr>n=head;<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>head=head.getNext();<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">return</span></strong></span><span><wbr>n.o;<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">class</span></strong></span><span><wbr>LinkedListItr<wbr></wbr></wbr></span><span><strong><span style="color:#006699">implements</span></strong></span><span><wbr>Itr{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Node<wbr>currentNode=head;<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">boolean</span></strong></span><span><wbr>hasNext(){<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">return</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">this</span></strong></span><span>.currentNode!=</span><span><strong><span style="color:#006699">null</span></strong></span><span>;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr>Object<wbr>next(){<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Node<wbr>n=currentNode;<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>currentNode=currentNode.getNext();<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">return</span></strong></span><span><wbr>n.o;<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr>Itr<wbr>iterator(){<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">return</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>LinkedListItr();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr><wbr></wbr></wbr></wbr></span> </li> </ol> <pre style="DISPLAY: none" name="code">public class TestIterator { public static void main(String[] args) { Stack s=new Stack(); s.push("Liucy"); s.push("Huxz"); s.push("George"); LinkedList l=new LinkedList(); l.addFirst("Liucy"); l.addFirst("Huxz"); l.addFirst("George"); print(l.iterator()); } public static void print(Itr it){ while(it.hasNext()){ System.out.println(it.next()); } } } interface Itr{ boolean hasNext(); Object next(); } class Stack{ Object[] os=new Object[10]; int index=0; private void expand(){ Object[] os2=new Object[os.length*2]; System.arraycopy(os,0,os2,0,os.length); os=os2; } public void push(Object o){ if (index==os.length) expand(); os[index]=o; index++; } public Object pop(){ index--; Object o=os[index]; os[index]=null; return o; } private class StackItr implements Itr{ int cursor=0; public boolean hasNext(){ return cursor} public Object next(){ return os[cursor++]; } } public Itr iterator(){ return new StackItr(); } } class LinkedList{ private class Node{ Object o; Node next; public Node(Object o){ this.o=o; } public void setNext(Node next){ this.next=next; } public Node getNext(){ return this.next; } } Node head; public void addFirst(Object o){ Node n=new Node(o); n.setNext(head); head=n; } public Object removeFirst(){ Node n=head; head=head.getNext(); return n.o; } class LinkedListItr implements Itr{ Node currentNode=head; public boolean hasNext(){ return this.currentNode!=null; } public Object next(){ Node n=currentNode; currentNode=currentNode.getNext(); return n.o; } } public Itr iterator(){ return new LinkedListItr(); } }</pre> <p><wbr></wbr></p> <p>17.责任链(Chain of Responsibility)多个处理器对象连成一串,请求在这条链上传递,由该处理这个请求的处理器来处理。发出请求的客户端并不知道哪个对象处理请求。</p> <div> <div> <div> <strong>[java]</strong> <a title="view plain" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#"> view plain</a><a title="copy" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#">copy</a><a title="print" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#">print</a><a title="?" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#">?</a> </div> </div> <ol> <li> <span><span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">class</span></strong></span><span><wbr>TestChain<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></span></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">static</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>main(String[]<wbr>args)<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>String<wbr>pass1=</wbr></span><span><span style="color:#0000ff">"123456"</span></span><span>;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>String<wbr>pass2=</wbr></span><span><span style="color:#0000ff">"123456"</span></span><span>;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>String<wbr>personId=</wbr></span><span><span style="color:#0000ff">"123456789012345678"</span></span><span>;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>String<wbr>email=</wbr></span><span><span style="color:#0000ff">"chmask@163.com"</span></span><span>;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>register(pass1,pass2,personId,email);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">static</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>register(String<wbr>pass1,String<wbr>pass2,String<wbr>personId,String<wbr>email){<wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Filter<wbr>f1=</wbr></span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>PasswordFilter1();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Filter<wbr>f2=</wbr></span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>PasswordFilter2();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Filter<wbr>f3=</wbr></span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>PersonIdFilter();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Filter<wbr>f4=</wbr></span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>EmailFilter();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>f1.setNext(f2);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>f2.setNext(f3);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>f3.setNext(f4);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>System.out.println(f1.doFilter(pass1,pass2,personId,email));<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">abstract</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">class</span></strong></span><span><wbr>Filter{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Filter<wbr>next=</wbr></span><span><strong><span style="color:#006699">null</span></strong></span><span>;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr>Filter<wbr>getNext()<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">return</span></strong></span><span><wbr>next;<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>setNext(Filter<wbr>next)<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">this</span></strong></span><span>.next<wbr>=<wbr>next;<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr>String<wbr>doFilter(String<wbr>pass1,String<wbr>pass2,String<wbr>personId,String<wbr>email){<wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">if</span></strong></span><span><wbr>(next==</wbr></span><span><strong><span style="color:#006699">null</span></strong></span><span>)<wbr></wbr></span><span><strong><span style="color:#006699">return</span></strong></span><span><wbr></wbr></span><span><span style="color:#0000ff">"成功"</span></span><span>;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">else</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">return</span></strong></span><span><wbr>next.doFilter(pass1,pass2,personId,email);<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">class</span></strong></span><span><wbr>PasswordFilter1<wbr></wbr></wbr></span><span><strong><span style="color:#006699">extends</span></strong></span><span><wbr>Filter{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr>String<wbr>doFilter(String<wbr>pass1,String<wbr>pass2,String<wbr>personId,String<wbr>email){<wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">if</span></strong></span><span><wbr>(!(pass1.equals(pass2)))<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">return</span></strong></span><span><wbr></wbr></span><span><span style="color:#0000ff">"两次密码输入不一致"</span></span><span>;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">else</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">return</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">super</span></strong></span><span>.doFilter(pass1,pass2,personId,email);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">class</span></strong></span><span><wbr>PasswordFilter2<wbr></wbr></wbr></span><span><strong><span style="color:#006699">extends</span></strong></span><span><wbr>Filter{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr>String<wbr>doFilter(String<wbr>pass1,String<wbr>pass2,String<wbr>personId,String<wbr>email){<wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">if</span></strong></span><span><wbr>(pass1.length()!=</wbr></span><span><span style="color:#c00000">6</span></span><span>)<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">return</span></strong></span><span><wbr></wbr></span><span><span style="color:#0000ff">"密码长度必须为6"</span></span><span>;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">else</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">return</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">super</span></strong></span><span>.doFilter(pass1,pass2,personId,email);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">class</span></strong></span><span><wbr>PersonIdFilter<wbr></wbr></wbr></span><span><strong><span style="color:#006699">extends</span></strong></span><span><wbr>Filter{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr>String<wbr>doFilter(String<wbr>pass1,String<wbr>pass2,String<wbr>personId,String<wbr>email){<wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">if</span></strong></span><span><wbr>(personId.length()!=</wbr></span><span><span style="color:#c00000">15</span></span><span><wbr>&&<wbr>personId.length()!=</wbr></wbr></span><span><span style="color:#c00000">18</span></span><span>)<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">return</span></strong></span><span><wbr></wbr></span><span><span style="color:#0000ff">"身份证号码非法"</span></span><span>;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">else</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">return</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">super</span></strong></span><span>.doFilter(pass1,pass2,personId,email);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">class</span></strong></span><span><wbr>EmailFilter<wbr></wbr></wbr></span><span><strong><span style="color:#006699">extends</span></strong></span><span><wbr>Filter{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr>String<wbr>doFilter(String<wbr>pass1,String<wbr>pass2,String<wbr>personId,String<wbr>email){<wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">int</span></strong></span><span><wbr>i1=email.indexOf(</wbr></span><span><span style="color:#0000ff">"@"</span></span><span>);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">int</span></strong></span><span><wbr>i2=email.indexOf(</wbr></span><span><span style="color:#0000ff">"."</span></span><span>);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">if</span></strong></span><span><wbr>(i1==-</wbr></span><span><span style="color:#c00000">1</span></span><span><wbr>||<wbr>i2==-</wbr></wbr></span><span><span style="color:#c00000">1</span></span><span><wbr>||<wbr>i2-i1<=</wbr></wbr></span><span><span style="color:#c00000">1</span></span><span><wbr>||<wbr>i1==</wbr></wbr></span><span><span style="color:#c00000">0</span></span><span><wbr>||<wbr>i2==email.length()-</wbr></wbr></span><span><span style="color:#c00000">1</span></span><span>)<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">return</span></strong></span><span><wbr></wbr></span><span><span style="color:#0000ff">"email非法"</span></span><span>;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">else</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">return</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">super</span></strong></span><span>.doFilter(pass1,pass2,personId,email);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr><wbr></wbr></wbr></wbr></span> </li> </ol> </div> <pre style="DISPLAY: none" name="code">public class TestChain { public static void main(String[] args) { String pass1="123456"; String pass2="123456"; String personId="123456789012345678"; String email="chmask@163.com"; register(pass1,pass2,personId,email); } public static void register(String pass1,String pass2,String personId,String email){ Filter f1=new PasswordFilter1(); Filter f2=new PasswordFilter2(); Filter f3=new PersonIdFilter(); Filter f4=new EmailFilter(); f1.setNext(f2); f2.setNext(f3); f3.setNext(f4); System.out.println(f1.doFilter(pass1,pass2,personId,email)); } } abstract class Filter{ Filter next=null; public Filter getNext() { return next; } public void setNext(Filter next) { this.next = next; } public String doFilter(String pass1,String pass2,String personId,String email){ if (next==null) return "成功"; else return next.doFilter(pass1,pass2,personId,email); } } class PasswordFilter1 extends Filter{ public String doFilter(String pass1,String pass2,String personId,String email){ if (!(pass1.equals(pass2))) return "两次密码输入不一致"; else return super.doFilter(pass1,pass2,personId,email); } } class PasswordFilter2 extends Filter{ public String doFilter(String pass1,String pass2,String personId,String email){ if (pass1.length()!=6) return "密码长度必须为6"; else return super.doFilter(pass1,pass2,personId,email); } } class PersonIdFilter extends Filter{ public String doFilter(String pass1,String pass2,String personId,String email){ if (personId.length()!=15 && personId.length()!=18) return "身份证号码非法"; else return super.doFilter(pass1,pass2,personId,email); } } class EmailFilter extends Filter{ public String doFilter(String pass1,String pass2,String personId,String email){ int i1=email.indexOf("@"); int i2=email.indexOf("."); if (i1==-1 || i2==-1 || i2-i1<=1 || i1==0 || i2==email.length()-1) return "email非法"; else return super.doFilter(pass1,pass2,personId,email); } }</pre> <p>18.状态模式(State) 在对象内部状态改变时改变其行为。把所研究的对象的行为封装在不同的状态对象中。</p> <div> <div> <div> <strong>[java]</strong> <a title="view plain" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#"> view plain</a><a title="copy" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#">copy</a><a title="print" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#">print</a><a title="?" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#">?</a> </div> </div> <ol> <li> <span><span><strong><span style="color:#006699">import</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">static</span></strong></span><span><wbr>java.lang.System.*;<wbr><wbr></wbr></wbr></wbr></span></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">class</span></strong></span><span><wbr>TestState<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">static</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>main(String[]<wbr>args)<wbr>{<wbr><wbr></wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>BBSUser<wbr>u=</wbr></span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>BBSUser();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>u.setState(</span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>GuestState());<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>u.publish();<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>u.setState(</span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>NormalState());<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>u.publish();<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>u.setState(</span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>BlockedState());<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>u.publish();<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>u.setState(</span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>NewComerState());<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>u.publish();<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">class</span></strong></span><span><wbr>BBSUser{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">private</span></strong></span><span><wbr>State<wbr>state;<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>setState(State<wbr>state){<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">this</span></strong></span><span>.state=state;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>publish(){<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>state.action();<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">abstract</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">class</span></strong></span><span><wbr>State{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">abstract</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>action();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">class</span></strong></span><span><wbr>GuestState<wbr></wbr></wbr></span><span><strong><span style="color:#006699">extends</span></strong></span><span><wbr>State{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>action(){<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>out.println(</span><span><span style="color:#0000ff">"您处在游客状态,请先登录"</span></span><span>);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">class</span></strong></span><span><wbr>NormalState<wbr></wbr></wbr></span><span><strong><span style="color:#006699">extends</span></strong></span><span><wbr>State{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>action(){<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>out.println(</span><span><span style="color:#0000ff">"您处在正常状态,文章发表成功"</span></span><span>);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">class</span></strong></span><span><wbr>BlockedState<wbr></wbr></wbr></span><span><strong><span style="color:#006699">extends</span></strong></span><span><wbr>State{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>action(){<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>out.println(</span><span><span style="color:#0000ff">"您处在被封状态,文章发表失败"</span></span><span>);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">class</span></strong></span><span><wbr>NewComerState<wbr></wbr></wbr></span><span><strong><span style="color:#006699">extends</span></strong></span><span><wbr>State{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>action(){<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>out.println(</span><span><span style="color:#0000ff">"您是新手,请先学习一下,3天后再来"</span></span><span>);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">class</span></strong></span><span><wbr>StateFactory{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">static</span></strong></span><span><wbr>State<wbr>createState(</wbr></wbr></span><span><strong><span style="color:#006699">int</span></strong></span><span><wbr>i){<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">if</span></strong></span><span><wbr>(i==</wbr></span><span><span style="color:#c00000">1</span></span><span>)<wbr></wbr></span><span><strong><span style="color:#006699">return</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>GuestState();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">else</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">return</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>NormalState();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr><wbr></wbr></wbr></wbr></span> </li> </ol> </div> <pre style="DISPLAY: none" name="code">import static java.lang.System.*; public class TestState { public static void main(String[] args) { BBSUser u=new BBSUser(); u.setState(new GuestState()); u.publish(); u.setState(new NormalState()); u.publish(); u.setState(new BlockedState()); u.publish(); u.setState(new NewComerState()); u.publish(); } } class BBSUser{ private State state; public void setState(State state){ this.state=state; } public void publish(){ state.action(); } } abstract class State{ public abstract void action(); } class GuestState extends State{ public void action(){ out.println("您处在游客状态,请先登录"); } } class NormalState extends State{ public void action(){ out.println("您处在正常状态,文章发表成功"); } } class BlockedState extends State{ public void action(){ out.println("您处在被封状态,文章发表失败"); } } class NewComerState extends State{ public void action(){ out.println("您是新手,请先学习一下,3天后再来"); } } class StateFactory{ public static State createState(int i){ if (i==1) return new GuestState(); else return new NormalState(); } }</pre> <p>19.备忘录模式(Memento) 备忘录对象用来存储另一个对象的快照对象,保存其内部状态,使得可以随时恢复。备忘录角色:保存发起人对象的内部状态,保护内容不被除发起人对象之外的对象获取。窄接口:负责人对象和其他对象看到的接口,只允许把备忘录对象传给其他对象。宽接口:发起人能看到的接口,允许读取内部状态。发起人角色:创建并使用备忘录对象来保存其状态 负责人角色:负责保存备忘录对象。 白箱实现:备忘录类对其他类也可见,这样发起人的状态可能会存在安全问题。 黑箱实现:把备忘录类作成发起人的内部类,对外提供一个标识接口。</p> <div> <div> <div> <strong>[java]</strong> <a title="view plain" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#"> view plain</a><a title="copy" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#">copy</a><a title="print" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#">print</a><a title="?" href="http://blog.youkuaiyun.com/chmask/article/details/2631485#">?</a> </div> </div> <ol> <li> <span><span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">class</span></strong></span><span><wbr>TestMemento{<wbr><wbr></wbr></wbr></wbr></span></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">static</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>main(String[]<wbr>args){<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Originator<wbr>ori=</wbr></span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>Originator();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Caretaker<wbr>c=</wbr></span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>Caretaker();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>ori.setState(</span><span><span style="color:#0000ff">"State<wbr>1"</wbr></span></span><span>);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>IFMemento<wbr>m=ori.createMemento();<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>c.save(m);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>ori.setState(</span><span><span style="color:#0000ff">"State<wbr>2"</wbr></span></span><span>);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>m=c.retrieve();<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>ori.restore(m);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>System.out.println(</span><span><span style="color:#0000ff">"Now<wbr>State:"</wbr></span></span><span>+ori.getState());<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">class</span></strong></span><span><wbr>Originator{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>String<wbr>state;<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>setState(String<wbr>s){<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>state=s;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>System.out.println(</span><span><span style="color:#0000ff">"State<wbr>change<wbr>to:<wbr>"</wbr></wbr></wbr></span></span><span>+s);<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr>String<wbr>getState(){<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">return</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">this</span></strong></span><span>.state;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr>IFMemento<wbr>createMemento(){<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">return</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">new</span></strong></span><span><wbr>Memento(state);<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>restore(IFMemento<wbr>m){<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>Memento<wbr>mt=(Memento)m;<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">this</span></strong></span><span>.state=mt.getState();<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">private</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">class</span></strong></span><span><wbr>Memento<wbr></wbr></wbr></span><span><strong><span style="color:#006699">implements</span></strong></span><span><wbr>IFMemento{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">private</span></strong></span><span><wbr>String<wbr>state;<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr>Memento(String<wbr>s){<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">this</span></strong></span><span>.state=s;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr>String<wbr>getState(){<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">return</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">this</span></strong></span><span>.state;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">class</span></strong></span><span><wbr>Caretaker{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">private</span></strong></span><span><wbr>IFMemento<wbr>m;<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr>IFMemento<wbr>retrieve(){<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">return</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">this</span></strong></span><span>.m;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">public</span></strong></span><span><wbr></wbr></span><span><strong><span style="color:#006699">void</span></strong></span><span><wbr>save(IFMemento<wbr>m){<wbr><wbr></wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">this</span></strong></span><span>.m=m;<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span>}<wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><strong><span style="color:#006699">interface</span></strong></span><span><wbr>IFMemento{<wbr><wbr></wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li> <span><wbr><wbr></wbr></wbr></span> </li> <li><span><span>}<wbr><wbr></wbr></wbr></span> </span></li> </ol> </div> <p></p> <ol><li> <span><wbr><wbr></wbr></wbr></span> </li></ol></wbr></wbr>
1314

被折叠的 条评论
为什么被折叠?



