From f88b788bb779b849bb44994bf0a9ede521de9a16 Mon Sep 17 00:00:00 2001 From: liyazhou Date: 2018年3月23日 17:34:20 +0800 Subject: [PATCH 01/13] factory iterator --- .gitignore | 1 + .../abstractfactory/AbstractFactory.java | 119 ++++++++++-------- .../abstractfactory/iterator/IIterator.java | 6 +- .../iterator/IIteratorFactory.java | 7 +- .../iterator/IteratorCollection.java | 31 +++-- .../iterator/IteratorFactory.java | 21 ++-- .../abstractfactory/iterator/IteratorMap.java | 31 +++-- .../abstractfactory/iterator/TestUse.java | 33 ++--- .../factorymethod/ArrayList.java | 73 ++++++----- .../factorymethod/FactoryMethod.java | 69 +++++----- .../designpattern/factorymethod/LinkList.java | 103 ++++++++------- .../designpattern/factorymethod/List.java | 5 +- .../designpattern/factorymethod/TestUse.java | 39 +++--- .../simplefactory/SimpleFactory.java | 55 ++++---- .../singleton/EnumSingleton.java | 5 +- .../singleton/SimpleSingleton.java | 20 +-- 16 files changed, 343 insertions(+), 275 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1adc831 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +# Created by .ignore support plugin (hsz.mobi) \ No newline at end of file diff --git a/src/com/anxpp/designpattern/abstractfactory/AbstractFactory.java b/src/com/anxpp/designpattern/abstractfactory/AbstractFactory.java index 75dc28c..6c2a889 100644 --- a/src/com/anxpp/designpattern/abstractfactory/AbstractFactory.java +++ b/src/com/anxpp/designpattern/abstractfactory/AbstractFactory.java @@ -1,72 +1,85 @@ package com.anxpp.designpattern.abstractfactory; + //抽象工厂模式 public class AbstractFactory { - public static void main(String args[]){ - IFactory bigfactory = new BigFactory(); - IFactory smallfactory = new BigFactory(); - bigfactory.producePhone().run(); - bigfactory.produceHeadset().play(); - smallfactory.producePhone().run(); - smallfactory.produceHeadset().play(); - } + public static void main(String args[]) { + IFactory bigfactory = new BigFactory(); + IFactory smallfactory = new BigFactory(); + bigfactory.producePhone().run(); + bigfactory.produceHeadset().play(); + smallfactory.producePhone().run(); + smallfactory.produceHeadset().play(); + } } + //抽象产品*2 -interface Headset{ - void play(); +interface Headset { + void play(); } + //抽象产品 -interface MeizuPhone{ - void run(); +interface MeizuPhone { + void run(); } + //具体产品*2*2 -class PRO5 implements MeizuPhone{ - @Override - public void run() { - System.out.println("我是一台PRO5"); - } +class PRO5 implements MeizuPhone { + @Override + public void run() { + System.out.println("我是一台PRO5"); + } } -class MX5 implements MeizuPhone{ - @Override - public void run() { - System.out.println("我是一台MX5"); - } + +class MX5 implements MeizuPhone { + @Override + public void run() { + System.out.println("我是一台MX5"); + } } -class EP21 implements Headset{ - @Override - public void play() { - System.out.println("我是一副EP21"); - } + +class EP21 implements Headset { + @Override + public void play() { + System.out.println("我是一副EP21"); + } } -class EP30 implements Headset{ - @Override - public void play() { - System.out.println("我是一台EP30"); - } + +class EP30 implements Headset { + @Override + public void play() { + System.out.println("我是一台EP30"); + } } + //抽象工厂 -interface IFactory{ - MeizuPhone producePhone(); - Headset produceHeadset(); +interface IFactory { + MeizuPhone producePhone(); + + Headset produceHeadset(); } + //具体工厂*2 -class BigFactory implements IFactory{ - @Override - public MeizuPhone producePhone() { - return new PRO5(); - } - @Override - public Headset produceHeadset() { - return new EP30(); - } +class BigFactory implements IFactory { + @Override + public MeizuPhone producePhone() { + return new PRO5(); + } + + @Override + public Headset produceHeadset() { + return new EP30(); + } } + //具体工厂*2 -class SmallFactory implements IFactory{ - @Override - public MeizuPhone producePhone() { - return new MX5(); - } - @Override - public Headset produceHeadset() { - return new EP21(); - } +class SmallFactory implements IFactory { + @Override + public MeizuPhone producePhone() { + return new MX5(); + } + + @Override + public Headset produceHeadset() { + return new EP21(); + } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/abstractfactory/iterator/IIterator.java b/src/com/anxpp/designpattern/abstractfactory/iterator/IIterator.java index 0daf2bd..e8596de 100644 --- a/src/com/anxpp/designpattern/abstractfactory/iterator/IIterator.java +++ b/src/com/anxpp/designpattern/abstractfactory/iterator/IIterator.java @@ -1,6 +1,8 @@ package com.anxpp.designpattern.abstractfactory.iterator; + //抽象产品 public interface IIterator { - boolean hasNext(); - Object next(); + boolean hasNext(); + + Object next(); } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/abstractfactory/iterator/IIteratorFactory.java b/src/com/anxpp/designpattern/abstractfactory/iterator/IIteratorFactory.java index fbc4ce7..9a1a7fe 100644 --- a/src/com/anxpp/designpattern/abstractfactory/iterator/IIteratorFactory.java +++ b/src/com/anxpp/designpattern/abstractfactory/iterator/IIteratorFactory.java @@ -1,8 +1,11 @@ package com.anxpp.designpattern.abstractfactory.iterator; + import java.util.Collection; import java.util.Map; + //抽象工厂 public interface IIteratorFactory { - IIterator iteratorMap(Map m); - IIterator iteratorCollection(Collection c); + IIterator iteratorMap(Map m); + + IIterator iteratorCollection(Collection c); } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/abstractfactory/iterator/IteratorCollection.java b/src/com/anxpp/designpattern/abstractfactory/iterator/IteratorCollection.java index 6634006..67ca5d4 100644 --- a/src/com/anxpp/designpattern/abstractfactory/iterator/IteratorCollection.java +++ b/src/com/anxpp/designpattern/abstractfactory/iterator/IteratorCollection.java @@ -1,18 +1,23 @@ package com.anxpp.designpattern.abstractfactory.iterator; + import java.util.Collection; import java.util.Iterator; + //具体产品,Collection迭代器(用到了代理模式) -public class IteratorCollection implements IIterator{ - Iterator iterator; - public IteratorCollection(Collection c){ - iterator = c.iterator(); - } - @Override - public boolean hasNext() { - return iterator.hasNext(); - } - @Override - public T next() { - return iterator.next(); - } +public class IteratorCollection implements IIterator { + Iterator iterator; + + public IteratorCollection(Collection c) { + iterator = c.iterator(); + } + + @Override + public boolean hasNext() { + return iterator.hasNext(); + } + + @Override + public T next() { + return iterator.next(); + } } diff --git a/src/com/anxpp/designpattern/abstractfactory/iterator/IteratorFactory.java b/src/com/anxpp/designpattern/abstractfactory/iterator/IteratorFactory.java index 67ce67d..eed8220 100644 --- a/src/com/anxpp/designpattern/abstractfactory/iterator/IteratorFactory.java +++ b/src/com/anxpp/designpattern/abstractfactory/iterator/IteratorFactory.java @@ -1,14 +1,17 @@ package com.anxpp.designpattern.abstractfactory.iterator; + import java.util.Collection; import java.util.Map; + //具体工厂 -public class IteratorFactory implements IIteratorFactory{ - @Override - public IteratorMap iteratorMap(Map m) { - return new IteratorMap(m); - } - @Override - public IteratorCollection iteratorCollection(Collection c) { - return new IteratorCollection(c); - } +public class IteratorFactory implements IIteratorFactory { + @Override + public IteratorMap iteratorMap(Map m) { + return new IteratorMap(m); + } + + @Override + public IteratorCollection iteratorCollection(Collection c) { + return new IteratorCollection(c); + } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/abstractfactory/iterator/IteratorMap.java b/src/com/anxpp/designpattern/abstractfactory/iterator/IteratorMap.java index 21a9a42..22d1479 100644 --- a/src/com/anxpp/designpattern/abstractfactory/iterator/IteratorMap.java +++ b/src/com/anxpp/designpattern/abstractfactory/iterator/IteratorMap.java @@ -1,18 +1,23 @@ package com.anxpp.designpattern.abstractfactory.iterator; + import java.util.Iterator; import java.util.Map; + //具体产品,Map迭代器(用到了代理模式) -public class IteratorMap implements IIterator{ - Iterator
    > iterator; - public IteratorMap(Map m){ - iterator = m.entrySet().iterator(); - } - @Override - public boolean hasNext() { - return iterator.hasNext(); - } - @Override - public Object next() { - return iterator.next().getValue(); - } +public class IteratorMap implements IIterator { + Iterator
      > iterator; + + public IteratorMap(Map m) { + iterator = m.entrySet().iterator(); + } + + @Override + public boolean hasNext() { + return iterator.hasNext(); + } + + @Override + public Object next() { + return iterator.next().getValue(); + } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/abstractfactory/iterator/TestUse.java b/src/com/anxpp/designpattern/abstractfactory/iterator/TestUse.java index 2198fe7..90b31fa 100644 --- a/src/com/anxpp/designpattern/abstractfactory/iterator/TestUse.java +++ b/src/com/anxpp/designpattern/abstractfactory/iterator/TestUse.java @@ -4,22 +4,23 @@ import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; + //测试使用 public class TestUse { - public static void main(String args[]){ - IIteratorFactory factory = new IteratorFactory(); - Collection collection = new ArrayList(); - Map map = new LinkedHashMap(); - for(int i=0;i<10;i++){ - collection.add(i); - map.put(i, i); - } - IIterator iteratorCollection = factory.iteratorCollection(collection); - IIterator iteratorMap = factory.iteratorMap(map); - while(iteratorCollection.hasNext()) - System.out.print(iteratorCollection.next()); - System.out.println(); - while(iteratorMap.hasNext()) - System.out.print(iteratorMap.next()); - } + public static void main(String args[]) { + IIteratorFactory factory = new IteratorFactory(); + Collection collection = new ArrayList(); + Map map = new LinkedHashMap(); + for (int i = 0; i < 10; i++) { + collection.add(i); + map.put(i, i); + } + IIterator iteratorCollection = factory.iteratorCollection(collection); + IIterator iteratorMap = factory.iteratorMap(map); + while (iteratorCollection.hasNext()) + System.out.print(iteratorCollection.next()); + System.out.println(); + while (iteratorMap.hasNext()) + System.out.print(iteratorMap.next()); + } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/factorymethod/ArrayList.java b/src/com/anxpp/designpattern/factorymethod/ArrayList.java index 344a848..34d1ee3 100644 --- a/src/com/anxpp/designpattern/factorymethod/ArrayList.java +++ b/src/com/anxpp/designpattern/factorymethod/ArrayList.java @@ -1,36 +1,43 @@ package com.anxpp.designpattern.factorymethod; + //方便演示而实现的简陋的数组list -public class ArrayList implements List{ - private int size; //存放的元素个数,会默认初始化为0 - private Object[] defaultList; //使用数组存放元素 - private static final int defaultLength = 10;//默认长度 - public ArrayList(){ //默认构造函数 - defaultList = new Object[defaultLength]; - } - @Override - public Iterator iterator() { - return new MyIterator(); - } - //添加元素 - @Override - public boolean add(T t) { - if(size<=defaultlength){ - defaultList[size++] = t; - return true; - } - return false; - } - //遍历器 - private class MyIterator implements Iterator{ - private int next; - @Override - public boolean hasNext() { - return next implements List { + private int size; //存放的元素个数,会默认初始化为0 + private Object[] defaultList; //使用数组存放元素 + private static final int defaultLength = 10;//默认长度 + + public ArrayList() { //默认构造函数 + defaultList = new Object[defaultLength]; + } + + @Override + public Iterator iterator() { + return new MyIterator(); + } + + //添加元素 + @Override + public boolean add(T t) { + if (size <= defaultLength) { + defaultList[size++] = t; + return true; + } + return false; + } + + //遍历器 + private class MyIterator implements Iterator { + private int next; + + @Override + public boolean hasNext() { + return next < size; + } + + @SuppressWarnings("unchecked") + @Override + public T next() { + return (T) defaultList[next++]; + } + } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/factorymethod/FactoryMethod.java b/src/com/anxpp/designpattern/factorymethod/FactoryMethod.java index 6b48075..61e0e2e 100644 --- a/src/com/anxpp/designpattern/factorymethod/FactoryMethod.java +++ b/src/com/anxpp/designpattern/factorymethod/FactoryMethod.java @@ -1,44 +1,51 @@ package com.anxpp.designpattern.factorymethod; + //工厂方法模式 public class FactoryMethod { - public static void main(String args[]){ - IFactory bigfactory; - bigfactory = new SmallFactory(); - bigfactory.produce().run(); - bigfactory = new BigFactory(); - bigfactory.produce().run(); - } + public static void main(String args[]) { + IFactory bigfactory; + bigfactory = new SmallFactory(); + bigfactory.produce().run(); + bigfactory = new BigFactory(); + bigfactory.produce().run(); + } } + //抽象产品 -interface MeizuPhone{ - void run(); +interface MeizuPhone { + void run(); } + //具体产品*2 -class PRO5 implements MeizuPhone{ - @Override - public void run() { - System.out.println("我是一台PRO5"); - } +class PRO5 implements MeizuPhone { + @Override + public void run() { + System.out.println("我是一台PRO5"); + } } -class MX5 implements MeizuPhone{ - @Override - public void run() { - System.out.println("我是一台MX5"); - } + +class MX5 implements MeizuPhone { + @Override + public void run() { + System.out.println("我是一台MX5"); + } } -interface IFactory{ - MeizuPhone produce(); + +interface IFactory { + MeizuPhone produce(); } + //工厂*2 -class BigFactory implements IFactory{ - @Override - public MeizuPhone produce() { - return new PRO5(); - } +class BigFactory implements IFactory { + @Override + public MeizuPhone produce() { + return new PRO5(); + } } -class SmallFactory implements IFactory{ - @Override - public MeizuPhone produce() { - return new MX5(); - } + +class SmallFactory implements IFactory { + @Override + public MeizuPhone produce() { + return new MX5(); + } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/factorymethod/LinkList.java b/src/com/anxpp/designpattern/factorymethod/LinkList.java index 3ab4779..e54d126 100644 --- a/src/com/anxpp/designpattern/factorymethod/LinkList.java +++ b/src/com/anxpp/designpattern/factorymethod/LinkList.java @@ -1,50 +1,59 @@ package com.anxpp.designpattern.factorymethod; + //方便演示而实现的简陋的单向链表list -public class LinkList implements List{ - private int size; //存放的元素个数,会默认初始化为0 - private Node first; //首节点,默认初始化为null - @Override - public Iterator iterator() { - return new MyIterator(); - } - @Override - public boolean add(T t) { - if(size==0){ - first = new Node(t,null); - size++; - return true; - } - Node node = first; - while(node.next!=null) - node = node.next; - node.next = new Node(t,null); - size++; - return true; - } - //链表节点 - private static class Node{ - T data; - Node next; - Node(T data,Node next){ - this.data = data; - this.next = next; - } - } - //遍历器 - private class MyIterator implements Iterator{ - private Node next; //下一个节点 - MyIterator(){ - next = first; - } - @Override - public boolean hasNext() { - return next != null; - } - @Override - public T next() { - T data = next.data; - next = next.next; - return data; - } - } +public class LinkList implements List { + private int size; //存放的元素个数,会默认初始化为0 + private Node first; //首节点,默认初始化为null + + @Override + public Iterator iterator() { + return new MyIterator(); + } + + @Override + public boolean add(T t) { + if (size == 0) { + first = new Node(t, null); + size++; + return true; + } + Node node = first; + while (node.next != null) + node = node.next; + node.next = new Node(t, null); + size++; + return true; + } + + //链表节点 + private static class Node { + T data; + Node next; + + Node(T data, Node next) { + this.data = data; + this.next = next; + } + } + + //遍历器 + private class MyIterator implements Iterator { + private Node next; //下一个节点 + + MyIterator() { + next = first; + } + + @Override + public boolean hasNext() { + return next != null; + } + + @Override + public T next() { + T data = next.data; + next = next.next; + return data; + } + } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/factorymethod/List.java b/src/com/anxpp/designpattern/factorymethod/List.java index e499393..0e5f4ac 100644 --- a/src/com/anxpp/designpattern/factorymethod/List.java +++ b/src/com/anxpp/designpattern/factorymethod/List.java @@ -2,6 +2,7 @@ //便于介绍,不做多的操作 public interface List { - Iterator iterator(); //返回一个遍历器 - boolean add(T t); //添加元素到列表 + Iterator iterator(); //返回一个遍历器 + + boolean add(T t); //添加元素到列表 } diff --git a/src/com/anxpp/designpattern/factorymethod/TestUse.java b/src/com/anxpp/designpattern/factorymethod/TestUse.java index b93c696..2006bae 100644 --- a/src/com/anxpp/designpattern/factorymethod/TestUse.java +++ b/src/com/anxpp/designpattern/factorymethod/TestUse.java @@ -1,22 +1,23 @@ package com.anxpp.designpattern.factorymethod; + public class TestUse { - public static void main(String args[]){ - //分别定义两种结构 - List array = new ArrayList(); - List link = new LinkList(); - //添加数据 - for(int i = 1;i < 8; i++){ - array.add(i); - link.add(i); - } - //获得迭代器 - Iterator ai = array.iterator(); - Iterator li = link.iterator(); - //遍历并输出 - while(ai.hasNext()) - System.out.print(ai.next()); - System.out.println(); - while(li.hasNext()) - System.out.print(li.next()); - } + public static void main(String args[]) { + //分别定义两种结构 + List array = new ArrayList(); + List link = new LinkList(); + //添加数据 + for (int i = 1; i < 8; i++) { + array.add(i); + link.add(i); + } + //获得迭代器 + Iterator ai = array.iterator(); + Iterator li = link.iterator(); + //遍历并输出 + while (ai.hasNext()) + System.out.print(ai.next()); + System.out.println(); + while (li.hasNext()) + System.out.print(li.next()); + } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/simplefactory/SimpleFactory.java b/src/com/anxpp/designpattern/simplefactory/SimpleFactory.java index 72b30f6..86f40fa 100644 --- a/src/com/anxpp/designpattern/simplefactory/SimpleFactory.java +++ b/src/com/anxpp/designpattern/simplefactory/SimpleFactory.java @@ -1,36 +1,41 @@ package com.anxpp.designpattern.simplefactory; + //演示简单工厂 public class SimpleFactory { - public static void main(String args[]) throws Exception{ - Factory factory = new Factory(); - factory.produce("PRO5").run(); - factory.produce("PRO6").run(); - } + public static void main(String args[]) throws Exception { + Factory factory = new Factory(); + factory.produce("PRO5").run(); + factory.produce("PRO6").run(); + } } + //抽象产品 -interface MeizuPhone{ - void run(); +interface MeizuPhone { + void run(); } + //具体产品X2 -class PRO5 implements MeizuPhone{ - @Override - public void run() { - System.out.println("我是一台PRO5"); - } +class PRO5 implements MeizuPhone { + @Override + public void run() { + System.out.println("我是一台PRO5"); + } } -class PRO6 implements MeizuPhone{ - @Override - public void run() { - System.out.println("我是一台PRO6"); - } + +class PRO6 implements MeizuPhone { + @Override + public void run() { + System.out.println("我是一台PRO6"); + } } + //工厂 -class Factory{ - MeizuPhone produce(String product) throws Exception{ - if(product.equals("PRO5")) - return new PRO5(); - else if(product.equals("PRO6")) - return new PRO6(); - throw new Exception("No Such Class"); - } +class Factory { + MeizuPhone produce(String product) throws Exception { + if (product.equals("PRO5")) + return new PRO5(); + else if (product.equals("PRO6")) + return new PRO6(); + throw new Exception("No Such Class"); + } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/singleton/EnumSingleton.java b/src/com/anxpp/designpattern/singleton/EnumSingleton.java index e93be7d..2c5281d 100644 --- a/src/com/anxpp/designpattern/singleton/EnumSingleton.java +++ b/src/com/anxpp/designpattern/singleton/EnumSingleton.java @@ -1,9 +1,10 @@ package com.anxpp.designpattern.singleton; + /** * 简枚举实现单例模式,可以用于多线程 - * @author Administrator * + * @author Administrator */ public enum EnumSingleton { - instance; + instance; } diff --git a/src/com/anxpp/designpattern/singleton/SimpleSingleton.java b/src/com/anxpp/designpattern/singleton/SimpleSingleton.java index 7423b36..97c4852 100644 --- a/src/com/anxpp/designpattern/singleton/SimpleSingleton.java +++ b/src/com/anxpp/designpattern/singleton/SimpleSingleton.java @@ -1,15 +1,19 @@ package com.anxpp.designpattern.singleton; + /** * 简单的单例模式,不能用于多线程 - * @author Administrator * + * @author Administrator */ public class SimpleSingleton { - private static SimpleSingleton instance; - private SimpleSingleton(){} - public static SimpleSingleton getIntance(){ - if(instance == null) - instance = new SimpleSingleton(); - return instance; - } + private static SimpleSingleton instance; + + private SimpleSingleton() { + } + + public static SimpleSingleton getIntance() { + if (instance == null) + instance = new SimpleSingleton(); + return instance; + } } From 0eba95b2edefb9eb676ffa760930848c41de1a7d Mon Sep 17 00:00:00 2001 From: liyazhou Date: 2018年3月23日 18:31:17 +0800 Subject: [PATCH 02/13] builder pattern --- .../designpattern/builder/DateBuilder1.java | 32 +++++++++++-------- .../designpattern/builder/DateBuilder2.java | 32 +++++++++++-------- .../anxpp/designpattern/builder/Derector.java | 19 ++++++----- .../designpattern/builder/IDateBuilder.java | 6 ++-- .../anxpp/designpattern/builder/MyDate.java | 3 +- .../anxpp/designpattern/builder/TestUse.java | 17 +++++----- 6 files changed, 62 insertions(+), 47 deletions(-) diff --git a/src/com/anxpp/designpattern/builder/DateBuilder1.java b/src/com/anxpp/designpattern/builder/DateBuilder1.java index 5ff5088..2db745c 100644 --- a/src/com/anxpp/designpattern/builder/DateBuilder1.java +++ b/src/com/anxpp/designpattern/builder/DateBuilder1.java @@ -1,17 +1,21 @@ package com.anxpp.designpattern.builder; + //具体生成器 -public class DateBuilder1 implements IDateBuilder{ - private MyDate myDate; - public DateBuilder1(MyDate myDate){ - this.myDate = myDate; - } - @Override - public IDateBuilder buildDate(int y, int m, int d) { - myDate.date = y+"-"+m+"-"+d; - return this; - } - @Override - public String date() { - return myDate.date; - } +public class DateBuilder1 implements IDateBuilder { + private MyDate myDate; + + public DateBuilder1(MyDate myDate) { + this.myDate = myDate; + } + + @Override + public IDateBuilder buildDate(int y, int m, int d) { + myDate.date = y + "-" + m + "-" + d; + return this; + } + + @Override + public String date() { + return myDate.date; + } } diff --git a/src/com/anxpp/designpattern/builder/DateBuilder2.java b/src/com/anxpp/designpattern/builder/DateBuilder2.java index f32d4e7..0296519 100644 --- a/src/com/anxpp/designpattern/builder/DateBuilder2.java +++ b/src/com/anxpp/designpattern/builder/DateBuilder2.java @@ -1,17 +1,21 @@ package com.anxpp.designpattern.builder; + //具体生成器 -public class DateBuilder2 implements IDateBuilder{ - private MyDate myDate; - public DateBuilder2(MyDate myDate){ - this.myDate = myDate; - } - @Override - public IDateBuilder buildDate(int y, int m, int d) { - myDate.date = y+" "+m+" "+d; - return this; - } - @Override - public String date() { - return myDate.date; - } +public class DateBuilder2 implements IDateBuilder { + private MyDate myDate; + + public DateBuilder2(MyDate myDate) { + this.myDate = myDate; + } + + @Override + public IDateBuilder buildDate(int y, int m, int d) { + myDate.date = y + " " + m + " " + d; + return this; + } + + @Override + public String date() { + return myDate.date; + } } diff --git a/src/com/anxpp/designpattern/builder/Derector.java b/src/com/anxpp/designpattern/builder/Derector.java index b665d11..c3f4046 100644 --- a/src/com/anxpp/designpattern/builder/Derector.java +++ b/src/com/anxpp/designpattern/builder/Derector.java @@ -1,12 +1,15 @@ package com.anxpp.designpattern.builder; + //指挥者 public class Derector { - private IDateBuilder builder; - public Derector(IDateBuilder builder){ - this.builder = builder; - } - public String getDate(int y,int m,int d){ - builder.buildDate(y, m, d); - return builder.date(); - } + private IDateBuilder builder; + + public Derector(IDateBuilder builder) { + this.builder = builder; + } + + public String getDate(int y, int m, int d) { + builder.buildDate(y, m, d); + return builder.date(); + } } diff --git a/src/com/anxpp/designpattern/builder/IDateBuilder.java b/src/com/anxpp/designpattern/builder/IDateBuilder.java index bc08fbf..db2d202 100644 --- a/src/com/anxpp/designpattern/builder/IDateBuilder.java +++ b/src/com/anxpp/designpattern/builder/IDateBuilder.java @@ -1,6 +1,8 @@ package com.anxpp.designpattern.builder; + //抽象生成器 public interface IDateBuilder { - IDateBuilder buildDate(int y,int m,int d); - String date(); + IDateBuilder buildDate(int y, int m, int d); + + String date(); } diff --git a/src/com/anxpp/designpattern/builder/MyDate.java b/src/com/anxpp/designpattern/builder/MyDate.java index 75d656c..6b72836 100644 --- a/src/com/anxpp/designpattern/builder/MyDate.java +++ b/src/com/anxpp/designpattern/builder/MyDate.java @@ -1,5 +1,6 @@ package com.anxpp.designpattern.builder; + //产品 public class MyDate { - String date; + String date; } diff --git a/src/com/anxpp/designpattern/builder/TestUse.java b/src/com/anxpp/designpattern/builder/TestUse.java index d9290c3..a549527 100644 --- a/src/com/anxpp/designpattern/builder/TestUse.java +++ b/src/com/anxpp/designpattern/builder/TestUse.java @@ -1,11 +1,12 @@ package com.anxpp.designpattern.builder; + public class TestUse { - public static void main(String args[]){ - MyDate date = new MyDate(); - IDateBuilder builder; - builder = new DateBuilder1(date).buildDate(2066, 3, 5); - System.out.println(builder.date()); - builder = new DateBuilder2(date).buildDate(2066, 3, 5); - System.out.println(builder.date()); - } + public static void main(String args[]) { + MyDate date = new MyDate(); + IDateBuilder builder; + builder = new DateBuilder1(date).buildDate(2066, 3, 5); + System.out.println(builder.date()); + builder = new DateBuilder2(date).buildDate(2066, 3, 5); + System.out.println(builder.date()); + } } \ No newline at end of file From a67d7da6d02c1b470cc4eb071c533fec7e08a3dc Mon Sep 17 00:00:00 2001 From: liyazhou Date: 2018年3月26日 14:49:46 +0800 Subject: [PATCH 03/13] prototype --- .gitignore | 7 +- .../prototype/SerializablePrototype.java | 100 ++++++++++-------- 2 files changed, 61 insertions(+), 46 deletions(-) diff --git a/.gitignore b/.gitignore index 1adc831..a79a66b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,6 @@ -# Created by .ignore support plugin (hsz.mobi) \ No newline at end of file +# Created by .ignore support plugin (hsz.mobi) +.classpath +.project +JavaDesignPattern.iml +.idea +.settings \ No newline at end of file diff --git a/src/com/anxpp/designpattern/prototype/SerializablePrototype.java b/src/com/anxpp/designpattern/prototype/SerializablePrototype.java index 07dd269..c8d27cc 100644 --- a/src/com/anxpp/designpattern/prototype/SerializablePrototype.java +++ b/src/com/anxpp/designpattern/prototype/SerializablePrototype.java @@ -1,54 +1,64 @@ package com.anxpp.designpattern.prototype; + import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; + //使用Serializable支持克隆 -public class SerializablePrototype implements Serializable{ - private static final long serialVersionUID = 1L; - private int i; - private transient int notClone;//transient关键字的成员不会被序列化 - public int getI() { - return i; - } - public void setI(int i) { - this.i = i; - } - public int getNotClone() { - return notClone; - } - public void setNotClone(int notClone) { - this.notClone = notClone; - } - public static long getSerialversionuid() { - return serialVersionUID; - } - public void writeToFile(String path) throws Exception{ - FileOutputStream outStream = new FileOutputStream(path); - ObjectOutputStream objectOutputStream = new ObjectOutputStream(outStream); - objectOutputStream.writeObject(this); - outStream.close(); - } - public SerializablePrototype ReadFromFile(String path) throws Exception{ - File file = new File(path); - if(!file.exists()) - file.createNewFile(); - FileInputStream inStream = new FileInputStream(path); - ObjectInputStream objectOutputStream = new ObjectInputStream(inStream); - Object o= objectOutputStream.readObject(); - inStream.close(); - return (SerializablePrototype) o; - } - public static void main(String args[]) throws Exception{ - String path = "D:/SerializablePrototype.instance"; - SerializablePrototype prototype = new SerializablePrototype(); - prototype.setI(123); - prototype.setNotClone(456); - prototype.writeToFile(path); - SerializablePrototype prototypeClone = new SerializablePrototype(); - prototypeClone = prototype.ReadFromFile(path); - System.out.println(prototypeClone.getI() + " " + prototypeClone.getNotClone() + " "); - } +public class SerializablePrototype implements Serializable { + private static final long serialVersionUID = 1L; + private int i; + private transient int notClone;//transient关键字的成员不会被序列化 + + public int getI() { + return i; + } + + public void setI(int i) { + this.i = i; + } + + public int getNotClone() { + return notClone; + } + + public void setNotClone(int notClone) { + this.notClone = notClone; + } + + public static long getSerialversionuid() { + return serialVersionUID; + } + + public void writeToFile(String path) throws Exception { + FileOutputStream outStream = new FileOutputStream(path); + ObjectOutputStream objectOutputStream = new ObjectOutputStream(outStream); + objectOutputStream.writeObject(this); + outStream.close(); + } + + public SerializablePrototype ReadFromFile(String path) throws Exception { + File file = new File(path); + if (!file.exists()) + file.createNewFile(); + FileInputStream inStream = new FileInputStream(path); + ObjectInputStream objectOutputStream = new ObjectInputStream(inStream); + Object o = objectOutputStream.readObject(); + inStream.close(); + return (SerializablePrototype) o; + } + + public static void main(String args[]) throws Exception { + String path = "SerializablePrototype.instance"; + SerializablePrototype prototype = new SerializablePrototype(); + prototype.setI(123); + prototype.setNotClone(456); + prototype.writeToFile(path); + SerializablePrototype prototypeClone = new SerializablePrototype(); + prototypeClone = prototype.ReadFromFile(path); + System.out.println(prototypeClone.getI() + " " + prototypeClone.getNotClone() + " "); + } } From f3a06110e8354a232bd1d6ec9a263707d71a78d2 Mon Sep 17 00:00:00 2001 From: liyazhou Date: 2018年3月26日 14:57:35 +0800 Subject: [PATCH 04/13] handler --- .../chainofresponsibility/Handler.java | 8 +++-- .../chainofresponsibility/Handler1.java | 31 ++++++++++--------- .../chainofresponsibility/Handler2.java | 31 ++++++++++--------- .../chainofresponsibility/Handler3.java | 31 ++++++++++--------- .../chainofresponsibility/TestUse.java | 23 +++++++------- 5 files changed, 68 insertions(+), 56 deletions(-) diff --git a/src/com/anxpp/designpattern/chainofresponsibility/Handler.java b/src/com/anxpp/designpattern/chainofresponsibility/Handler.java index d886c98..0318c75 100644 --- a/src/com/anxpp/designpattern/chainofresponsibility/Handler.java +++ b/src/com/anxpp/designpattern/chainofresponsibility/Handler.java @@ -1,6 +1,8 @@ package com.anxpp.designpattern.chainofresponsibility; + //处理者 public interface Handler { - int handleRequest(int n); - void setNextHandler(Handler next); -} + int handleRequest(int n); + + void setNextHandler(Handler next); +} \ No newline at end of file diff --git a/src/com/anxpp/designpattern/chainofresponsibility/Handler1.java b/src/com/anxpp/designpattern/chainofresponsibility/Handler1.java index 08dda74..32c0b91 100644 --- a/src/com/anxpp/designpattern/chainofresponsibility/Handler1.java +++ b/src/com/anxpp/designpattern/chainofresponsibility/Handler1.java @@ -1,18 +1,21 @@ package com.anxpp.designpattern.chainofresponsibility; + //第一个具体处理者,处理小于0的 public class Handler1 implements Handler { - private Handler next; - @Override - public int handleRequest(int n) { - if(n<0) return -n; - else{ - if(next==null) - throw new NullPointerException("next 不能为空"); - return next.handleRequest(n); - } - } - @Override - public void setNextHandler(Handler next) { - this.next = next; - } + private Handler next; + + @Override + public int handleRequest(int n) { + if (n < 0) return -n; + else { + if (next == null) + throw new NullPointerException("next 不能为空"); + return next.handleRequest(n); + } + } + + @Override + public void setNextHandler(Handler next) { + this.next = next; + } } diff --git a/src/com/anxpp/designpattern/chainofresponsibility/Handler2.java b/src/com/anxpp/designpattern/chainofresponsibility/Handler2.java index ad92976..17c5baf 100644 --- a/src/com/anxpp/designpattern/chainofresponsibility/Handler2.java +++ b/src/com/anxpp/designpattern/chainofresponsibility/Handler2.java @@ -1,18 +1,21 @@ package com.anxpp.designpattern.chainofresponsibility; + //第二个具体处理者,处理>=0但小于10的 public class Handler2 implements Handler { - private Handler next; - @Override - public int handleRequest(int n) { - if(n<10) return n*n; - else{ - if(next==null) - throw new NullPointerException("next 不能为空"); - return next.handleRequest(n); - } - } - @Override - public void setNextHandler(Handler next) { - this.next = next; - } + private Handler next; + + @Override + public int handleRequest(int n) { + if (n < 10) return n * n; + else { + if (next == null) + throw new NullPointerException("next 不能为空"); + return next.handleRequest(n); + } + } + + @Override + public void setNextHandler(Handler next) { + this.next = next; + } } diff --git a/src/com/anxpp/designpattern/chainofresponsibility/Handler3.java b/src/com/anxpp/designpattern/chainofresponsibility/Handler3.java index b5e54a7..01c217e 100644 --- a/src/com/anxpp/designpattern/chainofresponsibility/Handler3.java +++ b/src/com/anxpp/designpattern/chainofresponsibility/Handler3.java @@ -1,18 +1,21 @@ package com.anxpp.designpattern.chainofresponsibility; + //第三个具体处理者,处理>=0但小于10的 public class Handler3 implements Handler { - private Handler next; - @Override - public int handleRequest(int n) { - if(n<=integer.max_value) return n; - else{ - if(next==null) - throw new NullPointerException("next 不能为空"); - return next.handleRequest(n); - } - } - @Override - public void setNextHandler(Handler next) { - this.next = next; - } + private Handler next; + + @Override + public int handleRequest(int n) { + if (n <= Integer.MAX_VALUE) return n; + else { + if (next == null) + throw new NullPointerException("next 不能为空"); + return next.handleRequest(n); + } + } + + @Override + public void setNextHandler(Handler next) { + this.next = next; + } } diff --git a/src/com/anxpp/designpattern/chainofresponsibility/TestUse.java b/src/com/anxpp/designpattern/chainofresponsibility/TestUse.java index 3c3cf75..d44bbd2 100644 --- a/src/com/anxpp/designpattern/chainofresponsibility/TestUse.java +++ b/src/com/anxpp/designpattern/chainofresponsibility/TestUse.java @@ -1,14 +1,15 @@ package com.anxpp.designpattern.chainofresponsibility; + public class TestUse { - public static void main(String args[]){ - Handler h1,h2,h3; - h1 = new Handler1(); - h2 = new Handler2(); - h3 = new Handler3(); - h1.setNextHandler(h2); - h2.setNextHandler(h3); - System.out.println(h1.handleRequest(-1)); - System.out.println(h1.handleRequest(5)); - System.out.println(h1.handleRequest(9999)); - } + public static void main(String args[]) { + Handler h1, h2, h3; + h1 = new Handler1(); + h2 = new Handler2(); + h3 = new Handler3(); + h1.setNextHandler(h2); + h2.setNextHandler(h3); + System.out.println(h1.handleRequest(-1)); + System.out.println(h1.handleRequest(5)); + System.out.println(h1.handleRequest(9999)); + } } \ No newline at end of file From 062e3bc33dd0b40943399306d984f73015033291 Mon Sep 17 00:00:00 2001 From: liyazhou Date: 2018年3月26日 16:16:38 +0800 Subject: [PATCH 05/13] command pattern --- .../anxpp/designpattern/command/Client.java | 23 ++++++++------ .../anxpp/designpattern/command/Command.java | 3 +- .../designpattern/command/CommandCreate.java | 19 +++++++----- .../designpattern/command/CommandDelete.java | 21 +++++++------ .../command/CommandWithUndo.java | 5 +-- .../anxpp/designpattern/command/MakeFile.java | 31 ++++++++++--------- .../anxpp/designpattern/command/TestUse.java | 27 ++++++++-------- 7 files changed, 72 insertions(+), 57 deletions(-) diff --git a/src/com/anxpp/designpattern/command/Client.java b/src/com/anxpp/designpattern/command/Client.java index 6641639..f404b6b 100644 --- a/src/com/anxpp/designpattern/command/Client.java +++ b/src/com/anxpp/designpattern/command/Client.java @@ -1,14 +1,17 @@ package com.anxpp.designpattern.command; + //请求者 public class Client { - Command command; - public Client setCommand(Command command){ - this.command = command; - return this; - } - public void executeCommand(String name) throws Exception{ - if(command==null) - throw new Exception("命令不能为空!"); - command.execute(name); - } + Command command; + + public Client setCommand(Command command) { + this.command = command; + return this; + } + + public void executeCommand(String name) throws Exception { + if (command == null) + throw new Exception("命令不能为空!"); + command.execute(name); + } } diff --git a/src/com/anxpp/designpattern/command/Command.java b/src/com/anxpp/designpattern/command/Command.java index e7f9edc..59ede13 100644 --- a/src/com/anxpp/designpattern/command/Command.java +++ b/src/com/anxpp/designpattern/command/Command.java @@ -1,5 +1,6 @@ package com.anxpp.designpattern.command; + //命令接口 public interface Command { - void execute(String name) throws Exception; + void execute(String name) throws Exception; } diff --git a/src/com/anxpp/designpattern/command/CommandCreate.java b/src/com/anxpp/designpattern/command/CommandCreate.java index 568e708..6cd58c3 100644 --- a/src/com/anxpp/designpattern/command/CommandCreate.java +++ b/src/com/anxpp/designpattern/command/CommandCreate.java @@ -1,12 +1,15 @@ package com.anxpp.designpattern.command; + //新建文件命令 public class CommandCreate implements Command { - MakeFile makeFile; - public CommandCreate(MakeFile makeFile) { - this.makeFile = makeFile; - } - @Override - public void execute(String name) throws Exception { - makeFile.createFile(name); - } + MakeFile makeFile; + + public CommandCreate(MakeFile makeFile) { + this.makeFile = makeFile; + } + + @Override + public void execute(String name) throws Exception { + makeFile.createFile(name); + } } diff --git a/src/com/anxpp/designpattern/command/CommandDelete.java b/src/com/anxpp/designpattern/command/CommandDelete.java index 1aaef48..06e105c 100644 --- a/src/com/anxpp/designpattern/command/CommandDelete.java +++ b/src/com/anxpp/designpattern/command/CommandDelete.java @@ -1,12 +1,15 @@ package com.anxpp.designpattern.command; + //删文件命令 -public class CommandDelete implements Command{ - MakeFile makeFile; - public CommandDelete(MakeFile makeFile) { - this.makeFile = makeFile; - } - @Override - public void execute(String name) throws Exception { - makeFile.deleteFile(name); - } +public class CommandDelete implements Command { + MakeFile makeFile; + + public CommandDelete(MakeFile makeFile) { + this.makeFile = makeFile; + } + + @Override + public void execute(String name) throws Exception { + makeFile.deleteFile(name); + } } diff --git a/src/com/anxpp/designpattern/command/CommandWithUndo.java b/src/com/anxpp/designpattern/command/CommandWithUndo.java index 7724a32..f7bce02 100644 --- a/src/com/anxpp/designpattern/command/CommandWithUndo.java +++ b/src/com/anxpp/designpattern/command/CommandWithUndo.java @@ -1,5 +1,6 @@ package com.anxpp.designpattern.command; + //命令接口 -public interface CommandWithUndo extends Command{ - void undo(); +public interface CommandWithUndo extends Command { + void undo(); } diff --git a/src/com/anxpp/designpattern/command/MakeFile.java b/src/com/anxpp/designpattern/command/MakeFile.java index 7a80883..15070af 100644 --- a/src/com/anxpp/designpattern/command/MakeFile.java +++ b/src/com/anxpp/designpattern/command/MakeFile.java @@ -1,20 +1,23 @@ package com.anxpp.designpattern.command; + import java.io.File; import java.io.IOException; + //接收者 public class MakeFile { - //新建文件 - public void createFile(String name) throws IOException{ - File file = new File(name); - file.createNewFile(); - } - //删除文件 - public boolean deleteFile(String name){ - File file = new File(name); - if(file.exists()&&file.isFile()){ - file.delete(); - return true; - } - return false; - } + //新建文件 + public void createFile(String name) throws IOException { + File file = new File(name); + file.createNewFile(); + } + + //删除文件 + public boolean deleteFile(String name) { + File file = new File(name); + if (file.exists() && file.isFile()) { + file.delete(); + return true; + } + return false; + } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/command/TestUse.java b/src/com/anxpp/designpattern/command/TestUse.java index 382d5de..eb53c64 100644 --- a/src/com/anxpp/designpattern/command/TestUse.java +++ b/src/com/anxpp/designpattern/command/TestUse.java @@ -1,16 +1,17 @@ package com.anxpp.designpattern.command; + public class TestUse { - public static void main(String args[]) throws Exception{ - //接收者 - MakeFile makeFile = new MakeFile(); - //命令 - CommandCreate create = new CommandCreate(makeFile); - CommandDelete delete = new CommandDelete(makeFile); - //请求者 - Client client = new Client(); - //执行命令 - client.setCommand(create).executeCommand("d://test1.txt"); - client.setCommand(create).executeCommand("d://test2.txt"); - client.setCommand(delete).executeCommand("d://test2.txt"); - } + public static void main(String args[]) throws Exception { + //接收者 + MakeFile makeFile = new MakeFile(); + //命令 + CommandCreate create = new CommandCreate(makeFile); + CommandDelete delete = new CommandDelete(makeFile); + //请求者 + Client client = new Client(); + //执行命令 + client.setCommand(create).executeCommand("test1.txt"); + client.setCommand(create).executeCommand("test2.txt"); + client.setCommand(delete).executeCommand("test2.txt"); + } } \ No newline at end of file From 654b40b1063b113b4dff53bdfa19c7bfe1d5a01e Mon Sep 17 00:00:00 2001 From: liyazhou Date: 2018年3月27日 16:28:38 +0800 Subject: [PATCH 06/13] iterator --- .../command/CommandWithUndo.java | 2 +- .../designpattern/iterator/MyArrayList.java | 207 +++++++------- .../designpattern/iterator/MyIterator.java | 8 +- .../designpattern/iterator/MyLinkedList.java | 265 +++++++++--------- .../anxpp/designpattern/iterator/MyList.java | 24 +- .../anxpp/designpattern/iterator/TestUse.java | 71 ++--- 6 files changed, 308 insertions(+), 269 deletions(-) diff --git a/src/com/anxpp/designpattern/command/CommandWithUndo.java b/src/com/anxpp/designpattern/command/CommandWithUndo.java index f7bce02..ddc22ac 100644 --- a/src/com/anxpp/designpattern/command/CommandWithUndo.java +++ b/src/com/anxpp/designpattern/command/CommandWithUndo.java @@ -3,4 +3,4 @@ //命令接口 public interface CommandWithUndo extends Command { void undo(); -} +} \ No newline at end of file diff --git a/src/com/anxpp/designpattern/iterator/MyArrayList.java b/src/com/anxpp/designpattern/iterator/MyArrayList.java index ff22ef3..e871f29 100644 --- a/src/com/anxpp/designpattern/iterator/MyArrayList.java +++ b/src/com/anxpp/designpattern/iterator/MyArrayList.java @@ -3,101 +3,114 @@ import java.util.Arrays; //方便演示而实现的简陋的数组list -public class MyArrayList implements MyList{ - private int size; //存放的元素个数,会默认初始化为0 - private Object[] defaultList; //使用数组存放元素 - private static final int defaultLength = 10;//默认长度 - public MyArrayList(){ //默认构造函数 - defaultList = new Object[defaultLength]; - } - @Override - public MyIterator iterator() { - return new Iterator(); - } - //大小自动增长 - private void ensureCapacity(int capacity){ - int nowLength = defaultList.length; - if(capacity>= nowLength){ - nowLength = nowLength + (nowLength>>1); - if(nowLength<0)//溢出 - nowLength = Integer.MAX_VALUE; - defaultList = Arrays.copyOf(defaultList, nowLength); - } - } - //添加元素 - @Override - public boolean add(T t) { - ensureCapacity(size+1); - defaultList[size++] = t; - return true; - } - //获取元素 - @SuppressWarnings("unchecked") - @Override - public T get(int index) { - if(index<0 || index>=size) return null; - return (T) defaultList[index]; - } - @Override - public T remove() { - return remove(size-1); - } - @SuppressWarnings("unchecked") - @Override - public T remove(int index) { - if(index<0||index>=size) return null; - T element = (T) defaultList[index]; - if(index != size-1) - System.arraycopy(defaultList, index+1, defaultList, index,size-index-1); - size--; - return element; - } - @Override - public boolean remove(T element) { - if(element==null){ - for(int i = 0 ; i=size) return false; - defaultList[index] = element; - return true; - } - @Override - public int size() { - return size; - } - //迭代器 - private class Iterator implements MyIterator{ - private int next; - @Override - public boolean hasNext() { - return next implements MyList { + private int size; //存放的元素个数,会默认初始化为0 + private Object[] defaultList; //使用数组存放元素 + private static final int defaultLength = 10;//默认长度 + + public MyArrayList() { //默认构造函数 + defaultList = new Object[defaultLength]; + } + + @Override + public MyIterator iterator() { + return new Iterator(); + } + + //大小自动增长 + private void ensureCapacity(int capacity) { + int nowLength = defaultList.length; + if (capacity>= nowLength) { + nowLength = nowLength + (nowLength>> 1); + if (nowLength < 0)//溢出 + nowLength = Integer.MAX_VALUE; + defaultList = Arrays.copyOf(defaultList, nowLength); + } + } + + //添加元素 + @Override + public boolean add(T t) { + ensureCapacity(size + 1); + defaultList[size++] = t; + return true; + } + + //获取元素 + @SuppressWarnings("unchecked") + @Override + public T get(int index) { + if (index < 0 || index>= size) return null; + return (T) defaultList[index]; + } + + @Override + public T remove() { + return remove(size - 1); + } + + @SuppressWarnings("unchecked") + @Override + public T remove(int index) { + if (index < 0 || index>= size) return null; + T element = (T) defaultList[index]; + if (index != size - 1) + System.arraycopy(defaultList, index + 1, defaultList, index, size - index - 1); + size--; + return element; + } + + @Override + public boolean remove(T element) { + if (element == null) { + for (int i = 0; i < size; i++) + if (defaultList[i] == null) { + System.arraycopy(defaultList, i + 1, defaultList, i, size - i - 1); + size--; + return true; + } + } else { + for (int i = 0; i < size; i++) + if (defaultList[i].equals(element)) { + System.arraycopy(defaultList, i + 1, defaultList, i, size - i - 1); + size--; + return true; + } + } + return false; + } + + @Override + public boolean set(int index, T element) { + if (index < 0 || index>= size) return false; + defaultList[index] = element; + return true; + } + + @Override + public int size() { + return size; + } + + //迭代器 + private class Iterator implements MyIterator { + private int next; + + @Override + public boolean hasNext() { + return next < size; + } + + @SuppressWarnings("unchecked") + @Override + public T next() { + return (T) defaultList[next++]; + } + + @Override + public T remove() { + // TODO Auto-generated method stub + return null; + } + } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/iterator/MyIterator.java b/src/com/anxpp/designpattern/iterator/MyIterator.java index 2f09bd7..f9e33d7 100644 --- a/src/com/anxpp/designpattern/iterator/MyIterator.java +++ b/src/com/anxpp/designpattern/iterator/MyIterator.java @@ -2,7 +2,9 @@ //只是需要遍历一堆数据,那么只需要2个方法就可以了 public interface MyIterator { - boolean hasNext(); //是否还有下一个元素 - T next(); //得到下一个元素 - T remove(); + boolean hasNext(); //是否还有下一个元素 + + T next(); //得到下一个元素 + + T remove(); } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/iterator/MyLinkedList.java b/src/com/anxpp/designpattern/iterator/MyLinkedList.java index 117f63b..1231dd0 100644 --- a/src/com/anxpp/designpattern/iterator/MyLinkedList.java +++ b/src/com/anxpp/designpattern/iterator/MyLinkedList.java @@ -1,128 +1,143 @@ package com.anxpp.designpattern.iterator; + //方便演示而实现的简陋的单向链表list -public class MyLinkedList implements MyList{ - private int size; //存放的元素个数,会默认初始化为0 - private Node first; //首节点,默认初始化为null - @Override - public MyIterator iterator() { - return new Iterator(); - } - @Override - public boolean add(T t) { - if(size==0){ - first = new Node(t,null); - size++; - return true; - } - Node node = first; - while(node.next!=null) - node = node.next; - node.next = new Node(t,null); - size++; - return true; - } - @Override - public T get(int index) { - Node node = first; - while(--index>=0) - node = node.next; - return node.data; - } - @Override - public T remove() { - return remove(size-1); - } - @Override - public T remove(int index) { - if(index<0||index>=size) return null; - Node node = first; - while(--index>0) - node = node.next; - T element = node.next.data; - node.next = node.next.next; - size--; - return element; - } - @Override - public boolean remove(T element) { - if(element == null){ - if(first.data==null){ - first = first.next; - size--; - return true; - } - Node node = first; - do{ - if(node.next.data==null){ - node.next = node.next.next; - size--; - return true; - } - node = node.next; - } - while(node.next!=null); - } - else{ - if(first.data.equals(element)){ - first = first.next; - size--; - return true; - } - Node node = first; - do{ - if(node.next.data.equals(element)){ - node.next = node.next.next; - size--; - return true; - } - node = node.next; - } - while(node.next!=null); - } - return false; - } - @Override - public boolean set(int index, T element) { - if(index<0||index>=size) return false; - Node node = first; - while(--index>0) - node = node.next; - node.data = element; - return true; - } - @Override - public int size() { - return size; - } - //链表节点 - private static class Node{ - T data; - Node next; - Node(T data,Node next){ - this.data = data; - this.next = next; - } - } - //遍历器 - private class Iterator implements MyIterator{ - private Node next; //下一个节点 - Iterator(){ - next = first; - } - @Override - public boolean hasNext() { - return next!=null; - } - @Override - public T next() { - T data = next.data; - next = next.next; - return data; - } - @Override - public T remove() { - // TODO Auto-generated method stub - return null; - } - } +public class MyLinkedList implements MyList { + private int size; //存放的元素个数,会默认初始化为0 + private Node first; //首节点,默认初始化为null + + @Override + public MyIterator iterator() { + return new Iterator(); + } + + @Override + public boolean add(T t) { + if (size == 0) { + first = new Node(t, null); + size++; + return true; + } + Node node = first; + while (node.next != null) + node = node.next; + node.next = new Node(t, null); + size++; + return true; + } + + @Override + public T get(int index) { + Node node = first; + while (--index>= 0) + node = node.next; + return node.data; + } + + @Override + public T remove() { + return remove(size - 1); + } + + @Override + public T remove(int index) { + if (index < 0 || index>= size) return null; + Node node = first; + while (--index> 0) + node = node.next; + T element = node.next.data; + node.next = node.next.next; + size--; + return element; + } + + @Override + public boolean remove(T element) { + if (element == null) { + if (first.data == null) { + first = first.next; + size--; + return true; + } + Node node = first; + do { + if (node.next.data == null) { + node.next = node.next.next; + size--; + return true; + } + node = node.next; + } + while (node.next != null); + } else { + if (first.data.equals(element)) { + first = first.next; + size--; + return true; + } + Node node = first; + do { + if (node.next.data.equals(element)) { + node.next = node.next.next; + size--; + return true; + } + node = node.next; + } + while (node.next != null); + } + return false; + } + + @Override + public boolean set(int index, T element) { + if (index < 0 || index>= size) return false; + Node node = first; + while (--index> 0) + node = node.next; + node.data = element; + return true; + } + + @Override + public int size() { + return size; + } + + //链表节点 + private static class Node { + T data; + Node next; + + Node(T data, Node next) { + this.data = data; + this.next = next; + } + } + + //遍历器 + private class Iterator implements MyIterator { + private Node next; //下一个节点 + + Iterator() { + next = first; + } + + @Override + public boolean hasNext() { + return next != null; + } + + @Override + public T next() { + T data = next.data; + next = next.next; + return data; + } + + @Override + public T remove() { + // TODO Auto-generated method stub + return null; + } + } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/iterator/MyList.java b/src/com/anxpp/designpattern/iterator/MyList.java index cb5f802..e10b5ea 100644 --- a/src/com/anxpp/designpattern/iterator/MyList.java +++ b/src/com/anxpp/designpattern/iterator/MyList.java @@ -1,12 +1,20 @@ package com.anxpp.designpattern.iterator; + //集合接口 public interface MyList { - MyIterator iterator(); //返回一个遍历器 - boolean add(T t); //添加元素到列表 - T get(int index); //得到元素 - T remove(); //删除最后一个元素 - boolean remove(T element); //删除指定元素 - T remove(int index); //删除指定位置元素 - boolean set(int index,T element); //修改指定位置值 - int size(); + MyIterator iterator(); //返回一个遍历器 + + boolean add(T t); //添加元素到列表 + + T get(int index); //得到元素 + + T remove(); //删除最后一个元素 + + boolean remove(T element); //删除指定元素 + + T remove(int index); //删除指定位置元素 + + boolean set(int index, T element); //修改指定位置值 + + int size(); } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/iterator/TestUse.java b/src/com/anxpp/designpattern/iterator/TestUse.java index 29554e8..acfe0df 100644 --- a/src/com/anxpp/designpattern/iterator/TestUse.java +++ b/src/com/anxpp/designpattern/iterator/TestUse.java @@ -1,38 +1,39 @@ package com.anxpp.designpattern.iterator; + public class TestUse { - public static void main(String args[]){ - //分别定义两种结构 - MyList array = new MyArrayList(); - MyList link = new MyLinkedList(); - //添加数据 - for(int i = 1;i < 15; i++){ - array.add(i+""); - link.add(i+""); - } - //数组操作 - System.out.println(array.remove()); - System.out.println(array.get(5)); - System.out.println(array.remove(5)); - System.out.println(array.get(5)); - System.out.println(array.remove("7")); - System.out.println(array.set(0, "00")); - //使用迭代器 - MyIterator ai = array.iterator(); - while(ai.hasNext()) - System.out.print(ai.next()+" "); - System.out.println(); - System.out.println(link.remove()); - System.out.println(link.get(5)); - System.out.println(link.remove(5)); - System.out.println(link.get(5)); - System.out.println(link.remove("7")); - System.out.println(link.set(0, "00")); - //使用迭代器 - MyIterator li = link.iterator(); - while(li.hasNext()) - System.out.print(li.next()+" "); - System.out.println(); - System.out.println("a size=" + array.size()); - System.out.println("l size=" + link.size()); - } + public static void main(String args[]) { + //分别定义两种结构 + MyList array = new MyArrayList(); + MyList link = new MyLinkedList(); + //添加数据 + for (int i = 1; i < 15; i++) { + array.add(i + ""); + link.add(i + ""); + } + //数组操作 + System.out.println(array.remove()); + System.out.println(array.get(5)); + System.out.println(array.remove(5)); + System.out.println(array.get(5)); + System.out.println(array.remove("7")); + System.out.println(array.set(0, "00")); + //使用迭代器 + MyIterator ai = array.iterator(); + while (ai.hasNext()) + System.out.print(ai.next() + " "); + System.out.println(); + System.out.println(link.remove()); + System.out.println(link.get(5)); + System.out.println(link.remove(5)); + System.out.println(link.get(5)); + System.out.println(link.remove("7")); + System.out.println(link.set(0, "00")); + //使用迭代器 + MyIterator li = link.iterator(); + while (li.hasNext()) + System.out.print(li.next() + " "); + System.out.println(); + System.out.println("a size=" + array.size()); + System.out.println("l size=" + link.size()); + } } \ No newline at end of file From 1e5bc9a30301df6844e7839c818b6e74adc4d134 Mon Sep 17 00:00:00 2001 From: liyazhou Date: 2018年4月19日 18:41:21 +0800 Subject: [PATCH 07/13] mediator pattern --- .../designpattern/mediator/IPersistent.java | 9 +++-- .../designpattern/mediator/Midiator.java | 36 ++++++++++--------- .../designpattern/mediator/PersistentDB.java | 36 ++++++++++--------- .../mediator/PersistentFile.java | 36 ++++++++++--------- .../anxpp/designpattern/mediator/TestUse.java | 19 +++++----- 5 files changed, 76 insertions(+), 60 deletions(-) diff --git a/src/com/anxpp/designpattern/mediator/IPersistent.java b/src/com/anxpp/designpattern/mediator/IPersistent.java index d316cf5..ad2beaf 100644 --- a/src/com/anxpp/designpattern/mediator/IPersistent.java +++ b/src/com/anxpp/designpattern/mediator/IPersistent.java @@ -1,7 +1,10 @@ package com.anxpp.designpattern.mediator; + //同事(接口) public interface IPersistent { - void getData(Object data); - void getData(Object data,Midiator midiator); - void saveData(); + void getData(Object data); + + void getData(Object data, Midiator midiator); + + void saveData(); } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/mediator/Midiator.java b/src/com/anxpp/designpattern/mediator/Midiator.java index 0f03c50..2c5e321 100644 --- a/src/com/anxpp/designpattern/mediator/Midiator.java +++ b/src/com/anxpp/designpattern/mediator/Midiator.java @@ -1,20 +1,24 @@ package com.anxpp.designpattern.mediator; + //具体中介者 public class Midiator { - PersistentDB persistentDB; - PersistentFile persistentFile; - public Midiator setPersistentDB(PersistentDB persistentDB) { - this.persistentDB = persistentDB; - return this; - } - public Midiator setPersistentFile(PersistentFile persistentFile) { - this.persistentFile = persistentFile; - return this; - } - public void notifyOther(IPersistent persistent,Object data){ - if(persistent instanceof PersistentDB) - persistentFile.getData(data); - if(persistent instanceof PersistentFile) - persistentDB.getData(data); - } + PersistentDB persistentDB; + PersistentFile persistentFile; + + public Midiator setPersistentDB(PersistentDB persistentDB) { + this.persistentDB = persistentDB; + return this; + } + + public Midiator setPersistentFile(PersistentFile persistentFile) { + this.persistentFile = persistentFile; + return this; + } + + public void notifyOther(IPersistent persistent, Object data) { + if (persistent instanceof PersistentDB) + persistentFile.getData(data); + if (persistent instanceof PersistentFile) + persistentDB.getData(data); + } } diff --git a/src/com/anxpp/designpattern/mediator/PersistentDB.java b/src/com/anxpp/designpattern/mediator/PersistentDB.java index 9267ee8..9630980 100644 --- a/src/com/anxpp/designpattern/mediator/PersistentDB.java +++ b/src/com/anxpp/designpattern/mediator/PersistentDB.java @@ -1,19 +1,23 @@ package com.anxpp.designpattern.mediator; + //具体同事 -public class PersistentDB implements IPersistent{ - private Object data; - @Override - public void getData(Object data, Midiator midiator) { - getData(data); - midiator.notifyOther(this, data); - } - @Override - public void saveData() { - System.out.println(data + " 已保存到数据库"); - } - @Override - public void getData(Object data) { - this.data = data; - saveData(); - } +public class PersistentDB implements IPersistent { + private Object data; + + @Override + public void getData(Object data, Midiator midiator) { + getData(data); + midiator.notifyOther(this, data); + } + + @Override + public void saveData() { + System.out.println(data + " 已保存到数据库"); + } + + @Override + public void getData(Object data) { + this.data = data; + saveData(); + } } diff --git a/src/com/anxpp/designpattern/mediator/PersistentFile.java b/src/com/anxpp/designpattern/mediator/PersistentFile.java index 4d8100e..483a5e8 100644 --- a/src/com/anxpp/designpattern/mediator/PersistentFile.java +++ b/src/com/anxpp/designpattern/mediator/PersistentFile.java @@ -1,19 +1,23 @@ package com.anxpp.designpattern.mediator; + //具体同事 -public class PersistentFile implements IPersistent{ - private Object data; - @Override - public void getData(Object data, Midiator midiator) { - getData(data); - midiator.notifyOther(this, data); - } - @Override - public void saveData() { - System.out.println(data + " 已保存到文件"); - } - @Override - public void getData(Object data) { - this.data = data; - saveData(); - } +public class PersistentFile implements IPersistent { + private Object data; + + @Override + public void getData(Object data, Midiator midiator) { + getData(data); + midiator.notifyOther(this, data); + } + + @Override + public void saveData() { + System.out.println(data + " 已保存到文件"); + } + + @Override + public void getData(Object data) { + this.data = data; + saveData(); + } } diff --git a/src/com/anxpp/designpattern/mediator/TestUse.java b/src/com/anxpp/designpattern/mediator/TestUse.java index 72384d6..f82ffe7 100644 --- a/src/com/anxpp/designpattern/mediator/TestUse.java +++ b/src/com/anxpp/designpattern/mediator/TestUse.java @@ -1,12 +1,13 @@ package com.anxpp.designpattern.mediator; + public class TestUse { - public static void main(String args[]){ - Object data = "数据"; - PersistentDB persistentDB = new PersistentDB(); - PersistentFile persistentFile = new PersistentFile(); - Midiator midiator = new Midiator(); - midiator.setPersistentDB(persistentDB).setPersistentFile(persistentFile); - persistentDB.getData(data, midiator); - persistentFile.getData(data, midiator); - } + public static void main(String args[]) { + Object data = "数据"; + PersistentDB persistentDB = new PersistentDB(); + PersistentFile persistentFile = new PersistentFile(); + Midiator midiator = new Midiator(); + midiator.setPersistentDB(persistentDB).setPersistentFile(persistentFile); + persistentDB.getData(data, midiator); + persistentFile.getData(data, midiator); + } } \ No newline at end of file From fe7683ba33b88f1bc90bb9ba01013f8b3deac478 Mon Sep 17 00:00:00 2001 From: liyazhou Date: 2018年4月20日 15:48:49 +0800 Subject: [PATCH 08/13] =?UTF-8?q?memento=E5=A4=87=E5=BF=98=E5=BD=95?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designpattern/memento/BlackMemento.java | 94 ++++---- .../designpattern/memento/MementoSelf.java | 65 +++--- .../designpattern/memento/SimpleMemento.java | 93 ++++---- .../memento/textEditor/TextEditor.java | 207 ++++++++++-------- 4 files changed, 256 insertions(+), 203 deletions(-) diff --git a/src/com/anxpp/designpattern/memento/BlackMemento.java b/src/com/anxpp/designpattern/memento/BlackMemento.java index 07738d5..39161bb 100644 --- a/src/com/anxpp/designpattern/memento/BlackMemento.java +++ b/src/com/anxpp/designpattern/memento/BlackMemento.java @@ -1,49 +1,63 @@ package com.anxpp.designpattern.memento; + +interface MementoIF { +} + //备忘录模式 public class BlackMemento { - public static void main(String[] args) { - BlankOriginator originator = new BlankOriginator(); //发起人 - BlackCaretaker caretaker = new BlackCaretaker(); //负责人 - originator.setState("stateOne"); //设置状态 - caretaker.saveMemento(originator.createMemento()); //保存信息 - originator.setState("stateTwo"); //修改状态 - originator.recoverMemento(caretaker.recoverMemento());//恢复状态 - } + public static void main(String[] args) { + BlackOriginator originator = new BlackOriginator(); //发起人 + BlackCaretaker caretaker = new BlackCaretaker(); //负责人 + originator.setState("stateOne"); //设置状态 + caretaker.saveMemento(originator.createMemento()); //保存信息 + originator.setState("stateTwo"); //修改状态 + originator.recoverMemento(caretaker.recoverMemento());//恢复状态 + } } -interface MementoIF {} + //发起人 -class BlankOriginator { - private String state; - public String getState() { - return state; - } - public void setState(String state) { - this.state = state; - } - public MementoIF createMemento(){ - return new Memento(state); - } - public void recoverMemento(MementoIF memento){ - this.setState(((Memento)memento).getState()); - } - //以内部类实现备忘录角色 - private class Memento implements MementoIF{ - private String state; - private Memento(String state){ - this.state = state; - } - private String getState() { - return state; - } - } +class BlackOriginator { + private String state; + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public MementoIF createMemento() { + return new Memento(state); + } + + public void recoverMemento(MementoIF memento) { + this.setState(((Memento) memento).getState()); + } + + //以内部类实现备忘录角色 + private class Memento implements MementoIF { + private String state; + + private Memento(String state) { + this.state = state; + } + + private String getState() { + return state; + } + } } + //负责人 class BlackCaretaker { - private MementoIF memento; - public MementoIF recoverMemento(){ - return memento; - } - public void saveMemento(MementoIF memento){ - this.memento = memento; - } + private MementoIF memento; + + public MementoIF recoverMemento() { + return memento; + } + + public void saveMemento(MementoIF memento) { + this.memento = memento; + } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/memento/MementoSelf.java b/src/com/anxpp/designpattern/memento/MementoSelf.java index 807b09f..0a77277 100644 --- a/src/com/anxpp/designpattern/memento/MementoSelf.java +++ b/src/com/anxpp/designpattern/memento/MementoSelf.java @@ -1,35 +1,44 @@ package com.anxpp.designpattern.memento; + +interface IMemento { +} + //自述历史备忘录 public class MementoSelf { - public static void main(String[] args) { - OriginatorCaretaker originatorCaretaker = new OriginatorCaretaker();//发起人,同时为负责人 - originatorCaretaker.changeState("stateOne"); //改变状态 - IMemento memento = originatorCaretaker.createMemento(); //保存状态 - originatorCaretaker.changeState("stateTwo"); //改变状态 - originatorCaretaker.recoverMemento(memento); //恢复状态 - } + public static void main(String[] args) { + OriginatorCaretaker originatorCaretaker = new OriginatorCaretaker();//发起人,同时为负责人 + originatorCaretaker.changeState("stateOne"); //改变状态 + IMemento memento = originatorCaretaker.createMemento(); //保存状态 + originatorCaretaker.changeState("stateTwo"); //改变状态 + originatorCaretaker.recoverMemento(memento); //恢复状态 + } } -interface IMemento {} + //发起人兼负责人 class OriginatorCaretaker { - public String state; - public void changeState(String state){ - this.state = state; - } - //创造快照 - public Memento createMemento(){ - return new Memento(this); - } - //恢复状态 - public void recoverMemento(IMemento memento){ - Memento m = (Memento)memento; - changeState(m.state); - } - //内部类实现备忘录 - private class Memento implements IMemento{ - private String state; - private Memento(OriginatorCaretaker originatorCaretaker){ - this.state = originatorCaretaker.state; - } - } + public String state; + + public void changeState(String state) { + this.state = state; + } + + //创造快照 + public Memento createMemento() { + return new Memento(this); + } + + //恢复状态 + public void recoverMemento(IMemento memento) { + Memento m = (Memento) memento; + changeState(m.state); + } + + //内部类实现备忘录 + private class Memento implements IMemento { + private String state; + + private Memento(OriginatorCaretaker originatorCaretaker) { + this.state = originatorCaretaker.state; + } + } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/memento/SimpleMemento.java b/src/com/anxpp/designpattern/memento/SimpleMemento.java index 599e701..1c2628e 100644 --- a/src/com/anxpp/designpattern/memento/SimpleMemento.java +++ b/src/com/anxpp/designpattern/memento/SimpleMemento.java @@ -1,53 +1,66 @@ package com.anxpp.designpattern.memento; + //简单的备忘录模式 public class SimpleMemento { - public static void main(String[] args) throws Exception { - Originator originator = new Originator(); //发起人,要被保存的对象,也是他创建要保存的信息的 - Caretaker caretaker = new Caretaker(); //辅助保存的对象 - originator.setState("stateOne"); //设置状态 - caretaker.saveMemento(originator.createMemento()); //保存状态 - originator.setState("stateTwo"); //修改状态 - originator.recoverMemento(caretaker.recoverMemento()); //恢复状态 - } + public static void main(String[] args) throws Exception { + Originator originator = new Originator(); //发起人,要被保存的对象,也是他创建要保存的信息的 + Caretaker caretaker = new Caretaker(); //辅助保存的对象 + originator.setState("stateOne"); //设置状态 + caretaker.saveMemento(originator.createMemento()); //保存状态 + originator.setState("stateTwo"); //修改状态 + originator.recoverMemento(caretaker.recoverMemento()); //恢复状态 + } } + //发起人 class Originator { - private String state; - public Memento createMemento(){ - return new Memento(state); - } - public void recoverMemento(Memento memento){ - this.state = memento.getState(); - } - public String getState() { - return state; - } - public void setState(String state) { - this.state = state; - } + private String state; + + public Memento createMemento() { + return new Memento(state); + } + + public void recoverMemento(Memento memento) { + this.state = memento.getState(); + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } } + //备忘录 class Memento { - private String state; - public Memento(String state){ - this.state = state; - } - public String getState() { - return state; - } - public void setState(String state) { - this.state = state; - } + private String state; + + public Memento(String state) { + this.state = state; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } } + //负责人 class Caretaker { - private Memento memento; - public Memento recoverMemento() throws Exception{ - if(memento==null) - throw new Exception("没有保存的状态"); - return this.memento;//恢复状态 - } - public void saveMemento(Memento memento){ - this.memento = memento;//保存状态 - } + private Memento memento; + + public Memento recoverMemento() throws Exception { + if (memento == null) + throw new Exception("没有保存的状态"); + return this.memento;//恢复状态 + } + + public void saveMemento(Memento memento) { + this.memento = memento;//保存状态 + } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/memento/textEditor/TextEditor.java b/src/com/anxpp/designpattern/memento/textEditor/TextEditor.java index 55e894c..f63fbea 100644 --- a/src/com/anxpp/designpattern/memento/textEditor/TextEditor.java +++ b/src/com/anxpp/designpattern/memento/textEditor/TextEditor.java @@ -2,106 +2,123 @@ import java.util.LinkedList; +interface IMemento { +} + //文本编辑器 public class TextEditor { - public static void main(String[] args) { - //使用这个文本编辑器 - MyTextEditor editor = new MyTextEditor("这里是初始文本,可能为文件中读取的值。"); - System.out.println("开始修改文本:"); - editor.append("添加文字1"); - editor.delWords(); //删除最后一个 + public static void main(String[] args) { + //使用这个文本编辑器 + MyTextEditor editor = new MyTextEditor("这里是初始文本,可能为文件中读取的值。"); + System.out.println("开始修改文本:"); + editor.append("添加文字1"); + editor.delWords(); //删除最后一个 // editor.delWords(2); //删除最后2个 这两个方法是没有问题的,这里避免控制台输出太多,取消这两次修改 // editor.delWords(1,5); //删除前面5个 - System.out.println("开始恢复:"); - for(int i=0;i<10;i++) editor.recoverMemento();//恢复大于实际修改的次数不会出错,只会将文本设为o初始化状态 - System.out.println("开始重做:"); - for(int i=0;i<10;i++) editor.redo(); //重做大于实际恢复的次数不会出错,只会将文本设为最后状态 - System.out.println("再次恢复:"); - for(int i=0;i<10;i++) editor.recoverMemento();//恢复大于实际修改的次数不会出错,只会将文本设为o初始化状态 - System.out.println("再次重做:"); - for(int i=0;i<10;i++) editor.redo(); //重做大于实际恢复的次数不会出错,只会将文本设为最后状态 - System.out.println("再次恢复:"); - for(int i=0;i<10;i++) editor.recoverMemento();//恢复大于实际修改的次数不会出错,只会将文本设为o初始化状态 - editor.append("添加文字2"); - System.out.println("再次重做:"); - for(int i=0;i<10;i++) editor.redo(); //重做大于实际恢复的次数不会出错,只会将文本设为最后状态 - } + System.out.println("开始恢复:"); + for (int i = 0; i < 10; i++) editor.recoverMemento();//恢复大于实际修改的次数不会出错,只会将文本设为o初始化状态 + System.out.println("开始重做:"); + for (int i = 0; i < 10; i++) editor.redo(); //重做大于实际恢复的次数不会出错,只会将文本设为最后状态 + System.out.println("再次恢复:"); + for (int i = 0; i < 10; i++) editor.recoverMemento();//恢复大于实际修改的次数不会出错,只会将文本设为o初始化状态 + System.out.println("再次重做:"); + for (int i = 0; i < 10; i++) editor.redo(); //重做大于实际恢复的次数不会出错,只会将文本设为最后状态 + System.out.println("再次恢复:"); + for (int i = 0; i < 10; i++) editor.recoverMemento();//恢复大于实际修改的次数不会出错,只会将文本设为o初始化状态 + editor.append("添加文字2"); + System.out.println("再次重做:"); + for (int i = 0; i < 10; i++) editor.redo(); //重做大于实际恢复的次数不会出错,只会将文本设为最后状态 + } } -interface IMemento {} + //发起人兼负责人 class MyTextEditor { - public StringBuffer text; - private LinkedList mementos; //保存快照 - private LinkedList undos; //保存撤销的操作 - public MyTextEditor(){ - this(""); - } - public MyTextEditor(String defaultStr){ - text = new StringBuffer(defaultStr); - mementos = new LinkedList(); - undos = new LinkedList(); - print(); - } - public void clearHistory(){ - mementos.clear(); - undos.clear(); - } - public void append(String appendStr){ - if(appendStr==null||appendStr.length()==0) return; - createMemento(); - text.append(appendStr); - print(); - undos.clear(); - } - //删除最后一个 - public void delWords(){ - delWords(1); - } - //删除最后n个 - public void delWords(int n){ - if(n<1||n>text.length()) return; - delWords(text.length()-n+1,text.length()); - } - //删除中间start到end的字符,第一个文字为第一个(而不是0) - public void delWords(int start,int end){ - if(start<1 || end>text.length()+1) return; - createMemento(); - text = text.delete(start-1, end); - print(); - } - public void reset(String text){ - this.text = new StringBuffer(text); - } - //新的快照 - public void createMemento(){ - mementos.push(new Memento(this)); - } - //恢复状态 - public boolean recoverMemento(){ - Memento memento = (Memento) mementos.poll(); - if(memento==null) return false; - undos.push(new Memento(this)); - reset(memento.state); - print(); - return true; - } - //redo,redo的操作也可以恢复! - public boolean redo(){ - Memento memento = (Memento) undos.poll(); - if(memento==null) return false; - createMemento(); - reset(memento.state); - print(); - return true; - } - //内部类实现备忘录 - private class Memento implements IMemento{ - private String state; - private Memento(MyTextEditor editor){ - this.state = editor.text.toString(); - } - } - void print(){ - System.out.println("当前文本:" + text); - } + public StringBuffer text; + private LinkedList mementos; //保存快照 + private LinkedList undos; //保存撤销的操作 + + public MyTextEditor() { + this(""); + } + + public MyTextEditor(String defaultStr) { + text = new StringBuffer(defaultStr); + mementos = new LinkedList(); + undos = new LinkedList(); + print(); + } + + public void clearHistory() { + mementos.clear(); + undos.clear(); + } + + public void append(String appendStr) { + if (appendStr == null || appendStr.length() == 0) return; + createMemento(); + text.append(appendStr); + print(); + undos.clear(); + } + + //删除最后一个 + public void delWords() { + delWords(1); + } + + //删除最后n个 + public void delWords(int n) { + if (n < 1 || n> text.length()) return; + delWords(text.length() - n + 1, text.length()); + } + + //删除中间start到end的字符,第一个文字为第一个(而不是0) + public void delWords(int start, int end) { + if (start < 1 || end> text.length() + 1) return; + createMemento(); + text = text.delete(start - 1, end); + print(); + } + + public void reset(String text) { + this.text = new StringBuffer(text); + } + + //新的快照 + public void createMemento() { + mementos.push(new Memento(this)); + } + + //恢复状态 + public boolean recoverMemento() { + Memento memento = (Memento) mementos.poll(); + if (memento == null) return false; + undos.push(new Memento(this)); + reset(memento.state); + print(); + return true; + } + + //redo,redo的操作也可以恢复! + public boolean redo() { + Memento memento = (Memento) undos.poll(); + if (memento == null) return false; + createMemento(); + reset(memento.state); + print(); + return true; + } + + void print() { + System.out.println("当前文本:" + text); + } + + //内部类实现备忘录 + private class Memento implements IMemento { + private String state; + + private Memento(MyTextEditor editor) { + this.state = editor.text.toString(); + } + } } \ No newline at end of file From cf12ff1a890457bf175bb93720fa20e3a8e0f404 Mon Sep 17 00:00:00 2001 From: liyazhou Date: Mon, 7 May 2018 13:52:13 +0800 Subject: [PATCH 09/13] observer --- .../anxpp/designpattern/Observer/Client.java | 3 +- .../Observer/ClientAndroidServer.java | 22 +++--- .../Observer/ClientIphoneServer.java | 22 +++--- .../Observer/IWeatherService.java | 12 ++-- .../anxpp/designpattern/Observer/TestUse.java | 22 +++--- .../designpattern/Observer/WeatherInfo.java | 53 ++++++++------- .../Observer/WeatherService.java | 67 ++++++++++--------- 7 files changed, 111 insertions(+), 90 deletions(-) diff --git a/src/com/anxpp/designpattern/Observer/Client.java b/src/com/anxpp/designpattern/Observer/Client.java index 7e91f3a..39b7b29 100644 --- a/src/com/anxpp/designpattern/Observer/Client.java +++ b/src/com/anxpp/designpattern/Observer/Client.java @@ -1,5 +1,6 @@ package com.anxpp.designpattern.Observer; + //观察者 public interface Client { - void getWeather(WeatherInfo info); + void getWeather(WeatherInfo info); } diff --git a/src/com/anxpp/designpattern/Observer/ClientAndroidServer.java b/src/com/anxpp/designpattern/Observer/ClientAndroidServer.java index acd07e7..d103a03 100644 --- a/src/com/anxpp/designpattern/Observer/ClientAndroidServer.java +++ b/src/com/anxpp/designpattern/Observer/ClientAndroidServer.java @@ -1,14 +1,16 @@ package com.anxpp.designpattern.Observer; public class ClientAndroidServer implements Client { - private static String name = "安卓服务"; - private WeatherInfo info; - @Override - public void getWeather(WeatherInfo info) { - this.info = info; - dealMsg(); - } - private void dealMsg(){ - System.out.println(name + "收到最新天气:time="+info.getTime()+"msg="+info.getWeather()+"。马上开始推送消息..."); - } + private static String name = "安卓服务"; + private WeatherInfo info; + + @Override + public void getWeather(WeatherInfo info) { + this.info = info; + dealMsg(); + } + + private void dealMsg() { + System.out.println(name + "收到最新天气:time=" + info.getTime() + "msg=" + info.getWeather() + "。马上开始推送消息..."); + } } diff --git a/src/com/anxpp/designpattern/Observer/ClientIphoneServer.java b/src/com/anxpp/designpattern/Observer/ClientIphoneServer.java index e32bc90..11cc0de 100644 --- a/src/com/anxpp/designpattern/Observer/ClientIphoneServer.java +++ b/src/com/anxpp/designpattern/Observer/ClientIphoneServer.java @@ -1,14 +1,16 @@ package com.anxpp.designpattern.Observer; public class ClientIphoneServer implements Client { - private static String name = "苹果服务"; - private WeatherInfo info; - @Override - public void getWeather(WeatherInfo info) { - this.info = info; - dealMsg(); - } - private void dealMsg(){ - System.out.println(name + "收到最新天气:time="+info.getTime()+"msg="+info.getWeather()+"。马上开始推送消息..."); - } + private static String name = "苹果服务"; + private WeatherInfo info; + + @Override + public void getWeather(WeatherInfo info) { + this.info = info; + dealMsg(); + } + + private void dealMsg() { + System.out.println(name + "收到最新天气:time=" + info.getTime() + "msg=" + info.getWeather() + "。马上开始推送消息..."); + } } diff --git a/src/com/anxpp/designpattern/Observer/IWeatherService.java b/src/com/anxpp/designpattern/Observer/IWeatherService.java index 70d0575..217563b 100644 --- a/src/com/anxpp/designpattern/Observer/IWeatherService.java +++ b/src/com/anxpp/designpattern/Observer/IWeatherService.java @@ -1,8 +1,12 @@ package com.anxpp.designpattern.Observer; + //主题 public interface IWeatherService { - void addClient(Client client); //添加观察者 - boolean deleteClient(Client client);//删除观察者 - void notifyClients(); //通知 - void updateWeather(WeatherInfo info);//主题内容更新 + void addClient(Client client); //添加观察者 + + boolean deleteClient(Client client);//删除观察者 + + void notifyClients(); //通知 + + void updateWeather(WeatherInfo info);//主题内容更新 } diff --git a/src/com/anxpp/designpattern/Observer/TestUse.java b/src/com/anxpp/designpattern/Observer/TestUse.java index 5fa40d7..7097503 100644 --- a/src/com/anxpp/designpattern/Observer/TestUse.java +++ b/src/com/anxpp/designpattern/Observer/TestUse.java @@ -2,15 +2,15 @@ public class TestUse { - public static void main(String args[]){ - //创建主题 - WeatherService service = WeatherService.instance; - //添加观察者 - service.addClient(new ClientAndroidServer()); - service.addClient(new ClientIphoneServer()); - //更新主题 - service.updateWeather(new WeatherInfo(System.currentTimeMillis(), "多云")); - service.updateWeather(new WeatherInfo(System.currentTimeMillis()+1000*60*60*24, "多云转晴")); - service.updateWeather(new WeatherInfo(System.currentTimeMillis()+1000*60*60*24*2, "晴")); - } + public static void main(String args[]) { + //创建主题 + WeatherService service = WeatherService.instance; + //添加观察者 + service.addClient(new ClientAndroidServer()); + service.addClient(new ClientIphoneServer()); + //更新主题 + service.updateWeather(new WeatherInfo(System.currentTimeMillis(), "多云")); + service.updateWeather(new WeatherInfo(System.currentTimeMillis() + 1000 * 60 * 60 * 24, "多云转晴")); + service.updateWeather(new WeatherInfo(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 2, "晴")); + } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/Observer/WeatherInfo.java b/src/com/anxpp/designpattern/Observer/WeatherInfo.java index 6a551e2..a0f5bdc 100644 --- a/src/com/anxpp/designpattern/Observer/WeatherInfo.java +++ b/src/com/anxpp/designpattern/Observer/WeatherInfo.java @@ -1,27 +1,34 @@ package com.anxpp.designpattern.Observer; + //天气的消息实体 public class WeatherInfo { - private long time; - private String weather; - public WeatherInfo(long time,String weather){ - this.time = time; - this.weather = weather; - } - public long getTime() { - return time; - } - public void setTime(long time) { - this.time = time; - } - public String getWeather() { - return weather; - } - public void setWeather(String weather) { - this.weather = weather; - } - @Override - public boolean equals(Object obj) { - WeatherInfo info = (WeatherInfo) obj; - return info.time==this.time&&info.weather.equals(this.weather); - } + private long time; + private String weather; + + public WeatherInfo(long time, String weather) { + this.time = time; + this.weather = weather; + } + + public long getTime() { + return time; + } + + public void setTime(long time) { + this.time = time; + } + + public String getWeather() { + return weather; + } + + public void setWeather(String weather) { + this.weather = weather; + } + + @Override + public boolean equals(Object obj) { + WeatherInfo info = (WeatherInfo) obj; + return info.time == this.time && info.weather.equals(this.weather); + } } diff --git a/src/com/anxpp/designpattern/Observer/WeatherService.java b/src/com/anxpp/designpattern/Observer/WeatherService.java index 82927e5..f39de7f 100644 --- a/src/com/anxpp/designpattern/Observer/WeatherService.java +++ b/src/com/anxpp/designpattern/Observer/WeatherService.java @@ -3,36 +3,41 @@ import java.util.Iterator; import java.util.LinkedHashSet; import java.util.LinkedList; + //主题,同时使用了枚举实现单例 -public enum WeatherService implements IWeatherService{ - instance; - private LinkedList weatherInfos = new LinkedList(); - private LinkedHashSet clients = new LinkedHashSet(); //存放观察者 - //添加观察者 - @Override - public void addClient(Client client) { - clients.add(client); - } - //删除观察者 - @Override - public boolean deleteClient(Client client) { - return clients.remove(client); - } - //通知观察者 - @Override - public void notifyClients() { - Iterator iterator = clients.iterator(); - while(iterator.hasNext()){ - iterator.next().getWeather(weatherInfos.peekFirst()); - } - } - //更新天气 - @Override - public void updateWeather(WeatherInfo info) { - if(weatherInfos.size()>0) - if(weatherInfos.peekFirst().equals(info)) return; - weatherInfos.push(info); - if(clients.size()==0) return; - notifyClients(); - } +public enum WeatherService implements IWeatherService { + instance; + private LinkedList weatherInfos = new LinkedList(); + private LinkedHashSet clients = new LinkedHashSet(); //存放观察者 + + //添加观察者 + @Override + public void addClient(Client client) { + clients.add(client); + } + + //删除观察者 + @Override + public boolean deleteClient(Client client) { + return clients.remove(client); + } + + //通知观察者 + @Override + public void notifyClients() { + Iterator iterator = clients.iterator(); + while (iterator.hasNext()) { + iterator.next().getWeather(weatherInfos.peekFirst()); + } + } + + //更新天气 + @Override + public void updateWeather(WeatherInfo info) { + if (weatherInfos.size()> 0) + if (weatherInfos.peekFirst().equals(info)) return; + weatherInfos.push(info); + if (clients.size() == 0) return; + notifyClients(); + } } From 7d771f4149ba86c471658e32cb661a816da48e36 Mon Sep 17 00:00:00 2001 From: liyazhou Date: Mon, 7 May 2018 14:08:25 +0800 Subject: [PATCH 10/13] state --- .../anxpp/designpattern/state/ISaveData.java | 3 ++- .../designpattern/state/SaveBigData.java | 14 ++++++----- .../state/SaveDataController.java | 24 ++++++++++--------- .../designpattern/state/SaveMiddleData.java | 14 ++++++----- .../designpattern/state/SaveSmallData.java | 14 ++++++----- .../anxpp/designpattern/state/TestUse.java | 19 ++++++++------- 6 files changed, 49 insertions(+), 39 deletions(-) diff --git a/src/com/anxpp/designpattern/state/ISaveData.java b/src/com/anxpp/designpattern/state/ISaveData.java index 3466e6d..55af5c9 100644 --- a/src/com/anxpp/designpattern/state/ISaveData.java +++ b/src/com/anxpp/designpattern/state/ISaveData.java @@ -1,5 +1,6 @@ package com.anxpp.designpattern.state; + //抽象状态 public interface ISaveData { - void save(Object data); + void save(Object data); } diff --git a/src/com/anxpp/designpattern/state/SaveBigData.java b/src/com/anxpp/designpattern/state/SaveBigData.java index a9db87f..0c90955 100644 --- a/src/com/anxpp/designpattern/state/SaveBigData.java +++ b/src/com/anxpp/designpattern/state/SaveBigData.java @@ -1,9 +1,11 @@ package com.anxpp.designpattern.state; + //具体状态 -public enum SaveBigData implements ISaveData{ - instance; - @Override - public void save(Object data) { - System.out.println("保存到文件:" + data); - } +public enum SaveBigData implements ISaveData { + instance; + + @Override + public void save(Object data) { + System.out.println("保存到文件:" + data); + } } diff --git a/src/com/anxpp/designpattern/state/SaveDataController.java b/src/com/anxpp/designpattern/state/SaveDataController.java index f3e1f4e..b966ef1 100644 --- a/src/com/anxpp/designpattern/state/SaveDataController.java +++ b/src/com/anxpp/designpattern/state/SaveDataController.java @@ -1,15 +1,17 @@ package com.anxpp.designpattern.state; + //环境(Context) public class SaveDataController { - private ISaveData saveData; - public void save(String data){ - //为了演示,此处的大的数据其实也是很小的 - if(data.length()<1<<2) - saveData = SaveSmallData.instance; - else if(data.length()<1<<4) - saveData = SaveMiddleData.instance; - else - saveData = SaveBigData.instance; - saveData.save(data); - } + private ISaveData saveData; + + public void save(String data) { + //为了演示,此处的大的数据其实也是很小的 + if (data.length() < 1 << 2) + saveData = SaveSmallData.instance; + else if (data.length() < 1 << 4) + saveData = SaveMiddleData.instance; + else + saveData = SaveBigData.instance; + saveData.save(data); + } } diff --git a/src/com/anxpp/designpattern/state/SaveMiddleData.java b/src/com/anxpp/designpattern/state/SaveMiddleData.java index fb701e6..3354418 100644 --- a/src/com/anxpp/designpattern/state/SaveMiddleData.java +++ b/src/com/anxpp/designpattern/state/SaveMiddleData.java @@ -1,9 +1,11 @@ package com.anxpp.designpattern.state; + //具体状态 -public enum SaveMiddleData implements ISaveData{ - instance; - @Override - public void save(Object data) { - System.out.println("保存到Mysql:" + data); - } +public enum SaveMiddleData implements ISaveData { + instance; + + @Override + public void save(Object data) { + System.out.println("保存到Mysql:" + data); + } } diff --git a/src/com/anxpp/designpattern/state/SaveSmallData.java b/src/com/anxpp/designpattern/state/SaveSmallData.java index 36fff5c..4895457 100644 --- a/src/com/anxpp/designpattern/state/SaveSmallData.java +++ b/src/com/anxpp/designpattern/state/SaveSmallData.java @@ -1,9 +1,11 @@ package com.anxpp.designpattern.state; + //具体状态 -public enum SaveSmallData implements ISaveData{ - instance; - @Override - public void save(Object data) { - System.out.println("保存到Redis:" + data); - } +public enum SaveSmallData implements ISaveData { + instance; + + @Override + public void save(Object data) { + System.out.println("保存到Redis:" + data); + } } diff --git a/src/com/anxpp/designpattern/state/TestUse.java b/src/com/anxpp/designpattern/state/TestUse.java index a25966d..d173c58 100644 --- a/src/com/anxpp/designpattern/state/TestUse.java +++ b/src/com/anxpp/designpattern/state/TestUse.java @@ -1,12 +1,13 @@ package com.anxpp.designpattern.state; + public class TestUse { - public static void main(String args[]){ - String smallData = "小数据"; - String middleData = "介于小数据和大数据之间的数据"; - String bifgData = "这里就假定这是一个很大很大很大的数据"; - SaveDataController saveDataController = new SaveDataController(); - saveDataController.save(smallData); - saveDataController.save(middleData); - saveDataController.save(bifgData); - } + public static void main(String args[]) { + String smallData = "小数据"; + String middleData = "介于小数据和大数据之间的数据"; + String bifgData = "这里就假定这是一个很大很大很大的数据"; + SaveDataController saveDataController = new SaveDataController(); + saveDataController.save(smallData); + saveDataController.save(middleData); + saveDataController.save(bifgData); + } } \ No newline at end of file From 7795a8e13eed34f7c1d3c624e58741dec944f7e3 Mon Sep 17 00:00:00 2001 From: liyazhou Date: Mon, 7 May 2018 14:39:23 +0800 Subject: [PATCH 11/13] strategy --- .../designpattern/strategy/ISaveData.java | 3 ++- .../designpattern/strategy/SaveClient.java | 24 +++++++++++-------- .../designpattern/strategy/SaveToFile.java | 9 +++---- .../designpattern/strategy/SaveToMysql.java | 9 +++---- .../designpattern/strategy/SaveToRedis.java | 9 +++---- .../anxpp/designpattern/strategy/TestUse.java | 17 ++++++------- 6 files changed, 40 insertions(+), 31 deletions(-) diff --git a/src/com/anxpp/designpattern/strategy/ISaveData.java b/src/com/anxpp/designpattern/strategy/ISaveData.java index d675410..8afb1d2 100644 --- a/src/com/anxpp/designpattern/strategy/ISaveData.java +++ b/src/com/anxpp/designpattern/strategy/ISaveData.java @@ -1,5 +1,6 @@ package com.anxpp.designpattern.strategy; + //策略 public interface ISaveData { - void save(Object data); + void save(Object data); } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/strategy/SaveClient.java b/src/com/anxpp/designpattern/strategy/SaveClient.java index fea5cdc..4536dc3 100644 --- a/src/com/anxpp/designpattern/strategy/SaveClient.java +++ b/src/com/anxpp/designpattern/strategy/SaveClient.java @@ -1,14 +1,18 @@ package com.anxpp.designpattern.strategy; + //环境 public class SaveClient { - private ISaveData saveData; - public SaveClient(ISaveData saveData){ - this.saveData = saveData; - } - public void setSaveData(ISaveData saveData){ - this.saveData = saveData; - } - public void save(Object data){ - saveData.save(data); - } + private ISaveData saveData; + + public SaveClient(ISaveData saveData) { + this.saveData = saveData; + } + + public void setSaveData(ISaveData saveData) { + this.saveData = saveData; + } + + public void save(Object data) { + saveData.save(data); + } } diff --git a/src/com/anxpp/designpattern/strategy/SaveToFile.java b/src/com/anxpp/designpattern/strategy/SaveToFile.java index 9c552bc..9cd2441 100644 --- a/src/com/anxpp/designpattern/strategy/SaveToFile.java +++ b/src/com/anxpp/designpattern/strategy/SaveToFile.java @@ -1,8 +1,9 @@ package com.anxpp.designpattern.strategy; + //具体策略 public class SaveToFile implements ISaveData { - @Override - public void save(Object data) { - System.out.println("数据:" + data + " 保存到文件"); - } + @Override + public void save(Object data) { + System.out.println("数据:" + data + " 保存到文件"); + } } diff --git a/src/com/anxpp/designpattern/strategy/SaveToMysql.java b/src/com/anxpp/designpattern/strategy/SaveToMysql.java index 11b50a5..891878c 100644 --- a/src/com/anxpp/designpattern/strategy/SaveToMysql.java +++ b/src/com/anxpp/designpattern/strategy/SaveToMysql.java @@ -1,8 +1,9 @@ package com.anxpp.designpattern.strategy; + //具体策略 public class SaveToMysql implements ISaveData { - @Override - public void save(Object data) { - System.out.println("数据:" + data + " 保存到Mysql"); - } + @Override + public void save(Object data) { + System.out.println("数据:" + data + " 保存到Mysql"); + } } diff --git a/src/com/anxpp/designpattern/strategy/SaveToRedis.java b/src/com/anxpp/designpattern/strategy/SaveToRedis.java index f830494..6159b81 100644 --- a/src/com/anxpp/designpattern/strategy/SaveToRedis.java +++ b/src/com/anxpp/designpattern/strategy/SaveToRedis.java @@ -1,8 +1,9 @@ package com.anxpp.designpattern.strategy; + //具体策略 public class SaveToRedis implements ISaveData { - @Override - public void save(Object data) { - System.out.println("数据:" + data + " 保存到Redis"); - } + @Override + public void save(Object data) { + System.out.println("数据:" + data + " 保存到Redis"); + } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/strategy/TestUse.java b/src/com/anxpp/designpattern/strategy/TestUse.java index 5653464..263d643 100644 --- a/src/com/anxpp/designpattern/strategy/TestUse.java +++ b/src/com/anxpp/designpattern/strategy/TestUse.java @@ -1,11 +1,12 @@ package com.anxpp.designpattern.strategy; + public class TestUse { - public static void main(String args[]){ - Object data = "数据"; - ISaveData saveData = new SaveToRedis(); - SaveClient client = new SaveClient(saveData); - client.save(data); - client.setSaveData(new SaveToFile()); - client.save(data); - } + public static void main(String args[]) { + Object data = "数据"; + ISaveData saveData = new SaveToRedis(); + SaveClient client = new SaveClient(saveData); + client.save(data); + client.setSaveData(new SaveToFile()); + client.save(data); + } } \ No newline at end of file From 24f7b7a6eb7b6adc5fd94d91ec4615b34d0d4411 Mon Sep 17 00:00:00 2001 From: liyazhou Date: Mon, 7 May 2018 15:00:08 +0800 Subject: [PATCH 12/13] template --- .../templatemethod/AbstractTemplate.java | 31 +++++++++++-------- .../templatemethod/Template.java | 3 +- .../designpattern/templatemethod/TestUse.java | 9 +++--- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/com/anxpp/designpattern/templatemethod/AbstractTemplate.java b/src/com/anxpp/designpattern/templatemethod/AbstractTemplate.java index 71c2029..a07c4fa 100644 --- a/src/com/anxpp/designpattern/templatemethod/AbstractTemplate.java +++ b/src/com/anxpp/designpattern/templatemethod/AbstractTemplate.java @@ -1,17 +1,22 @@ package com.anxpp.designpattern.templatemethod; + //抽象模板 public abstract class AbstractTemplate { - Object data; - //这个就是模板方法 - void dealData(){ - getData(); - calcData(); - printData(); - } - //下面是普通方法,可能已经实现,也可能需要子类实现 - abstract void getData(); - abstract void calcData(); - void printData(){ - System.out.println(data); - } + Object data; + + //这个就是模板方法 + void dealData() { + getData(); + calcData(); + printData(); + } + + //下面是普通方法,可能已经实现,也可能需要子类实现 + abstract void getData(); + + abstract void calcData(); + + void printData() { + System.out.println(data); + } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/templatemethod/Template.java b/src/com/anxpp/designpattern/templatemethod/Template.java index b36dcf5..0c115b3 100644 --- a/src/com/anxpp/designpattern/templatemethod/Template.java +++ b/src/com/anxpp/designpattern/templatemethod/Template.java @@ -5,8 +5,9 @@ public class Template extends AbstractTemplate { void getData() { data = "data"; } + @Override void calcData() { - data = (String)data+data; + data = (String) data + data; } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/templatemethod/TestUse.java b/src/com/anxpp/designpattern/templatemethod/TestUse.java index 64d8022..2dd9036 100644 --- a/src/com/anxpp/designpattern/templatemethod/TestUse.java +++ b/src/com/anxpp/designpattern/templatemethod/TestUse.java @@ -1,7 +1,8 @@ package com.anxpp.designpattern.templatemethod; + public class TestUse { - public static void main(String args[]){ - Template template = new Template(); - template.dealData(); - } + public static void main(String args[]) { + Template template = new Template(); + template.dealData(); + } } \ No newline at end of file From 887a8569219b0e2af63d65d393095018fd51bedd Mon Sep 17 00:00:00 2001 From: liyazhou Date: 2018年5月10日 18:42:27 +0800 Subject: [PATCH 13/13] visitor --- .../anxpp/designpattern/visitor/APPOwner.java | 28 ++++++------ .../anxpp/designpattern/visitor/Dispatch.java | 43 +++++++++++-------- .../designpattern/visitor/MultiDispatch.java | 42 ++++++++++-------- .../anxpp/designpattern/visitor/TestUse.java | 24 +++++------ src/com/anxpp/designpattern/visitor/User.java | 3 +- .../designpattern/visitor/UserOrdinary.java | 28 ++++++------ .../anxpp/designpattern/visitor/UserVIP.java | 28 ++++++------ .../anxpp/designpattern/visitor/Visitor.java | 6 ++- 8 files changed, 112 insertions(+), 90 deletions(-) diff --git a/src/com/anxpp/designpattern/visitor/APPOwner.java b/src/com/anxpp/designpattern/visitor/APPOwner.java index efd7273..80aa2db 100644 --- a/src/com/anxpp/designpattern/visitor/APPOwner.java +++ b/src/com/anxpp/designpattern/visitor/APPOwner.java @@ -1,16 +1,18 @@ package com.anxpp.designpattern.visitor; + //具体访问者 -public class APPOwner implements Visitor{ - @Override - public void visit(UserVIP user) { - String estimation = user.getEstimation(); - if(estimation.length()>5) - System.out.println("记录一条有效反馈:" + estimation); - } - @Override - public void visit(UserOrdinary user) { - String estimation = user.getEstimation(); - if(estimation.length()>10) - System.out.println("记录一条有效反馈:" + estimation); - } +public class APPOwner implements Visitor { + @Override + public void visit(UserVIP user) { + String estimation = user.getEstimation(); + if (estimation.length()> 5) + System.out.println("记录一条有效反馈:" + estimation); + } + + @Override + public void visit(UserOrdinary user) { + String estimation = user.getEstimation(); + if (estimation.length()> 10) + System.out.println("记录一条有效反馈:" + estimation); + } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/visitor/Dispatch.java b/src/com/anxpp/designpattern/visitor/Dispatch.java index 16fc0f1..689aa76 100644 --- a/src/com/anxpp/designpattern/visitor/Dispatch.java +++ b/src/com/anxpp/designpattern/visitor/Dispatch.java @@ -1,27 +1,32 @@ package com.anxpp.designpattern.visitor; + //演示java的静态分派和动态分派 //结果会输出:Collection //所以重载的分派是根据静态类型进行的 public class Dispatch { - void print(FatherClass c){ - System.out.print("父类"); - } - void print(ChildClass c){ - System.out.print("子类"); - } - public static void main(String args[]){ - FatherClass child = new ChildClass(); - new Dispatch().print(child); - child.print(); - } + public static void main(String args[]) { + FatherClass child = new ChildClass(); + new Dispatch().print(child); + child.print(); + } + + void print(FatherClass c) { + System.out.print("父类"); + } + + void print(ChildClass c) { + System.out.print("子类"); + } } -class FatherClass{ - void print(){ - System.out.println("父类"); - } + +class FatherClass { + void print() { + System.out.println("父类"); + } } -class ChildClass extends FatherClass{ - void print(){ - System.out.print("子类"); - } + +class ChildClass extends FatherClass { + void print() { + System.out.print("子类"); + } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/visitor/MultiDispatch.java b/src/com/anxpp/designpattern/visitor/MultiDispatch.java index 0ee5767..e7b16ff 100644 --- a/src/com/anxpp/designpattern/visitor/MultiDispatch.java +++ b/src/com/anxpp/designpattern/visitor/MultiDispatch.java @@ -1,27 +1,31 @@ package com.anxpp.designpattern.visitor; public class MultiDispatch { - public static void main(String args[]){ - Father child = new Child(); - child.print(); - new Child().print(new Vistor()); - } + public static void main(String args[]) { + Father child = new Child(); + child.print(); + new Child().print(new Vistor()); + } } -class Father{ - void print(){ - System.out.println("父类"); - } + +class Father { + void print() { + System.out.println("父类"); + } } -class Child extends Father{ - void print(){ - System.out.print("子类"); - } - void print(Vistor c){ - c.print(this); - } + +class Child extends Father { + void print() { + System.out.print("子类"); + } + + void print(Vistor c) { + c.print(this); + } } -class Vistor { - public void print(Child child){ - child.print(); + +class Vistor { + public void print(Child child) { + child.print(); } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/visitor/TestUse.java b/src/com/anxpp/designpattern/visitor/TestUse.java index 3dc858b..9cc22d6 100644 --- a/src/com/anxpp/designpattern/visitor/TestUse.java +++ b/src/com/anxpp/designpattern/visitor/TestUse.java @@ -4,16 +4,16 @@ import java.util.Iterator; public class TestUse { - public static void main(String args[]){ - Visitor appOwner = new APPOwner(); - ArrayList users = new ArrayList(); - users.add(new UserOrdinary("普通用户短反馈")); - users.add(new UserOrdinary("这是一个普通用户的比较长的反馈")); - users.add(new UserVIP("VIP用户的短反馈")); - users.add(new UserVIP("VIP用户的比较长的反馈反馈")); - Iterator iterator = users.iterator(); - while(iterator.hasNext()){ - iterator.next().accept(appOwner); - } - } + public static void main(String args[]) { + Visitor appOwner = new APPOwner(); + ArrayList users = new ArrayList(); + users.add(new UserOrdinary("普通用户短反馈")); + users.add(new UserOrdinary("这是一个普通用户的比较长的反馈")); + users.add(new UserVIP("VIP用户的短反馈")); + users.add(new UserVIP("VIP用户的比较长的反馈反馈")); + Iterator iterator = users.iterator(); + while (iterator.hasNext()) { + iterator.next().accept(appOwner); + } + } } \ No newline at end of file diff --git a/src/com/anxpp/designpattern/visitor/User.java b/src/com/anxpp/designpattern/visitor/User.java index 529e6f3..2d20e73 100644 --- a/src/com/anxpp/designpattern/visitor/User.java +++ b/src/com/anxpp/designpattern/visitor/User.java @@ -1,5 +1,6 @@ package com.anxpp.designpattern.visitor; + //抽象元素 public interface User { - void accept(Visitor visitor); + void accept(Visitor visitor); } diff --git a/src/com/anxpp/designpattern/visitor/UserOrdinary.java b/src/com/anxpp/designpattern/visitor/UserOrdinary.java index 26e966c..9aabaaa 100644 --- a/src/com/anxpp/designpattern/visitor/UserOrdinary.java +++ b/src/com/anxpp/designpattern/visitor/UserOrdinary.java @@ -1,15 +1,19 @@ package com.anxpp.designpattern.visitor; + //普通用户,具体元素 -public class UserOrdinary implements User{ - String estimation; - public UserOrdinary(String estimation){ - this.estimation = estimation; - } - @Override - public void accept(Visitor visitor) { - visitor.visit(this); - } - String getEstimation(){ - return estimation; - } +public class UserOrdinary implements User { + String estimation; + + public UserOrdinary(String estimation) { + this.estimation = estimation; + } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } + + String getEstimation() { + return estimation; + } } diff --git a/src/com/anxpp/designpattern/visitor/UserVIP.java b/src/com/anxpp/designpattern/visitor/UserVIP.java index 750d8bb..7b65dc7 100644 --- a/src/com/anxpp/designpattern/visitor/UserVIP.java +++ b/src/com/anxpp/designpattern/visitor/UserVIP.java @@ -1,15 +1,19 @@ package com.anxpp.designpattern.visitor; + //VIP用户,具体元素 -public class UserVIP implements User{ - String estimation; - public UserVIP(String estimation){ - this.estimation = estimation; - } - @Override - public void accept(Visitor visitor) { - visitor.visit(this); - } - String getEstimation(){ - return estimation; - } +public class UserVIP implements User { + String estimation; + + public UserVIP(String estimation) { + this.estimation = estimation; + } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } + + String getEstimation() { + return estimation; + } } diff --git a/src/com/anxpp/designpattern/visitor/Visitor.java b/src/com/anxpp/designpattern/visitor/Visitor.java index 934c25a..b75756a 100644 --- a/src/com/anxpp/designpattern/visitor/Visitor.java +++ b/src/com/anxpp/designpattern/visitor/Visitor.java @@ -1,6 +1,8 @@ package com.anxpp.designpattern.visitor; + //抽象访问者 public interface Visitor { - void visit(UserVIP user); - void visit(UserOrdinary user); + void visit(UserVIP user); + + void visit(UserOrdinary user); } \ No newline at end of file

      AltStyle によって変換されたページ (->オリジナル) /