创建模式

1.工厂方法模式(Factory Method)  将程序中创建对象的操作,单独出来处理,创建一个产品的工厂接口,把实际的工作转移到具体的子类。大大提高了系统扩展的柔性,接口的抽象化处理给相互依赖的对象创建提供了最好的抽象模式。

[java] view plain copy print ?
  1. public class TestFactoryMethod {
  2. public static void main(String[] args) {
  3. AnimalFactory af=new DogFactory();
  4. Animal1 a=af.getAnimal();
  5. }
  6. }
  7. abstract class Animal1{}
  8. class Dog1 extends Animal1{}
  9. class Cat1 extends Animal1{}
  10. abstract class AnimalFactory{
  11. public abstract Animal1 getAnimal();
  12. }
  13. class DogFactory extends AnimalFactory{
  14. public Animal1 getAnimal(){
  15. System.out.println("Dog");
  16. return new Dog1();
  17. }
  18. }
  19. class CatFactory extends AnimalFactory{
  20. public Animal1 getAnimal(){
  21. System.out.println("Cat");
  22. return new Cat1();
  23. }
  24. }
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();
}
} 

2.抽象工厂模式(Abstract Factory) 针对多个产品等级的情况,而工厂方法模式针对单一产品等级的情况。

[java] view plain copy print ?
  1. import java.awt.*;
  2. import javax.swing.*;
  3. import java.awt.event.*;
  4. public class TestAbstractFactory {
  5. public static void main(String[] args) {
  6. GUIFactory fact=new SwingFactory();
  7. Frame f=fact.getFrame();
  8. Component c1=fact.getButton();
  9. Component c2=fact.getTextField();
  10. f.setSize(500,300);
  11. f.setLayout(new FlowLayout());
  12. f.add(c1);
  13. f.add(c2);
  14. f.setVisible(true);
  15. f.addWindowListener(new WindowAdapter(){
  16. public void windowClosing(WindowEvent e){
  17. System.exit(0);
  18. }
  19. });
  20. }
  21. }
  22. abstract class GUIFactory{
  23. public abstract Component getButton();
  24. public abstract Component getTextField();
  25. public abstract Frame getFrame();
  26. }
  27. class AWTFactory extends GUIFactory{
  28. public Component getButton() {
  29. return new Button("AWT Button");
  30. }
  31. public Frame getFrame() {
  32. return new Frame("AWT Frame");
  33. }
  34. public Component getTextField() {
  35. return new TextField(20);
  36. }
  37. }
  38. class SwingFactory extends GUIFactory{
  39. public Component getButton() {
  40. return new JButton("Swing Button");
  41. }
  42. public Frame getFrame() {
  43. return new JFrame("Swing Frame");
  44. }
  45. public Component getTextField() {
  46. return new JTextField(20);
  47. }
  48. }
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方法要加同步 饿汉式比懒汉式要好,尽管资源利用率要差。但是不用同步。

[java] view plain copy print ?
  1. public class TestSingleton {
  2. public static void main(String[] args) {
  3. }
  4. }
  5. class ClassA{ //饿汉式
  6. private static ClassA i=new ClassA();
  7. public static ClassA newInstance(){
  8. return i;
  9. }
  10. private ClassA(){}
  11. }
  12. class ClassB{ //懒汉式
  13. private static ClassB i=null;
  14. public static synchronized ClassB newInstance(){
  15. if (i==null) i=new ClassB();
  16. return i;
  17. }
  18. private ClassB(){}
  19. }
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) 将一个对象的内部表象和建造过程分割,一个建造过程可以造出不同表象的对象。可简化为模版方法模式.

[java] view plain copy print ?
  1. public class TestBuilder {
  2. public static void main(String[] args) {
  3. Builder b=new BuilderImpl1();
  4. Director d=new Director(b);
  5. Product p=d.createProduct();
  6. }
  7. }
  8. interface Builder{
  9. void buildPart1();
  10. void buildPart2();
  11. void buildPart3();
  12. Product getProduct();
  13. }
  14. class BuilderImpl1 implements Builder{
  15. public void buildPart1() {
  16. System.out.println("create part1");
  17. }
  18. public void buildPart2() {
  19. System.out.println("create part2");
  20. }
  21. public void buildPart3() {
  22. System.out.println("create part3");
  23. }
  24. public Product getProduct() {
  25. return new Product();
  26. }
  27. }
  28. class Director{
  29. Builder b;
  30. public Director(Builder b){
  31. this.b=b;
  32. }
  33. public Product createProduct(){
  34. b.buildPart1(); b.buildPart2();
  35. b.buildPart3();
  36. return b.getProduct();
  37. }
  38. }
  39. class Product{}
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()方法的实现细节,这就是简单原型模式的应用。  浅拷贝:只拷贝简单属性的值和对象属性的地址  深拷贝:拷贝本对象引用的对象,有可能会出现循环引用的情况。可以用串行化解决深拷贝。写到流里再读出来,这时会是一个对象的深拷贝结果。

[java] view plain copy print ?
  1. import java.io.*;
  2. public class TestClonealbe {
  3. public static void main(String[] args) throws Exception {
  4. Father f=new Father();
  5. User u1=new User("123456",f);
  6. User u2=(User)u1.clone();
  7. System.out.println(u1==u2);
  8. System.out.println(u1.f==u2.f);
  9. }
  10. }
  11. class User implements Cloneable,Serializable{
  12. String password;
  13. Father f;
  14. public User(String password,Father f){
  15. this.password=password;
  16. this.f=f;
  17. }
  18. public Object clone() throws CloneNotSupportedException {
  19. //return super.clone();
  20. ObjectOutputStream out=null;
  21. ObjectInputStream in=null;
  22. try {
  23. ByteArrayOutputStream bo=new ByteArrayOutputStream();
  24. out = new ObjectOutputStream(bo);
  25. out.writeObject(this);
  26. out.flush();
  27. byte[] bs=bo.toByteArray();
  28. ByteArrayInputStream bi=new ByteArrayInputStream(bs);
  29. in = new ObjectInputStream(bi);
  30. Object o=in.readObject();
  31. return o;
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. return null;
  35. } catch (ClassNotFoundException e) {
  36. e.printStackTrace();
  37. return null;
  38. }
  39. finally{
  40. try {
  41. out.close();
  42. in.close();
  43. } catch (IOException e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. }
  48. }
  49. class Father implements Serializable{}
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 CloneNotSupportedException {
//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{}

结构模式 如何把简单的类根据某种结构组装为大的系统

6.适配器模式(Adapter) 在原类型不做任何改变的情况下,用一个适配器类把一个接口转成另一个接口,扩展了新的接口,灵活且多样的适配一切旧俗。这种打破旧框框,适配新格局的思想,是面向对象的精髓。以继承方式实现的类的 Adapter模式和以聚合方式实现的对象的Adapter模式,各有千秋,各取所长。

[java] view plain copy print ?
  1. public class TestAdapter {
  2. public static void main(String[] args) {
  3. USB mouse=new Mouse();
  4. PC pc=new PC();
  5. //pc.useMouse(mouse);
  6. PS2 adapter=new USB2PS2Adapter(mouse);
  7. pc.useMouse(adapter);
  8. }
  9. }
  10. interface PS2{
  11. void usePs2();
  12. }
  13. interface USB{
  14. void useUsb();
  15. }
  16. class Mouse implements USB{
  17. public void useUsb(){
  18. System.out.println("通过USB接口工作");
  19. }
  20. }
  21. class PC{
  22. public void useMouse(PS2 ps2Mouse){
  23. ps2Mouse.usePs2();
  24. }
  25. }
  26. class USB2PS2Adapter implements PS2{
  27. private USB usb;
  28. public USB2PS2Adapter(USB usb) {
  29. this.usb = usb;
  30. }
  31. public void usePs2(){
  32. System.out.println("把对usePS2的方法调用转换成对useUSB的方法调用");
  33. usb.useUsb();
  34. }
  35. }
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();
}
} 

7.组合模式(Composite) 把整体和局部的关系用树状结构描述出来,使得客户端把整体对象和局部对象同等看待。

[java] view plain copy print ?
  1. import java.util.*;
  2. public class TestComposite {
  3. public static void main(String[] args) {
  4. Node n1=new LeafNode(3);
  5. Node n2=new LeafNode(4);
  6. Node n3=new LeafNode(6);
  7. Node n4=new LeafNode(5);
  8. Node n5=new LeafNode(2);
  9. Node n6=new LeafNode(9);
  10. Node n7=new LeafNode(12);
  11. Node n8=new LeafNode(7);
  12. Node n9=new LeafNode(8);
  13. Node c1=new CompositeNode(n1,n2,n3);
  14. Node c4=new CompositeNode(n8,n9);
  15. Node c3=new CompositeNode(n5,c4);
  16. Node c2=new CompositeNode(n4,c3);
  17. Node c5=new CompositeNode(n6,n7);
  18. Node root=new CompositeNode(c1,c2,c5);
  19. System.out.println(root.getValue());
  20. }
  21. }
  22. abstract class Node{
  23. public abstract int getValue();
  24. }
  25. class LeafNode extends Node{
  26. int value;
  27. public LeafNode(int value){
  28. this.value=value;
  29. }
  30. public int getValue(){
  31. return value;
  32. }
  33. }
  34. class CompositeNode extends Node{
  35. private List children=new ArrayList();
  36. public CompositeNode(Node... nodes){
  37. for(Node n:nodes){
  38. children.add(n);
  39. }
  40. }
  41. public int getValue(){
  42. int result=0;
  43. for(Node n:children){
  44. result+=n.getValue();
  45. }
  46. return result;
  47. }
  48. }
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) 以对客户透明的方式来扩展对象的功能。 用户根据功能需求随意选取组成对象的成分,通过方法的链式调用来实现。 可以给对象动态的增加功能,比继承灵活性更大。

[java] view plain copy print ?
  1. public class TestDecorator {
  2. public static void main(String[] args) {
  3. Teacher t1=new SimpleTeacher();
  4. Teacher t2=new CppTeacher(t1);
  5. Teacher t3=new JavaTeacher(t2);
  6. t3.teach();
  7. //t.teach();
  8. }
  9. }
  10. abstract class Teacher{
  11. public abstract void teach();
  12. }
  13. class SimpleTeacher extends Teacher{
  14. public void teach(){
  15. System.out.println("Good Good Study, Day Day Up");
  16. }
  17. }
  18. class JavaTeacher extends Teacher{
  19. Teacher teacher;
  20. public JavaTeacher(Teacher t){
  21. this.teacher=t;
  22. }
  23. public void teach(){
  24. teacher.teach();
  25. System.out.println("Teach Java");
  26. }
  27. }
  28. class CppTeacher extends Teacher{
  29. Teacher teacher;
  30. public CppTeacher(Teacher t){
  31. this.teacher=t;
  32. }
  33. public void teach(){
  34. teacher.teach();
  35. System.out.println("Teach C++");
  36. }
  37. }
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) 对象的状态分为内蕴状态和外蕴状态。内蕴状态不随环境变化而变化,因此可以作成系统共享.

11.门面模式(Facade) 访问子系统的时候,通过一个Façade对象访问。Facade类是单例的。 客户代码只需要和门面对象通信,不需要和具体子系统内部的对象通信,使得他们之间的耦合关系减弱。 这次将表现层和逻辑层隔离,封装底层的复杂处理,为用户提供简单的接口,这样的例子随处可见。

门面模式很多时候更是一种系统架构的设计,在我所做的项目中,就实现了门面模式的接口,为复杂系统的解耦提供了最好的解决方案。

12.桥梁模式(Bridge) 将抽象和实现脱耦,使得二者可以单独变化。使得一个继承关系不承担两个变化因素.使用合成来代替继承的一种体现.

[java] view plain copy print ?
  1. public YuanUser(BankAccount account) {
  2. super(account);
  3. }
  4. public void getMoney() {
  5. System.out.print("人民币");
  6. account.withdraw();
  7. }
  8. public void saveMoney() {
  9. System.out.print("人民币");
  10. account.deposit();
  11. }
  12. }
  13. class DollarUser extends BankUser{
  14. public DollarUser(BankAccount account) {
  15. super(account);
  16. }
  17. public void getMoney() {
  18. System.out.print("美元");
  19. account.withdraw();
  20. }
  21. public void saveMoney() {
  22. System.out.print("美元");
  23. account.deposit();
  24. }
  25. }
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();
}
} 

行为模式 描述如何在对象之间划分责任

13.策略模式(Strategy) 如同LayoutManager和具体的布局管理器的关系,在抽象策略类中定义方法,将易于变化的部分封装为接口,通常Strategy 封装一些运算法则,使之能互换。Bruce Zhang在他的博客中提到策略模式其实是一种“面向接口”的编程方法,真是恰如其分。 在具体策略子类中实现,客户代码根据不同的需要选择相应的具体类,例如电子商务中多种价格算法。 一种策略一旦选中,整个系统运行期是不变化的

[java] view plain copy print ?
  1. public class TestStrategy {
  2. public static void main(String[] args) {
  3. Strategy s1=new May1Strategy();
  4. Strategy s2=new June1Strategy();
  5. Book b=new Book(100);
  6. b.setS(s2);
  7. System.out.println(b.getPrice());
  8. }
  9. }
  10. class Book{
  11. Strategy s;
  12. public Book(double price){
  13. this.price=price;
  14. }
  15. private double price;
  16. public void setS(Strategy s) {
  17. this.s = s;
  18. }
  19. public double getPrice(){
  20. return price*s.getZheKou();
  21. }
  22. }
  23. interface Strategy{
  24. double getZheKou();
  25. }
  26. class May1Strategy implements Strategy{
  27. public double getZheKou(){
  28. return 0.8;
  29. }
  30. }
  31. class June1Strategy implements Strategy{
  32. public double getZheKou(){
  33. return 0.7;
  34. }
  35. }
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;
}
} 

14.模板方法(Template Method) 准备一个抽象类,把部分确定的逻辑定义在某些方法中,用其他抽象方法实现剩余的逻辑。不同子类对这些逻辑有不同的实现。 用法:定义多个抽象操作,定义并实现一个模板方法,将步骤放在这个具体方法里,推迟到子类实现。子类可以改变父类的可变部分,但不能改变模板方法所代表的顶级逻辑。

[java] view plain copy print ?
  1. public class TestTemplateMethod {
  2. public static void main(String[] args) {
  3. XiaoPin xp=new DaPuKe();
  4. xp.act();
  5. }
  6. }
  7. abstract class XiaoPin{
  8. public abstract void jiaoLiu();
  9. public abstract void xuShi();
  10. public abstract void gaoXiao();
  11. public abstract void shanQing();
  12. public final void act(){
  13. jiaoLiu();
  14. xuShi();
  15. gaoXiao();
  16. shanQing();
  17. }
  18. }
  19. class DaPuKe extends XiaoPin{
  20. public void jiaoLiu(){
  21. System.out.println("顺口溜");
  22. }
  23. public void xuShi(){
  24. System.out.println("火车除夕,老同学见面");
  25. }
  26. public void gaoXiao(){
  27. System.out.println("名片当作扑克");
  28. }
  29. public void shanQing(){
  30. System.out.println("马家军");
  31. }
  32. }
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("马家军");
}
} 

15.观察者模式(Observer) 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。观察者和被观察者的分开,为模块划分提供了清晰的界限。在低耦合的对象间完成协调。 Java中的事件模型就是一个应用。

16.迭代器模式(Iterator) 类似于集合中的Iterator,使用迭代器来统一不同集合对象的遍历方式。在绝大多数的系统中,都会用到数组、集合、链表、队列这样的类型,关心迭代模式的来龙去脉非常有必要。在遍历算法中,迭代模式提供了遍历的顺序访问容 器,GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。.NET中就是使用了迭代器来 创建用于foreach的集合。

[java] view plain copy print ?
  1. public class TestIterator {
  2. public static void main(String[] args) {
  3. Stack s=new Stack();
  4. s.push("Liucy");
  5. s.push("Huxz");
  6. s.push("George");
  7. LinkedList l=new LinkedList();
  8. l.addFirst("Liucy");
  9. l.addFirst("Huxz");
  10. l.addFirst("George");
  11. print(l.iterator());
  12. }
  13. public static void print(Itr it){
  14. while(it.hasNext()){
  15. System.out.println(it.next());
  16. }
  17. }
  18. }
  19. interface Itr{
  20. boolean hasNext();
  21. Object next();
  22. }
  23. class Stack{
  24. Object[] os=new Object[10];
  25. int index=0;
  26. private void expand(){
  27. Object[] os2=new Object[os.length*2];
  28. System.arraycopy(os,0,os2,0,os.length);
  29. os=os2;
  30. }
  31. public void push(Object o){
  32. if (index==os.length) expand();
  33. os[index]=o;
  34. index++;
  35. }
  36. public Object pop(){
  37. index--;
  38. Object o=os[index];
  39. os[index]=null;
  40. return o;
  41. }
  42. private class StackItr implements Itr{
  43. int cursor=0;
  44. public boolean hasNext(){
  45. return cursor}
  46. public Object next(){
  47. return os[cursor++];
  48. }
  49. }
  50. public Itr iterator(){
  51. return new StackItr();
  52. }
  53. }
  54. class LinkedList{
  55. private class Node{
  56. Object o;
  57. Node next;
  58. public Node(Object o){
  59. this.o=o;
  60. }
  61. public void setNext(Node next){
  62. this.next=next;
  63. }
  64. public Node getNext(){
  65. return this.next;
  66. }
  67. }
  68. Node head;
  69. public void addFirst(Object o){
  70. Node n=new Node(o);
  71. n.setNext(head);
  72. head=n;
  73. }
  74. public Object removeFirst(){
  75. Node n=head;
  76. head=head.getNext();
  77. return n.o;
  78. }
  79. class LinkedListItr implements Itr{
  80. Node currentNode=head;
  81. public boolean hasNext(){
  82. return this.currentNode!=null;
  83. }
  84. public Object next(){
  85. Node n=currentNode;
  86. currentNode=currentNode.getNext();
  87. return n.o;
  88. }
  89. }
  90. public Itr iterator(){
  91. return new LinkedListItr();
  92. }
  93. }
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();
}
} 

17.责任链(Chain of Responsibility) 多个处理器对象连成一串,请求在这条链上传递,由该处理这个请求的处理器来处理。发出请求的客户端并不知道哪个对象处理请求。

[java] view plain copy print ?
  1. public class TestChain {
  2. public static void main(String[] args) {
  3. String pass1="123456";
  4. String pass2="123456";
  5. String personId="123456789012345678";
  6. String email="chmask@163.com";
  7. register(pass1,pass2,personId,email);
  8. }
  9. public static void register(String pass1,String pass2,String personId,String email){
  10. Filter f1=new PasswordFilter1();
  11. Filter f2=new PasswordFilter2();
  12. Filter f3=new PersonIdFilter();
  13. Filter f4=new EmailFilter();
  14. f1.setNext(f2);
  15. f2.setNext(f3);
  16. f3.setNext(f4);
  17. System.out.println(f1.doFilter(pass1,pass2,personId,email));
  18. }
  19. }
  20. abstract class Filter{
  21. Filter next=null;
  22. public Filter getNext() {
  23. return next;
  24. }
  25. public void setNext(Filter next) {
  26. this.next = next;
  27. }
  28. public String doFilter(String pass1,String pass2,String personId,String email){
  29. if (next==null) return "成功";
  30. else return next.doFilter(pass1,pass2,personId,email);
  31. }
  32. }
  33. class PasswordFilter1 extends Filter{
  34. public String doFilter(String pass1,String pass2,String personId,String email){
  35. if (!(pass1.equals(pass2)))
  36. return "两次密码输入不一致";
  37. else return super.doFilter(pass1,pass2,personId,email);
  38. }
  39. }
  40. class PasswordFilter2 extends Filter{
  41. public String doFilter(String pass1,String pass2,String personId,String email){
  42. if (pass1.length()!=6)
  43. return "密码长度必须为6";
  44. else return super.doFilter(pass1,pass2,personId,email);
  45. }
  46. }
  47. class PersonIdFilter extends Filter{
  48. public String doFilter(String pass1,String pass2,String personId,String email){
  49. if (personId.length()!=15 && personId.length()!=18)
  50. return "身份证号码非法";
  51. else return super.doFilter(pass1,pass2,personId,email);
  52. }
  53. }
  54. class EmailFilter extends Filter{
  55. public String doFilter(String pass1,String pass2,String personId,String email){
  56. int i1=email.indexOf("@");
  57. int i2=email.indexOf(".");
  58. if (i1==-1 || i2==-1 || i2-i1<=1 || i1==0 || i2==email.length()-1)
  59. return "email非法";
  60. else return super.doFilter(pass1,pass2,personId,email);
  61. }
  62. }
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);
}
} 

18.状态模式(State) 在对象内部状态改变时改变其行为。把所研究的对象的行为封装在不同的状态对象中。

[java] view plain copy print ?
  1. import static java.lang.System.*;
  2. public class TestState {
  3. public static void main(String[] args) {
  4. BBSUser u=new BBSUser();
  5. u.setState(new GuestState());
  6. u.publish();
  7. u.setState(new NormalState());
  8. u.publish();
  9. u.setState(new BlockedState());
  10. u.publish();
  11. u.setState(new NewComerState());
  12. u.publish();
  13. }
  14. }
  15. class BBSUser{
  16. private State state;
  17. public void setState(State state){
  18. this.state=state;
  19. }
  20. public void publish(){
  21. state.action();
  22. }
  23. }
  24. abstract class State{
  25. public abstract void action();
  26. }
  27. class GuestState extends State{
  28. public void action(){
  29. out.println("您处在游客状态,请先登录");
  30. }
  31. }
  32. class NormalState extends State{
  33. public void action(){
  34. out.println("您处在正常状态,文章发表成功");
  35. }
  36. }
  37. class BlockedState extends State{
  38. public void action(){
  39. out.println("您处在被封状态,文章发表失败");
  40. }
  41. }
  42. class NewComerState extends State{
  43. public void action(){
  44. out.println("您是新手,请先学习一下,3天后再来");
  45. }
  46. }
  47. class StateFactory{
  48. public static State createState(int i){
  49. if (i==1) return new GuestState();
  50. else return new NormalState();
  51. }
  52. }
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();
}
} 

19.备忘录模式(Memento) 备忘录对象用来存储另一个对象的快照对象,保存其内部状态,使得可以随时恢复。 备忘录角色:保存发起人对象的内部状态,保护内容不被除发起人对象之外的对象获取。窄接口:负责人对象和其他对象看到的接口,只允许把备忘录对象传给其他对象。宽接口:发起人能看到的接口,允许读取内部状态。 发起人角色:创建并使用备忘录对象来保存其状态 负责人角色:负责保存备忘录对象。  白箱实现:备忘录类对其他类也可见,这样发起人的状态可能会存在安全问题。  黑箱实现:把备忘录类作成发起人的内部类,对外提供一个标识接口。

[java] view plain copy print ?
  1. public class TestMemento{
  2. public static void main(String[] args){
  3. Originator ori=new Originator();
  4. Caretaker c=new Caretaker();
  5. ori.setState("State 1");
  6. IFMemento m=ori.createMemento();
  7. c.save(m);
  8. ori.setState("State 2");
  9. m=c.retrieve();
  10. ori.restore(m);
  11. System.out.println("Now State:"+ori.getState());
  12. }
  13. }
  14. class Originator{
  15. String state;
  16. public void setState(String s){
  17. state=s;
  18. System.out.println("State change to: "+s);
  19. }
  20. public String getState(){
  21. return this.state;
  22. }
  23. public IFMemento createMemento(){
  24. return new Memento(state);
  25. }
  26. public void restore(IFMemento m){
  27. Memento mt=(Memento)m;
  28. this.state=mt.getState();
  29. }
  30. private class Memento implements IFMemento{
  31. private String state;
  32. public Memento(String s){
  33. this.state=s;
  34. }
  35. public String getState(){
  36. return this.state;
  37. }
  38. }
  39. }
  40. class Caretaker{
  41. private IFMemento m;
  42. public IFMemento retrieve(){
  43. return this.m;
  44. }
  45. public void save(IFMemento m){
  46. this.m=m;
  47. }
  48. }
  49. interface IFMemento{
  50. }
public class TestMemento{
public static void main(String[] args){
Originator ori=new Originator();
Caretaker c=new Caretaker();
ori.setState("State 1");
IFMemento m=ori.createMemento();
c.save(m);
ori.setState("State 2");
m=c.retrieve();
ori.restore(m);
System.out.println("Now State:"+ori.getState());
}
}
class Originator{
String state;
public void setState(String s){
state=s;
System.out.println("State change to: "+s);
}
public String getState(){
return this.state;
}
public IFMemento createMemento(){
return new Memento(state);
}
public void restore(IFMemento m){
Memento mt=(Memento)m;
this.state=mt.getState();
}
private class Memento implements IFMemento{
private String state;
public Memento(String s){
this.state=s;
}
public String getState(){
return this.state;
}
}
}
class Caretaker{
private IFMemento m;
public IFMemento retrieve(){
return this.m;
}
public void save(IFMemento m){
this.m=m;
}
}
interface IFMemento{
}

转自:http://blog.csdn.net/chmask/article/details/2631485
补(设计模式uml图):
http://wenku.baidu.com/view/516ee76baf1ffc4ffe47ac52.html
http://wenku.baidu.com/view/aa15db3e5727a5e9856a615e.html

java设计模式示例相关推荐

  1. java 设计模式 示例_Java中的状态设计模式–示例教程

    java 设计模式 示例 状态模式是行为设计模式之一 . 当对象根据其内部状态更改其行为时,将使用状态设计模式. 如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量,并使用if-else条件 ...

  2. java 设计模式 示例_Java中的访问者设计模式–示例教程

    java 设计模式 示例 访客模式是行为设计模式之一 . 当我们必须对一组相似类型的对象执行操作时,将使用访问者模式. 借助访问者模式,我们可以将操作逻辑从对象移动到另一个类. 例如,假设有一个购物车 ...

  3. java 设计模式 示例_Java中的中介器设计模式-示例教程

    java 设计模式 示例 中介者模式是行为设计模式之一 ,因此它处理对象的行为. 中介器设计模式用于在系统中不同对象之间提供集中式通信介质. 根据GoF,中介者模式意图是: 通过封装不同对象集相互交互 ...

  4. java 设计模式 示例_Java中的策略设计模式-示例教程

    java 设计模式 示例 策略模式是行为设计模式之一 . 当我们对一个特定的任务有多种算法并且客户决定在运行时使用的实际实现时,将使用策略模式. 策略模式也称为策略模式 . 我们定义了多种算法,并让客 ...

  5. Java设计模式 - 示例教程

    Java设计模式 - 示例教程 设计模式在软件开发人员中非常流行.设计模式是针对常见软件问题的良好描述的解决方案.我已经写了很多关于java设计模式的文章.您可以订阅我们的时事通讯下载PDF电子书(1 ...

  6. java 设计模式 示例_Java设计模式–示例教程

    java 设计模式 示例 Design Patterns are very popular among software developers. A design pattern is a well- ...

  7. java 设计模式 示例_Java示例中的装饰器设计模式

    java 设计模式 示例 Decorator design pattern is used to modify the functionality of an object at runtime. A ...

  8. java 观察者模式示例_观察者设计模式示例

    java 观察者模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如 ...

  9. java 观察者模式示例_Java中的观察者设计模式-示例教程

    java 观察者模式示例 观察者模式是行为设计模式之一 . 当您对对象的状态感兴趣并希望在发生任何更改时得到通知时,观察者设计模式很有用. 在观察者模式中,监视另一个对象状态的对象称为Observer ...

最新文章

  1. OKR 和 KPI 的适用场景
  2. go和python计算字节数组sha1
  3. 使用tab键分割的文章能快速转换成表格。( )_电脑上Tab键的8种超强用法,每一个都让人大开眼界!...
  4. [agc014d] Black and White Tree(玄学树D)
  5. 面试题鬼的很:Class.forName 和 ClassLoader 有什么区别?
  6. 虚拟机(VMware Workstation)中,把连接网络的模式由“NAT模式”,改成“自动桥接模式”,网速大大的提升...
  7. P3714 [BJOI2017]树的难题(点分治/线段树/单调队列)
  8. java 读取ppt文件_java使用poi读取ppt文件和poi读取excel、word示例
  9. ffmpeg 截图太模糊了_PPT图片模糊?导师说放大!
  10. java.util (Collection接口和Map接口)
  11. matlab中size(A 2),MATLAB中size(A,2)什么意思
  12. 启动后显示不了数据_90后都买不起房?统计数据显示:90后成了城市租房主力!...
  13. Qt5类之QLine and QLineF
  14. 纯新手DSP编程--5.30--DSP/BIOS线程
  15. 每周荐书(京东篇):618取胜之道、质量保障、技术解密
  16. jquery 获取父窗口的元素、父窗口、子窗口
  17. 飙泪怀旧:那些经典的老软件、老网站
  18. python数字大小写转换代码_把金额小写转换成大写的Python代码
  19. 川大计算机学硕调剂专硕,19双非考研川大计算机学院专硕经验~
  20. m计算机代表什么意思,计算器上的m+是什么意思

热门文章

  1. 阿里云 安骑士基础版和企业版的区别
  2. InDesign 教程:如何在 InDesign 中使用的不同类型的框架?
  3. 《月亮与六便士》-- 威廉·萨默塞特·毛姆
  4. 计算机销售实践报告总结报告,计算机实践报告总结.docx
  5. 211材料不如专科计算机,从专科到211,我只顾风雨兼程
  6. 图片转文字怎么在线转换?分享几个好用的方法
  7. BizBlocks推出结合了区块链技术的硬件钱包安全平台
  8. SwiftUI 仿头条工具条和内容联动切换TabView (教程含源码)
  9. dede关键词维护自动加内链锚文本
  10. 芯片+步进电机档位控制实验