├── .classpath ├── .project ├── .settings └── org.eclipse.jdt.core.prefs ├── README.md └── src └── com └── anxpp └── designpattern ├── Composite ├── Component.java ├── File.java ├── Folder.java ├── TestUse.java └── package-info.java ├── Observer ├── Client.java ├── ClientAndroidServer.java ├── ClientIphoneServer.java ├── IWeatherService.java ├── TestUse.java ├── WeatherInfo.java ├── WeatherService.java └── package-info.java ├── abstractfactory ├── AbstractFactory.java ├── iterator │ ├── IIterator.java │ ├── IIteratorFactory.java │ ├── IteratorCollection.java │ ├── IteratorFactory.java │ ├── IteratorMap.java │ ├── TestUse.java │ └── package-info.java └── package-info.java ├── adapter ├── Adaptee.java ├── ClassAdapter.java ├── List │ ├── Book.java │ ├── BookAdapter.java │ ├── IteratorAdapter.java │ ├── TestUse.java │ └── package-info.java ├── ObjectAdapter.java ├── Target.java ├── TestUse.java └── package-info.java ├── bridge ├── AbstractSave.java ├── ISaveData.java ├── LocalSave.java ├── NetSave.java ├── SaveToDB.java ├── SaveToFile.java ├── SimpleBridge.java ├── TestUse.java └── package-info.java ├── builder ├── DateBuilder1.java ├── DateBuilder2.java ├── Derector.java ├── IDateBuilder.java ├── MyDate.java ├── TestUse.java └── package-info.java ├── chainofresponsibility ├── Handler.java ├── Handler1.java ├── Handler2.java ├── Handler3.java ├── TestUse.java └── package-info.java ├── command ├── Client.java ├── Command.java ├── CommandCreate.java ├── CommandDelete.java ├── CommandWithUndo.java ├── MakeFile.java ├── TestUse.java └── package-info.java ├── decorator ├── IPersistentUtil.java ├── PersistentDbDecorator.java ├── PersistentDecorator.java ├── PersistentNetDecorator.java ├── PersistentUtil.java ├── TestUse.java └── package-info.java ├── facade ├── Discount.java ├── FinalPrice.java ├── Postage.java ├── ProductPrice.java ├── ProductSalesman.java ├── Stock.java ├── TestUse.java └── package-info.java ├── factorymethod ├── ArrayList.java ├── FactoryMethod.java ├── Iterator.java ├── LinkList.java ├── List.java ├── TestUse.java └── package-info.java ├── flyweight ├── IWeather.java ├── SimpleFlyweight.java ├── TestUse.java ├── Weather.java ├── WeatherFactory.java └── package-info.java ├── iterator ├── MyArrayList.java ├── MyIterator.java ├── MyLinkedList.java ├── MyList.java ├── TestUse.java └── package-info.java ├── mediator ├── IPersistent.java ├── Midiator.java ├── PersistentDB.java ├── PersistentFile.java ├── TestUse.java └── package-info.java ├── memento ├── BlackMemento.java ├── MementoSelf.java ├── SimpleMemento.java ├── package-info.java └── textEditor │ ├── TextEditor.java │ └── package-info.java ├── package-info.java ├── prototype ├── APITestUse.java ├── SerializablePrototype.java ├── SimplePrototype.java └── package-info.java ├── proxy ├── AbstractObject.java ├── ProxyObject.java ├── TargetObject.java ├── TestUse.java └── package-info.java ├── simplefactory ├── SimpleFactory.java └── package-info.java ├── singleton ├── EnumSingleton.java ├── SimpleSingleton.java └── package-info.java ├── state ├── ISaveData.java ├── SaveBigData.java ├── SaveDataController.java ├── SaveMiddleData.java ├── SaveSmallData.java ├── TestUse.java └── package-info.java ├── strategy ├── ISaveData.java ├── SaveClient.java ├── SaveToFile.java ├── SaveToMysql.java ├── SaveToRedis.java ├── TestUse.java └── package-info.java ├── templatemethod ├── AbstractTemplate.java ├── Template.java ├── TestUse.java └── package-info.java └── visitor ├── APPOwner.java ├── Dispatch.java ├── MultiDispatch.java ├── TestUse.java ├── User.java ├── UserOrdinary.java ├── UserVIP.java ├── Visitor.java └── package-info.java /.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | JavaDesignPattern 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | 15 | org.eclipse.jdt.core.javanature 16 | 17 | 18 | -------------------------------------------------------------------------------- /.settings/org.eclipse.jdt.core.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled 3 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 4 | org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve 5 | org.eclipse.jdt.core.compiler.compliance=1.8 6 | org.eclipse.jdt.core.compiler.debug.lineNumber=generate 7 | org.eclipse.jdt.core.compiler.debug.localVariable=generate 8 | org.eclipse.jdt.core.compiler.debug.sourceFile=generate 9 | org.eclipse.jdt.core.compiler.problem.assertIdentifier=error 10 | org.eclipse.jdt.core.compiler.problem.enumIdentifier=error 11 | org.eclipse.jdt.core.compiler.source=1.8 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # JavaDesignPattern 2 | 设计模式在java中的应用示例代码 3 | 4 | 建议阅读源码时配合文章介绍 5 | 6 | http://blog.anxpp.com/index.php/archives/489/ 7 | 8 | 或者 9 | 10 | http://blog.csdn.net/anxpp/article/details/51224293 11 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/Composite/Component.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.Composite; 2 | import java.util.Iterator; 3 | import java.util.List; 4 | //抽象组件 5 | public interface Component { 6 | void addFile(Component file); 7 | Component addFolder(Component folder); 8 | void removeFile(Component file); 9 | void removeFolder(Component folder); 10 | List getFiles(); 11 | List getFolders(); 12 | List getAll(); 13 | Iterator iterator(); 14 | void display(); 15 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/Composite/File.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.Composite; 2 | 3 | import java.util.Iterator; 4 | import java.util.List; 5 | //Leaf节点 6 | public class File implements Component{ 7 | private String name; 8 | public File(String name){ 9 | this.name = name; 10 | } 11 | @Override 12 | public void addFile(Component file) {} 13 | @Override 14 | public Component addFolder(Component folder) { return null; } 15 | @Override 16 | public void removeFile(Component file) {} 17 | @Override 18 | public void removeFolder(Component folder) {} 19 | @Override 20 | public List getFiles() { return null; } 21 | @Override 22 | public List getFolders() { return null; } 23 | @Override 24 | public List getAll() { return null; } 25 | @Override 26 | public Iterator iterator() { return null; } 27 | @Override 28 | public void display() { 29 | System.out.println(name); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/Composite/Folder.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.Composite; 2 | import java.util.ArrayList; 3 | import java.util.Iterator; 4 | import java.util.List; 5 | public class Folder implements Component { 6 | private String name; 7 | private List files; 8 | private List folders; 9 | public Folder(String name){ 10 | this.name = name; 11 | files = new ArrayList(); 12 | folders = new ArrayList(); 13 | } 14 | @Override 15 | public void addFile(Component file) { 16 | files.add(file); 17 | } 18 | @Override 19 | public Component addFolder(Component folder) { 20 | folders.add(folder); 21 | return this; 22 | } 23 | @Override 24 | public void removeFile(Component file) { 25 | files.remove(file); 26 | } 27 | @Override 28 | public void removeFolder(Component folder) { 29 | folders.remove(folder); 30 | } 31 | @Override 32 | public List getFiles() { 33 | return files; 34 | } 35 | @Override 36 | public List getFolders() { 37 | return folders; 38 | } 39 | @Override 40 | public List getAll() { 41 | List all = new ArrayList(folders); 42 | all.addAll(files); 43 | return all; 44 | } 45 | @Override 46 | public Iterator iterator() { 47 | List all = new ArrayList(); 48 | add(all,this); 49 | return all.iterator(); 50 | } 51 | private void add(List all,Component component){ 52 | if(component==null) return; 53 | all.add(component); 54 | Iterator iterator = component.getFolders().iterator(); 55 | while(iterator.hasNext()){ 56 | add(all,iterator.next()); 57 | } 58 | all.addAll(component.getFiles()); 59 | } 60 | @Override 61 | public void display() { 62 | System.out.println(name); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/Composite/TestUse.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.Composite; 2 | import java.util.Iterator; 3 | public class TestUse { 4 | public static void main(String args[]){ 5 | Component root = new Folder("root");//根目录 6 | Component folder1 = new Folder("java"); 7 | Component folder2 = new Folder("c++"); 8 | Component folder3 = new Folder("c#"); 9 | Component file1 = new File("info.txt"); 10 | root.addFolder(folder1).addFolder(folder2).addFolder(folder3).addFile(file1);//添加一级目录 11 | folder1.addFile(new File("info.java")); 12 | Iterator iterator = root.iterator(); 13 | while(iterator.hasNext()){ 14 | Component component = iterator.next(); 15 | if(component instanceof Folder) 16 | System.out.print("folder:"); 17 | else 18 | System.out.print("file:"); 19 | component.display(); 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/Composite/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author http://anxpp.com 3 | * 组合模式 4 | */ 5 | package com.anxpp.designpattern.Composite; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/Observer/Client.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.Observer; 2 | //观察者 3 | public interface Client { 4 | void getWeather(WeatherInfo info); 5 | } 6 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/Observer/ClientAndroidServer.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.Observer; 2 | 3 | public class ClientAndroidServer implements Client { 4 | private static String name = "安卓服务"; 5 | private WeatherInfo info; 6 | @Override 7 | public void getWeather(WeatherInfo info) { 8 | this.info = info; 9 | dealMsg(); 10 | } 11 | private void dealMsg(){ 12 | System.out.println(name + "收到最新天气:time="+info.getTime()+"msg="+info.getWeather()+"。马上开始推送消息..."); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/Observer/ClientIphoneServer.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.Observer; 2 | 3 | public class ClientIphoneServer implements Client { 4 | private static String name = "苹果服务"; 5 | private WeatherInfo info; 6 | @Override 7 | public void getWeather(WeatherInfo info) { 8 | this.info = info; 9 | dealMsg(); 10 | } 11 | private void dealMsg(){ 12 | System.out.println(name + "收到最新天气:time="+info.getTime()+"msg="+info.getWeather()+"。马上开始推送消息..."); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/Observer/IWeatherService.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.Observer; 2 | //主题 3 | public interface IWeatherService { 4 | void addClient(Client client); //添加观察者 5 | boolean deleteClient(Client client);//删除观察者 6 | void notifyClients(); //通知 7 | void updateWeather(WeatherInfo info);//主题内容更新 8 | } 9 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/Observer/TestUse.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.Observer; 2 | 3 | 4 | public class TestUse { 5 | public static void main(String args[]){ 6 | //创建主题 7 | WeatherService service = WeatherService.instance; 8 | //添加观察者 9 | service.addClient(new ClientAndroidServer()); 10 | service.addClient(new ClientIphoneServer()); 11 | //更新主题 12 | service.updateWeather(new WeatherInfo(System.currentTimeMillis(), "多云")); 13 | service.updateWeather(new WeatherInfo(System.currentTimeMillis()+1000*60*60*24, "多云转晴")); 14 | service.updateWeather(new WeatherInfo(System.currentTimeMillis()+1000*60*60*24*2, "晴")); 15 | } 16 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/Observer/WeatherInfo.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.Observer; 2 | //天气的消息实体 3 | public class WeatherInfo { 4 | private long time; 5 | private String weather; 6 | public WeatherInfo(long time,String weather){ 7 | this.time = time; 8 | this.weather = weather; 9 | } 10 | public long getTime() { 11 | return time; 12 | } 13 | public void setTime(long time) { 14 | this.time = time; 15 | } 16 | public String getWeather() { 17 | return weather; 18 | } 19 | public void setWeather(String weather) { 20 | this.weather = weather; 21 | } 22 | @Override 23 | public boolean equals(Object obj) { 24 | WeatherInfo info = (WeatherInfo) obj; 25 | return info.time==this.time&&info.weather.equals(this.weather); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/Observer/WeatherService.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.Observer; 2 | 3 | import java.util.Iterator; 4 | import java.util.LinkedHashSet; 5 | import java.util.LinkedList; 6 | //主题,同时使用了枚举实现单例 7 | public enum WeatherService implements IWeatherService{ 8 | instance; 9 | private LinkedList weatherInfos = new LinkedList(); 10 | private LinkedHashSet clients = new LinkedHashSet(); //存放观察者 11 | //添加观察者 12 | @Override 13 | public void addClient(Client client) { 14 | clients.add(client); 15 | } 16 | //删除观察者 17 | @Override 18 | public boolean deleteClient(Client client) { 19 | return clients.remove(client); 20 | } 21 | //通知观察者 22 | @Override 23 | public void notifyClients() { 24 | Iterator iterator = clients.iterator(); 25 | while(iterator.hasNext()){ 26 | iterator.next().getWeather(weatherInfos.peekFirst()); 27 | } 28 | } 29 | //更新天气 30 | @Override 31 | public void updateWeather(WeatherInfo info) { 32 | if(weatherInfos.size()>0) 33 | if(weatherInfos.peekFirst().equals(info)) return; 34 | weatherInfos.push(info); 35 | if(clients.size()==0) return; 36 | notifyClients(); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/Observer/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author http://anxpp.com 3 | * 观察者模式 4 | */ 5 | package com.anxpp.designpattern.Observer; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/abstractfactory/AbstractFactory.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.abstractfactory; 2 | //抽象工厂模式 3 | public class AbstractFactory { 4 | public static void main(String args[]){ 5 | IFactory bigfactory = new BigFactory(); 6 | IFactory smallfactory = new BigFactory(); 7 | bigfactory.producePhone().run(); 8 | bigfactory.produceHeadset().play(); 9 | smallfactory.producePhone().run(); 10 | smallfactory.produceHeadset().play(); 11 | } 12 | } 13 | //抽象产品*2 14 | interface Headset{ 15 | void play(); 16 | } 17 | //抽象产品 18 | interface MeizuPhone{ 19 | void run(); 20 | } 21 | //具体产品*2*2 22 | class PRO5 implements MeizuPhone{ 23 | @Override 24 | public void run() { 25 | System.out.println("我是一台PRO5"); 26 | } 27 | } 28 | class MX5 implements MeizuPhone{ 29 | @Override 30 | public void run() { 31 | System.out.println("我是一台MX5"); 32 | } 33 | } 34 | class EP21 implements Headset{ 35 | @Override 36 | public void play() { 37 | System.out.println("我是一副EP21"); 38 | } 39 | } 40 | class EP30 implements Headset{ 41 | @Override 42 | public void play() { 43 | System.out.println("我是一台EP30"); 44 | } 45 | } 46 | //抽象工厂 47 | interface IFactory{ 48 | MeizuPhone producePhone(); 49 | Headset produceHeadset(); 50 | } 51 | //具体工厂*2 52 | class BigFactory implements IFactory{ 53 | @Override 54 | public MeizuPhone producePhone() { 55 | return new PRO5(); 56 | } 57 | @Override 58 | public Headset produceHeadset() { 59 | return new EP30(); 60 | } 61 | } 62 | //具体工厂*2 63 | class SmallFactory implements IFactory{ 64 | @Override 65 | public MeizuPhone producePhone() { 66 | return new MX5(); 67 | } 68 | @Override 69 | public Headset produceHeadset() { 70 | return new EP21(); 71 | } 72 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/abstractfactory/iterator/IIterator.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.abstractfactory.iterator; 2 | //抽象产品 3 | public interface IIterator { 4 | boolean hasNext(); 5 | Object next(); 6 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/abstractfactory/iterator/IIteratorFactory.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.abstractfactory.iterator; 2 | import java.util.Collection; 3 | import java.util.Map; 4 | //抽象工厂 5 | public interface IIteratorFactory { 6 | IIterator iteratorMap(Map m); 7 | IIterator iteratorCollection(Collection c); 8 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/abstractfactory/iterator/IteratorCollection.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.abstractfactory.iterator; 2 | import java.util.Collection; 3 | import java.util.Iterator; 4 | //具体产品,Collection迭代器(用到了代理模式) 5 | public class IteratorCollection implements IIterator{ 6 | Iterator iterator; 7 | public IteratorCollection(Collection c){ 8 | iterator = c.iterator(); 9 | } 10 | @Override 11 | public boolean hasNext() { 12 | return iterator.hasNext(); 13 | } 14 | @Override 15 | public T next() { 16 | return iterator.next(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/abstractfactory/iterator/IteratorFactory.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.abstractfactory.iterator; 2 | import java.util.Collection; 3 | import java.util.Map; 4 | //具体工厂 5 | public class IteratorFactory implements IIteratorFactory{ 6 | @Override 7 | public IteratorMap iteratorMap(Map m) { 8 | return new IteratorMap(m); 9 | } 10 | @Override 11 | public IteratorCollection iteratorCollection(Collection c) { 12 | return new IteratorCollection(c); 13 | } 14 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/abstractfactory/iterator/IteratorMap.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.abstractfactory.iterator; 2 | import java.util.Iterator; 3 | import java.util.Map; 4 | //具体产品,Map迭代器(用到了代理模式) 5 | public class IteratorMap implements IIterator{ 6 | Iterator> iterator; 7 | public IteratorMap(Map m){ 8 | iterator = m.entrySet().iterator(); 9 | } 10 | @Override 11 | public boolean hasNext() { 12 | return iterator.hasNext(); 13 | } 14 | @Override 15 | public Object next() { 16 | return iterator.next().getValue(); 17 | } 18 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/abstractfactory/iterator/TestUse.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.abstractfactory.iterator; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collection; 5 | import java.util.LinkedHashMap; 6 | import java.util.Map; 7 | //测试使用 8 | public class TestUse { 9 | public static void main(String args[]){ 10 | IIteratorFactory factory = new IteratorFactory<>(); 11 | Collection collection = new ArrayList(); 12 | Map map = new LinkedHashMap<>(); 13 | for(int i=0;i<10;i++){ 14 | collection.add(i); 15 | map.put(i, i); 16 | } 17 | IIterator iteratorCollection = factory.iteratorCollection(collection); 18 | IIterator iteratorMap = factory.iteratorMap(map); 19 | while(iteratorCollection.hasNext()) 20 | System.out.print(iteratorCollection.next()); 21 | System.out.println(); 22 | while(iteratorMap.hasNext()) 23 | System.out.print(iteratorMap.next()); 24 | } 25 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/abstractfactory/iterator/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author http://anxpp.com 3 | * 抽象工厂模式实现Collection和Map的迭代器 4 | */ 5 | package com.anxpp.designpattern.abstractfactory.iterator; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/abstractfactory/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author http://anxpp.com 3 | * 抽象工厂模式 4 | */ 5 | package com.anxpp.designpattern.abstractfactory; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/adapter/Adaptee.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.adapter; 2 | //被适配者 3 | class Adaptee{ 4 | void playMp3(Object src){ 5 | System.out.println("播放MP3:" + src); 6 | } 7 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/adapter/ClassAdapter.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.adapter; 2 | //类适配器 3 | public class ClassAdapter extends Adaptee implements Target { 4 | @Override 5 | public void playFlac(Object src) { 6 | //可能需要对src作处理 7 | playMp3(src); 8 | } 9 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/adapter/List/Book.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.adapter.List; 2 | 3 | import java.util.Enumeration; 4 | import java.util.Vector; 5 | //被适配者 6 | public class Book{ 7 | private Vector books; 8 | public Book(){ 9 | books = new Vector(); 10 | } 11 | public void add(String book){ 12 | books.add(book); 13 | } 14 | public Enumeration getEnum(){ 15 | return books.elements(); 16 | } 17 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/adapter/List/BookAdapter.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.adapter.List; 2 | 3 | import java.util.Iterator; 4 | //适配器 5 | public class BookAdapter extends Book implements Iterable{ 6 | @Override 7 | public Iterator iterator() { 8 | return new IteratorAdapter(getEnum()); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/adapter/List/IteratorAdapter.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.adapter.List; 2 | import java.util.Enumeration; 3 | import java.util.Iterator; 4 | //适配器,目标就是Iterator,被适配者是Enumeration 5 | public class IteratorAdapter implements Iterator { 6 | Enumeration myEnum; 7 | public IteratorAdapter(Enumeration myEnum){ 8 | this.myEnum = myEnum; 9 | } 10 | @Override 11 | public boolean hasNext() { 12 | return myEnum.hasMoreElements(); 13 | } 14 | @Override 15 | public String next() { 16 | return myEnum.nextElement(); 17 | } 18 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/adapter/List/TestUse.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.adapter.List; 2 | 3 | import java.util.Iterator; 4 | public class TestUse { 5 | public static void main(String args[]){ 6 | BookAdapter books = new BookAdapter(); 7 | books.add("think in java"); 8 | books.add("c++ primer"); 9 | books.add("伊索寓言"); 10 | Iterator iterator = books.iterator(); 11 | while(iterator.hasNext()){ 12 | System.out.println(iterator.next()); 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/adapter/List/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Administrator 3 | */ 4 | package com.anxpp.designpattern.adapter.List; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/adapter/ObjectAdapter.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.adapter; 2 | //对象适配器 3 | public class ObjectAdapter implements Target{ 4 | private Adaptee adaptee; 5 | public ObjectAdapter(){ 6 | super(); 7 | adaptee = new Adaptee(); 8 | } 9 | @Override 10 | public void playFlac(Object src) { 11 | //可能需要对src作处理 12 | adaptee.playMp3(src); 13 | } 14 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/adapter/Target.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.adapter; 2 | //目标,也就是用户所希望使用的 3 | interface Target{ 4 | void playFlac(Object src); 5 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/adapter/TestUse.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.adapter; 2 | public class TestUse { 3 | public static void main(String args[]){ 4 | Adaptee adaptee = new Adaptee(); 5 | adaptee.playMp3("mp3"); 6 | Target target = new ClassAdapter(); 7 | target.playFlac("flac"); 8 | target = new ObjectAdapter(); 9 | target.playFlac("flac"); 10 | } 11 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/adapter/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Administrator 3 | * 适配器模式 4 | */ 5 | package com.anxpp.designpattern.adapter; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/bridge/AbstractSave.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.bridge; 2 | //抽象 3 | public abstract class AbstractSave { 4 | ISaveData saveData; 5 | public AbstractSave(ISaveData saveData){ 6 | this.saveData = saveData; 7 | } 8 | public abstract void save(Object data); 9 | } 10 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/bridge/ISaveData.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.bridge; 2 | //实现 3 | public interface ISaveData { 4 | void save(Object data); 5 | } 6 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/bridge/LocalSave.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.bridge; 2 | //细化抽象 3 | public class LocalSave extends AbstractSave{ 4 | public LocalSave(ISaveData saveData) { 5 | super(saveData); 6 | } 7 | @Override 8 | public void save(Object data) { 9 | System.out.print("本地存储:"); 10 | saveData.save(data); 11 | } 12 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/bridge/NetSave.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.bridge; 2 | //细化抽象 3 | public class NetSave extends AbstractSave{ 4 | public NetSave(ISaveData saveData) { 5 | super(saveData); 6 | } 7 | @Override 8 | public void save(Object data) { 9 | System.out.print("网络存储:"); 10 | saveData.save(data); 11 | } 12 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/bridge/SaveToDB.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.bridge; 2 | //具体实现 3 | public class SaveToDB implements ISaveData{ 4 | @Override 5 | public void save(Object data) { 6 | System.out.println(data + " 存储到数据库"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/bridge/SaveToFile.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.bridge; 2 | //具体实现 3 | public class SaveToFile implements ISaveData{ 4 | @Override 5 | public void save(Object data) { 6 | System.out.println(data + " 存储到文件"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/bridge/SimpleBridge.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.bridge; 2 | //桥接模式 3 | public class SimpleBridge { 4 | public static void main(String args[]){ 5 | new LenevoComputer(new Amd()).discribe(); 6 | new HaseeComputer(new Intel()).discribe(); 7 | } 8 | } 9 | //实现者 10 | interface Cpu{ 11 | String discribe(); 12 | } 13 | //具体实现者*2 14 | class Amd implements Cpu{ 15 | public String discribe() { 16 | return "just so so..."; 17 | } 18 | } 19 | class Intel implements Cpu{ 20 | public String discribe() { 21 | return "great !"; 22 | } 23 | } 24 | //抽象 25 | abstract class AbstractComputer{ 26 | Cpu cpu; 27 | public AbstractComputer(Cpu cpu){ 28 | this.cpu=cpu; 29 | } 30 | public abstract void discribe(); 31 | 32 | } 33 | //细化抽象*2 34 | class LenevoComputer extends AbstractComputer{ 35 | public LenevoComputer(Cpu cpu) { 36 | super(cpu); 37 | } 38 | @Override 39 | public void discribe() { 40 | System.out.println("联想笔记本cpu:"+super.cpu.discribe()); 41 | } 42 | } 43 | class HaseeComputer extends AbstractComputer{ 44 | public HaseeComputer(Cpu cpu) { 45 | super(cpu); 46 | } 47 | @Override 48 | public void discribe() { 49 | System.out.println("神舟笔记本cpu:"+super.cpu.discribe()); 50 | } 51 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/bridge/TestUse.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.bridge; 2 | public class TestUse { 3 | public static void main(String args[]){ 4 | Object data = "数据"; 5 | ISaveData saveDataDb = new SaveToDB(); 6 | ISaveData saveDataFile = new SaveToFile(); 7 | AbstractSave save; 8 | save = new NetSave(saveDataDb); 9 | save.save(data); 10 | save = new NetSave(saveDataFile); 11 | save.save(data); 12 | save = new LocalSave(saveDataDb); 13 | save.save(data); 14 | save = new LocalSave(saveDataFile); 15 | save.save(data); 16 | } 17 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/bridge/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Administrator 3 | * 桥接模式 4 | */ 5 | package com.anxpp.designpattern.bridge; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/builder/DateBuilder1.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.builder; 2 | //具体生成器 3 | public class DateBuilder1 implements IDateBuilder{ 4 | private MyDate myDate; 5 | public DateBuilder1(MyDate myDate){ 6 | this.myDate = myDate; 7 | } 8 | @Override 9 | public IDateBuilder buildDate(int y, int m, int d) { 10 | myDate.date = y+"-"+m+"-"+d; 11 | return this; 12 | } 13 | @Override 14 | public String date() { 15 | return myDate.date; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/builder/DateBuilder2.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.builder; 2 | //具体生成器 3 | public class DateBuilder2 implements IDateBuilder{ 4 | private MyDate myDate; 5 | public DateBuilder2(MyDate myDate){ 6 | this.myDate = myDate; 7 | } 8 | @Override 9 | public IDateBuilder buildDate(int y, int m, int d) { 10 | myDate.date = y+" "+m+" "+d; 11 | return this; 12 | } 13 | @Override 14 | public String date() { 15 | return myDate.date; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/builder/Derector.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.builder; 2 | //指挥者 3 | public class Derector { 4 | private IDateBuilder builder; 5 | public Derector(IDateBuilder builder){ 6 | this.builder = builder; 7 | } 8 | public String getDate(int y,int m,int d){ 9 | builder.buildDate(y, m, d); 10 | return builder.date(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/builder/IDateBuilder.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.builder; 2 | //抽象生成器 3 | public interface IDateBuilder { 4 | IDateBuilder buildDate(int y,int m,int d); 5 | String date(); 6 | } 7 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/builder/MyDate.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.builder; 2 | //产品 3 | public class MyDate { 4 | String date; 5 | } 6 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/builder/TestUse.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.builder; 2 | public class TestUse { 3 | public static void main(String args[]){ 4 | MyDate date = new MyDate(); 5 | IDateBuilder builder; 6 | builder = new DateBuilder1(date).buildDate(2066, 3, 5); 7 | System.out.println(builder.date()); 8 | builder = new DateBuilder2(date).buildDate(2066, 3, 5); 9 | System.out.println(builder.date()); 10 | } 11 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/builder/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Administrator 3 | * 生成器模式 4 | */ 5 | package com.anxpp.designpattern.builder; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/chainofresponsibility/Handler.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.chainofresponsibility; 2 | //处理者 3 | public interface Handler { 4 | int handleRequest(int n); 5 | void setNextHandler(Handler next); 6 | } 7 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/chainofresponsibility/Handler1.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.chainofresponsibility; 2 | //第一个具体处理者,处理小于0的 3 | public class Handler1 implements Handler { 4 | private Handler next; 5 | @Override 6 | public int handleRequest(int n) { 7 | if(n<0) return -n; 8 | else{ 9 | if(next==null) 10 | throw new NullPointerException("next 不能为空"); 11 | return next.handleRequest(n); 12 | } 13 | } 14 | @Override 15 | public void setNextHandler(Handler next) { 16 | this.next = next; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/chainofresponsibility/Handler2.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.chainofresponsibility; 2 | //第二个具体处理者,处理>=0但小于10的 3 | public class Handler2 implements Handler { 4 | private Handler next; 5 | @Override 6 | public int handleRequest(int n) { 7 | if(n<10) return n*n; 8 | else{ 9 | if(next==null) 10 | throw new NullPointerException("next 不能为空"); 11 | return next.handleRequest(n); 12 | } 13 | } 14 | @Override 15 | public void setNextHandler(Handler next) { 16 | this.next = next; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/chainofresponsibility/Handler3.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.chainofresponsibility; 2 | //第三个具体处理者,处理>=0但小于10的 3 | public class Handler3 implements Handler { 4 | private Handler next; 5 | @Override 6 | public int handleRequest(int n) { 7 | if(n<=Integer.MAX_VALUE) return n; 8 | else{ 9 | if(next==null) 10 | throw new NullPointerException("next 不能为空"); 11 | return next.handleRequest(n); 12 | } 13 | } 14 | @Override 15 | public void setNextHandler(Handler next) { 16 | this.next = next; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/chainofresponsibility/TestUse.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.chainofresponsibility; 2 | public class TestUse { 3 | public static void main(String args[]){ 4 | Handler h1,h2,h3; 5 | h1 = new Handler1(); 6 | h2 = new Handler2(); 7 | h3 = new Handler3(); 8 | h1.setNextHandler(h2); 9 | h2.setNextHandler(h3); 10 | System.out.println(h1.handleRequest(-1)); 11 | System.out.println(h1.handleRequest(5)); 12 | System.out.println(h1.handleRequest(9999)); 13 | } 14 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/chainofresponsibility/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Administrator 3 | * 责任链模式 4 | */ 5 | package com.anxpp.designpattern.chainofresponsibility; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/command/Client.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.command; 2 | //请求者 3 | public class Client { 4 | Command command; 5 | public Client setCommand(Command command){ 6 | this.command = command; 7 | return this; 8 | } 9 | public void executeCommand(String name) throws Exception{ 10 | if(command==null) 11 | throw new Exception("命令不能为空!"); 12 | command.execute(name); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/command/Command.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.command; 2 | //命令接口 3 | public interface Command { 4 | void execute(String name) throws Exception; 5 | } 6 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/command/CommandCreate.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.command; 2 | //新建文件命令 3 | public class CommandCreate implements Command { 4 | MakeFile makeFile; 5 | public CommandCreate(MakeFile makeFile) { 6 | this.makeFile = makeFile; 7 | } 8 | @Override 9 | public void execute(String name) throws Exception { 10 | makeFile.createFile(name); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/command/CommandDelete.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.command; 2 | //删文件命令 3 | public class CommandDelete implements Command{ 4 | MakeFile makeFile; 5 | public CommandDelete(MakeFile makeFile) { 6 | this.makeFile = makeFile; 7 | } 8 | @Override 9 | public void execute(String name) throws Exception { 10 | makeFile.deleteFile(name); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/command/CommandWithUndo.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.command; 2 | //命令接口 3 | public interface CommandWithUndo extends Command{ 4 | void undo(); 5 | } 6 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/command/MakeFile.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.command; 2 | import java.io.File; 3 | import java.io.IOException; 4 | //接收者 5 | public class MakeFile { 6 | //新建文件 7 | public void createFile(String name) throws IOException{ 8 | File file = new File(name); 9 | file.createNewFile(); 10 | } 11 | //删除文件 12 | public boolean deleteFile(String name){ 13 | File file = new File(name); 14 | if(file.exists()&&file.isFile()){ 15 | file.delete(); 16 | return true; 17 | } 18 | return false; 19 | } 20 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/command/TestUse.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.command; 2 | public class TestUse { 3 | public static void main(String args[]) throws Exception{ 4 | //接收者 5 | MakeFile makeFile = new MakeFile(); 6 | //命令 7 | CommandCreate create = new CommandCreate(makeFile); 8 | CommandDelete delete = new CommandDelete(makeFile); 9 | //请求者 10 | Client client = new Client(); 11 | //执行命令 12 | client.setCommand(create).executeCommand("d://test1.txt"); 13 | client.setCommand(create).executeCommand("d://test2.txt"); 14 | client.setCommand(delete).executeCommand("d://test2.txt"); 15 | } 16 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/command/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author http://anxpp.com 3 | * 命令模式 4 | */ 5 | package com.anxpp.designpattern.command; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/decorator/IPersistentUtil.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.decorator; 2 | //被装饰者接口 3 | public interface IPersistentUtil { 4 | void persistentMsg(String msg); 5 | } 6 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/decorator/PersistentDbDecorator.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.decorator; 2 | //装饰--存入数据库 3 | public class PersistentDbDecorator extends PersistentDecorator { 4 | public PersistentDbDecorator(IPersistentUtil iPersistentUtil){ 5 | super(iPersistentUtil); 6 | } 7 | @Override 8 | public void persistentMsg(String msg) { 9 | iPersistentUtil.persistentMsg(msg); 10 | persistentToDb(msg); 11 | } 12 | private void persistentToDb(String msg){ 13 | System.out.println(msg + " 存入数据库"); 14 | } 15 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/decorator/PersistentDecorator.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.decorator; 2 | //装饰 3 | public abstract class PersistentDecorator implements IPersistentUtil { 4 | IPersistentUtil iPersistentUtil; 5 | public PersistentDecorator(IPersistentUtil iPersistentUtil){ 6 | this.iPersistentUtil = iPersistentUtil; 7 | } 8 | @Override 9 | public void persistentMsg(String msg) { 10 | iPersistentUtil.persistentMsg(msg); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/decorator/PersistentNetDecorator.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.decorator; 2 | //装饰--存入网络其他地方 3 | public class PersistentNetDecorator extends PersistentDecorator { 4 | public PersistentNetDecorator(IPersistentUtil iPersistentUtil){ 5 | super(iPersistentUtil); 6 | } 7 | @Override 8 | public void persistentMsg(String msg) { 9 | iPersistentUtil.persistentMsg(msg); 10 | persistentToNet(msg); 11 | } 12 | private void persistentToNet(String msg){ 13 | System.out.println(msg + " 存入网络的其他地方"); 14 | } 15 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/decorator/PersistentUtil.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.decorator; 2 | //具体的被装饰者 3 | public class PersistentUtil implements IPersistentUtil{ 4 | @Override 5 | public void persistentMsg(String msg) { 6 | System.out.println(msg + " 存入文件"); 7 | } 8 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/decorator/TestUse.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.decorator; 2 | 3 | public class TestUse { 4 | public static void main(String args[]){ 5 | //被装饰者 6 | final String data = "数据"; 7 | IPersistentUtil iPersistentUtil = new PersistentUtil(); 8 | iPersistentUtil.persistentMsg(data); 9 | System.out.println("下面装饰数据库持久化:"); 10 | iPersistentUtil = new PersistentDbDecorator(iPersistentUtil); 11 | iPersistentUtil.persistentMsg(data); 12 | System.out.println("下面继续装饰网络存储器持久化:"); 13 | iPersistentUtil = new PersistentNetDecorator(iPersistentUtil); 14 | iPersistentUtil.persistentMsg(data); 15 | } 16 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/decorator/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author http://anxpp.com 3 | * 装饰模式 4 | */ 5 | package com.anxpp.designpattern.decorator; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/facade/Discount.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.facade; 2 | //计算优惠 3 | public class Discount { 4 | int getDiscount(String discountCode){ 5 | return Math.abs(discountCode.hashCode())%3; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/facade/FinalPrice.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.facade; 2 | //计费子系统 3 | public class FinalPrice { 4 | ProductPrice productPrice; 5 | Postage postage; 6 | Discount discount; 7 | public FinalPrice(){ 8 | productPrice = new ProductPrice(); 9 | postage = new Postage(); 10 | discount = new Discount(); 11 | } 12 | int getFinalPrice(String product,String addr,String discountCode){ 13 | return productPrice.getPrice(product)+postage.getPostage(addr)-discount.getDiscount(discountCode); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/facade/Postage.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.facade; 2 | //计算邮费 3 | public class Postage { 4 | int getPostage(String addr){ 5 | return Math.abs(addr.hashCode())%20+6;//模拟邮费计算 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/facade/ProductPrice.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.facade; 2 | //获取商品价格 3 | public class ProductPrice { 4 | int getPrice(String product){ 5 | return Math.abs(product.hashCode());//模拟获取商品价格 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/facade/ProductSalesman.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.facade; 2 | //外观 3 | public enum ProductSalesman { 4 | instance; 5 | Stock stock = new Stock(); 6 | FinalPrice finalPrice = new FinalPrice(); 7 | Object buySomething(String product,String addr,String discountCode){ 8 | if(!stock.hasStock(product)) 9 | return "库存不足"; 10 | int price = finalPrice.getFinalPrice(product, addr, discountCode); 11 | return "订单信息:" + product + "-" + addr + "-" + discountCode + "-" + price; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/facade/Stock.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.facade; 2 | 3 | import java.util.Random; 4 | //库存子系统 5 | public class Stock { 6 | boolean hasStock(String product){ 7 | return new Random().nextInt(Math.abs(product.hashCode()))>0;//模拟是否还有库存 8 | } 9 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/facade/TestUse.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.facade; 2 | public class TestUse { 3 | public static void main(String args[]){ 4 | Object info = ProductSalesman.instance.buySomething("银河飞船", "地球", "K1234523"); 5 | System.out.println(info); 6 | } 7 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/facade/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Administrator 3 | * 外观模式 4 | */ 5 | package com.anxpp.designpattern.facade; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/factorymethod/ArrayList.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.factorymethod; 2 | //方便演示而实现的简陋的数组list 3 | public class ArrayList implements List{ 4 | private int size; //存放的元素个数,会默认初始化为0 5 | private Object[] defaultList; //使用数组存放元素 6 | private static final int defaultLength = 10;//默认长度 7 | public ArrayList(){ //默认构造函数 8 | defaultList = new Object[defaultLength]; 9 | } 10 | @Override 11 | public Iterator iterator() { 12 | return new MyIterator(); 13 | } 14 | //添加元素 15 | @Override 16 | public boolean add(T t) { 17 | if(size<=defaultLength){ 18 | defaultList[size++] = t; 19 | return true; 20 | } 21 | return false; 22 | } 23 | //遍历器 24 | private class MyIterator implements Iterator{ 25 | private int next; 26 | @Override 27 | public boolean hasNext() { 28 | return next { 4 | boolean hasNext(); //是否还有下一个元素 5 | T next(); //得到下一个元素 6 | } 7 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/factorymethod/LinkList.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.factorymethod; 2 | //方便演示而实现的简陋的单向链表list 3 | public class LinkList implements List{ 4 | private int size; //存放的元素个数,会默认初始化为0 5 | private Node first; //首节点,默认初始化为null 6 | @Override 7 | public Iterator iterator() { 8 | return new MyIterator(); 9 | } 10 | @Override 11 | public boolean add(T t) { 12 | if(size==0){ 13 | first = new Node(t,null); 14 | size++; 15 | return true; 16 | } 17 | Node node = first; 18 | while(node.next!=null) 19 | node = node.next; 20 | node.next = new Node(t,null); 21 | size++; 22 | return true; 23 | } 24 | //链表节点 25 | private static class Node{ 26 | T data; 27 | Node next; 28 | Node(T data,Node next){ 29 | this.data = data; 30 | this.next = next; 31 | } 32 | } 33 | //遍历器 34 | private class MyIterator implements Iterator{ 35 | private Node next; //下一个节点 36 | MyIterator(){ 37 | next = first; 38 | } 39 | @Override 40 | public boolean hasNext() { 41 | return next != null; 42 | } 43 | @Override 44 | public T next() { 45 | T data = next.data; 46 | next = next.next; 47 | return data; 48 | } 49 | } 50 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/factorymethod/List.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.factorymethod; 2 | 3 | //便于介绍,不做多的操作 4 | public interface List { 5 | Iterator iterator(); //返回一个遍历器 6 | boolean add(T t); //添加元素到列表 7 | } 8 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/factorymethod/TestUse.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.factorymethod; 2 | public class TestUse { 3 | public static void main(String args[]){ 4 | //分别定义两种结构 5 | List array = new ArrayList(); 6 | List link = new LinkList(); 7 | //添加数据 8 | for(int i = 1;i < 8; i++){ 9 | array.add(i); 10 | link.add(i); 11 | } 12 | //获得迭代器 13 | Iterator ai = array.iterator(); 14 | Iterator li = link.iterator(); 15 | //遍历并输出 16 | while(ai.hasNext()) 17 | System.out.print(ai.next()); 18 | System.out.println(); 19 | while(li.hasNext()) 20 | System.out.print(li.next()); 21 | } 22 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/factorymethod/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author http://anxpp.com 3 | * 工厂方法模式 4 | */ 5 | package com.anxpp.designpattern.factorymethod; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/flyweight/IWeather.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.flyweight; 2 | //享元接口 3 | public interface IWeather { 4 | void printWeather(); 5 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/flyweight/SimpleFlyweight.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.flyweight; 2 | import java.util.HashMap; 3 | //简单的享元模式 4 | public class SimpleFlyweight { 5 | public static void main(String args[]){ 6 | FlyweightFactory factory = new FlyweightFactory(); 7 | IFlyweight flyweight1,flyweight2,flyweight3,flyweight4; 8 | flyweight1 = factory.getFlyweight("value1"); 9 | flyweight2 = factory.getFlyweight("value1"); 10 | flyweight3 = factory.getFlyweight("value1"); 11 | flyweight4 = factory.getFlyweight("value2"); 12 | flyweight1.doSomething(); 13 | flyweight2.doSomething(); 14 | flyweight3.doSomething(); 15 | flyweight4.doSomething(); 16 | System.out.println(factory.size()); 17 | } 18 | } 19 | //享元接口 20 | interface IFlyweight{ 21 | void doSomething(); 22 | } 23 | //具体享元 24 | class Flyweight implements IFlyweight{ 25 | private String value; 26 | public Flyweight(String value){ 27 | this.value = value; 28 | } 29 | @Override 30 | public void doSomething() { 31 | System.out.println(value); 32 | } 33 | } 34 | //享元工厂 35 | class FlyweightFactory{ 36 | HashMap flyweights = new HashMap(); 37 | IFlyweight getFlyweight(String value){ 38 | IFlyweight flyweight = flyweights.get(value); 39 | if(flyweight == null){ 40 | flyweight = new Flyweight(value); 41 | flyweights.put(value, flyweight); 42 | } 43 | return flyweight; 44 | } 45 | public int size(){ 46 | return flyweights.size(); 47 | } 48 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/flyweight/TestUse.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.flyweight; 2 | public class TestUse { 3 | public static void main(String args[]){ 4 | WeatherFactory factory = new WeatherFactory(); 5 | IWeather weather1,weather2,weather3,weather4,weather5,weather6,weather7,weather8; 6 | weather1 = factory.getFlyWeight("多云",15); 7 | weather2 = factory.getFlyWeight("晴",23); 8 | weather3 = factory.getFlyWeight("多云",16); 9 | weather4 = factory.getFlyWeight("阴",10); 10 | weather5 = factory.getFlyWeight("多云",15); 11 | weather6 = factory.getFlyWeight("多云",15); 12 | weather7 = factory.getFlyWeight("多云",15); 13 | weather8 = factory.getFlyWeight("多云",15); 14 | weather1.printWeather(); 15 | weather2.printWeather(); 16 | weather3.printWeather(); 17 | weather4.printWeather(); 18 | weather5.printWeather(); 19 | weather6.printWeather(); 20 | weather7.printWeather(); 21 | weather8.printWeather(); 22 | System.out.println("实际对象个数" + factory.getFlyweightSize()); 23 | } 24 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/flyweight/Weather.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.flyweight; 2 | //具体享元 3 | public class Weather implements IWeather{ 4 | private String weather; 5 | private Integer temperature; 6 | public Weather(String weather,int temperature){ 7 | this.weather = weather; 8 | this.temperature = temperature; 9 | } 10 | @Override 11 | public void printWeather() { 12 | System.out.print("天气:" + weather); 13 | System.out.println(" 温度:" + temperature); 14 | } 15 | @Override 16 | public boolean equals(Object obj) { 17 | Weather weather = (Weather)obj; 18 | return weather.weather.equals(this.weather)&&weather.temperature==temperature; 19 | } 20 | @Override 21 | public int hashCode() { 22 | return (weather.hashCode()+temperature.hashCode())/2; 23 | } 24 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/flyweight/WeatherFactory.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.flyweight; 2 | 3 | import java.util.HashMap; 4 | //享元工厂 5 | public class WeatherFactory { 6 | private HashMap weathers; 7 | public WeatherFactory(){ 8 | weathers = new HashMap(); 9 | } 10 | public IWeather getFlyWeight(String weather,int temperature){ 11 | Weather objectWeather = new Weather(weather, temperature); 12 | IWeather flyweight = weathers.get(objectWeather); 13 | if(flyweight == null){ 14 | flyweight = objectWeather; 15 | weathers.put(objectWeather, flyweight); 16 | } 17 | else objectWeather = null;//方便gc回收 18 | return flyweight; 19 | } 20 | public int getFlyweightSize(){ 21 | return weathers.size(); 22 | } 23 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/flyweight/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Administrator 3 | * 享元模式 4 | */ 5 | package com.anxpp.designpattern.flyweight; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/iterator/MyArrayList.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.iterator; 2 | 3 | import java.util.Arrays; 4 | 5 | //方便演示而实现的简陋的数组list 6 | public class MyArrayList implements MyList{ 7 | private int size; //存放的元素个数,会默认初始化为0 8 | private Object[] defaultList; //使用数组存放元素 9 | private static final int defaultLength = 10;//默认长度 10 | public MyArrayList(){ //默认构造函数 11 | defaultList = new Object[defaultLength]; 12 | } 13 | @Override 14 | public MyIterator iterator() { 15 | return new Iterator(); 16 | } 17 | //大小自动增长 18 | private void ensureCapacity(int capacity){ 19 | int nowLength = defaultList.length; 20 | if(capacity >= nowLength){ 21 | nowLength = nowLength + (nowLength>>1); 22 | if(nowLength<0)//溢出 23 | nowLength = Integer.MAX_VALUE; 24 | defaultList = Arrays.copyOf(defaultList, nowLength); 25 | } 26 | } 27 | //添加元素 28 | @Override 29 | public boolean add(T t) { 30 | ensureCapacity(size+1); 31 | defaultList[size++] = t; 32 | return true; 33 | } 34 | //获取元素 35 | @SuppressWarnings("unchecked") 36 | @Override 37 | public T get(int index) { 38 | if(index<0 || index>=size) return null; 39 | return (T) defaultList[index]; 40 | } 41 | @Override 42 | public T remove() { 43 | return remove(size-1); 44 | } 45 | @SuppressWarnings("unchecked") 46 | @Override 47 | public T remove(int index) { 48 | if(index<0||index>=size) return null; 49 | T element = (T) defaultList[index]; 50 | if(index != size-1) 51 | System.arraycopy(defaultList, index+1, defaultList, index,size-index-1); 52 | size--; 53 | return element; 54 | } 55 | @Override 56 | public boolean remove(T element) { 57 | if(element==null){ 58 | for(int i = 0 ; i=size) return false; 78 | defaultList[index] = element; 79 | return true; 80 | } 81 | @Override 82 | public int size() { 83 | return size; 84 | } 85 | //迭代器 86 | private class Iterator implements MyIterator{ 87 | private int next; 88 | @Override 89 | public boolean hasNext() { 90 | return next { 5 | boolean hasNext(); //是否还有下一个元素 6 | T next(); //得到下一个元素 7 | T remove(); 8 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/iterator/MyLinkedList.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.iterator; 2 | //方便演示而实现的简陋的单向链表list 3 | public class MyLinkedList implements MyList{ 4 | private int size; //存放的元素个数,会默认初始化为0 5 | private Node first; //首节点,默认初始化为null 6 | @Override 7 | public MyIterator iterator() { 8 | return new Iterator(); 9 | } 10 | @Override 11 | public boolean add(T t) { 12 | if(size==0){ 13 | first = new Node(t,null); 14 | size++; 15 | return true; 16 | } 17 | Node node = first; 18 | while(node.next!=null) 19 | node = node.next; 20 | node.next = new Node(t,null); 21 | size++; 22 | return true; 23 | } 24 | @Override 25 | public T get(int index) { 26 | Node node = first; 27 | while(--index>=0) 28 | node = node.next; 29 | return node.data; 30 | } 31 | @Override 32 | public T remove() { 33 | return remove(size-1); 34 | } 35 | @Override 36 | public T remove(int index) { 37 | if(index<0||index>=size) return null; 38 | Node node = first; 39 | while(--index>0) 40 | node = node.next; 41 | T element = node.next.data; 42 | node.next = node.next.next; 43 | size--; 44 | return element; 45 | } 46 | @Override 47 | public boolean remove(T element) { 48 | if(element == null){ 49 | if(first.data==null){ 50 | first = first.next; 51 | size--; 52 | return true; 53 | } 54 | Node node = first; 55 | do{ 56 | if(node.next.data==null){ 57 | node.next = node.next.next; 58 | size--; 59 | return true; 60 | } 61 | node = node.next; 62 | } 63 | while(node.next!=null); 64 | } 65 | else{ 66 | if(first.data.equals(element)){ 67 | first = first.next; 68 | size--; 69 | return true; 70 | } 71 | Node node = first; 72 | do{ 73 | if(node.next.data.equals(element)){ 74 | node.next = node.next.next; 75 | size--; 76 | return true; 77 | } 78 | node = node.next; 79 | } 80 | while(node.next!=null); 81 | } 82 | return false; 83 | } 84 | @Override 85 | public boolean set(int index, T element) { 86 | if(index<0||index>=size) return false; 87 | Node node = first; 88 | while(--index>0) 89 | node = node.next; 90 | node.data = element; 91 | return true; 92 | } 93 | @Override 94 | public int size() { 95 | return size; 96 | } 97 | //链表节点 98 | private static class Node{ 99 | T data; 100 | Node next; 101 | Node(T data,Node next){ 102 | this.data = data; 103 | this.next = next; 104 | } 105 | } 106 | //遍历器 107 | private class Iterator implements MyIterator{ 108 | private Node next; //下一个节点 109 | Iterator(){ 110 | next = first; 111 | } 112 | @Override 113 | public boolean hasNext() { 114 | return next!=null; 115 | } 116 | @Override 117 | public T next() { 118 | T data = next.data; 119 | next = next.next; 120 | return data; 121 | } 122 | @Override 123 | public T remove() { 124 | // TODO Auto-generated method stub 125 | return null; 126 | } 127 | } 128 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/iterator/MyList.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.iterator; 2 | //集合接口 3 | public interface MyList { 4 | MyIterator iterator(); //返回一个遍历器 5 | boolean add(T t); //添加元素到列表 6 | T get(int index); //得到元素 7 | T remove(); //删除最后一个元素 8 | boolean remove(T element); //删除指定元素 9 | T remove(int index); //删除指定位置元素 10 | boolean set(int index,T element); //修改指定位置值 11 | int size(); 12 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/iterator/TestUse.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.iterator; 2 | public class TestUse { 3 | public static void main(String args[]){ 4 | //分别定义两种结构 5 | MyList array = new MyArrayList(); 6 | MyList link = new MyLinkedList(); 7 | //添加数据 8 | for(int i = 1;i < 15; i++){ 9 | array.add(i+""); 10 | link.add(i+""); 11 | } 12 | //数组操作 13 | System.out.println(array.remove()); 14 | System.out.println(array.get(5)); 15 | System.out.println(array.remove(5)); 16 | System.out.println(array.get(5)); 17 | System.out.println(array.remove("7")); 18 | System.out.println(array.set(0, "00")); 19 | //使用迭代器 20 | MyIterator ai = array.iterator(); 21 | while(ai.hasNext()) 22 | System.out.print(ai.next()+" "); 23 | System.out.println(); 24 | System.out.println(link.remove()); 25 | System.out.println(link.get(5)); 26 | System.out.println(link.remove(5)); 27 | System.out.println(link.get(5)); 28 | System.out.println(link.remove("7")); 29 | System.out.println(link.set(0, "00")); 30 | //使用迭代器 31 | MyIterator li = link.iterator(); 32 | while(li.hasNext()) 33 | System.out.print(li.next()+" "); 34 | System.out.println(); 35 | System.out.println("a size=" + array.size()); 36 | System.out.println("l size=" + link.size()); 37 | } 38 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/iterator/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Administrator 3 | * 迭代器模式--此处未实现remove()方法 4 | */ 5 | package com.anxpp.designpattern.iterator; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/mediator/IPersistent.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.mediator; 2 | //同事(接口) 3 | public interface IPersistent { 4 | void getData(Object data); 5 | void getData(Object data,Midiator midiator); 6 | void saveData(); 7 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/mediator/Midiator.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.mediator; 2 | //具体中介者 3 | public class Midiator { 4 | PersistentDB persistentDB; 5 | PersistentFile persistentFile; 6 | public Midiator setPersistentDB(PersistentDB persistentDB) { 7 | this.persistentDB = persistentDB; 8 | return this; 9 | } 10 | public Midiator setPersistentFile(PersistentFile persistentFile) { 11 | this.persistentFile = persistentFile; 12 | return this; 13 | } 14 | public void notifyOther(IPersistent persistent,Object data){ 15 | if(persistent instanceof PersistentDB) 16 | persistentFile.getData(data); 17 | if(persistent instanceof PersistentFile) 18 | persistentDB.getData(data); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/mediator/PersistentDB.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.mediator; 2 | //具体同事 3 | public class PersistentDB implements IPersistent{ 4 | private Object data; 5 | @Override 6 | public void getData(Object data, Midiator midiator) { 7 | getData(data); 8 | midiator.notifyOther(this, data); 9 | } 10 | @Override 11 | public void saveData() { 12 | System.out.println(data + " 已保存到数据库"); 13 | } 14 | @Override 15 | public void getData(Object data) { 16 | this.data = data; 17 | saveData(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/mediator/PersistentFile.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.mediator; 2 | //具体同事 3 | public class PersistentFile implements IPersistent{ 4 | private Object data; 5 | @Override 6 | public void getData(Object data, Midiator midiator) { 7 | getData(data); 8 | midiator.notifyOther(this, data); 9 | } 10 | @Override 11 | public void saveData() { 12 | System.out.println(data + " 已保存到文件"); 13 | } 14 | @Override 15 | public void getData(Object data) { 16 | this.data = data; 17 | saveData(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/mediator/TestUse.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.mediator; 2 | public class TestUse { 3 | public static void main(String args[]){ 4 | Object data = "数据"; 5 | PersistentDB persistentDB = new PersistentDB(); 6 | PersistentFile persistentFile = new PersistentFile(); 7 | Midiator midiator = new Midiator(); 8 | midiator.setPersistentDB(persistentDB).setPersistentFile(persistentFile); 9 | persistentDB.getData(data, midiator); 10 | persistentFile.getData(data, midiator); 11 | } 12 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/mediator/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Administrator 3 | * 中介者模式 4 | */ 5 | package com.anxpp.designpattern.mediator; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/memento/BlackMemento.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.memento; 2 | //备忘录模式 3 | public class BlackMemento { 4 | public static void main(String[] args) { 5 | BlankOriginator originator = new BlankOriginator(); //发起人 6 | BlackCaretaker caretaker = new BlackCaretaker(); //负责人 7 | originator.setState("stateOne"); //设置状态 8 | caretaker.saveMemento(originator.createMemento()); //保存信息 9 | originator.setState("stateTwo"); //修改状态 10 | originator.recoverMemento(caretaker.recoverMemento());//恢复状态 11 | } 12 | } 13 | interface MementoIF {} 14 | //发起人 15 | class BlankOriginator { 16 | private String state; 17 | public String getState() { 18 | return state; 19 | } 20 | public void setState(String state) { 21 | this.state = state; 22 | } 23 | public MementoIF createMemento(){ 24 | return new Memento(state); 25 | } 26 | public void recoverMemento(MementoIF memento){ 27 | this.setState(((Memento)memento).getState()); 28 | } 29 | //以内部类实现备忘录角色 30 | private class Memento implements MementoIF{ 31 | private String state; 32 | private Memento(String state){ 33 | this.state = state; 34 | } 35 | private String getState() { 36 | return state; 37 | } 38 | } 39 | } 40 | //负责人 41 | class BlackCaretaker { 42 | private MementoIF memento; 43 | public MementoIF recoverMemento(){ 44 | return memento; 45 | } 46 | public void saveMemento(MementoIF memento){ 47 | this.memento = memento; 48 | } 49 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/memento/MementoSelf.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.memento; 2 | //自述历史备忘录 3 | public class MementoSelf { 4 | public static void main(String[] args) { 5 | OriginatorCaretaker originatorCaretaker = new OriginatorCaretaker();//发起人,同时为负责人 6 | originatorCaretaker.changeState("stateOne"); //改变状态 7 | IMemento memento = originatorCaretaker.createMemento(); //保存状态 8 | originatorCaretaker.changeState("stateTwo"); //改变状态 9 | originatorCaretaker.recoverMemento(memento); //恢复状态 10 | } 11 | } 12 | interface IMemento {} 13 | //发起人兼负责人 14 | class OriginatorCaretaker { 15 | public String state; 16 | public void changeState(String state){ 17 | this.state = state; 18 | } 19 | //创造快照 20 | public Memento createMemento(){ 21 | return new Memento(this); 22 | } 23 | //恢复状态 24 | public void recoverMemento(IMemento memento){ 25 | Memento m = (Memento)memento; 26 | changeState(m.state); 27 | } 28 | //内部类实现备忘录 29 | private class Memento implements IMemento{ 30 | private String state; 31 | private Memento(OriginatorCaretaker originatorCaretaker){ 32 | this.state = originatorCaretaker.state; 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/memento/SimpleMemento.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.memento; 2 | //简单的备忘录模式 3 | public class SimpleMemento { 4 | public static void main(String[] args) throws Exception { 5 | Originator originator = new Originator(); //发起人,要被保存的对象,也是他创建要保存的信息的 6 | Caretaker caretaker = new Caretaker(); //辅助保存的对象 7 | originator.setState("stateOne"); //设置状态 8 | caretaker.saveMemento(originator.createMemento()); //保存状态 9 | originator.setState("stateTwo"); //修改状态 10 | originator.recoverMemento(caretaker.recoverMemento()); //恢复状态 11 | } 12 | } 13 | //发起人 14 | class Originator { 15 | private String state; 16 | public Memento createMemento(){ 17 | return new Memento(state); 18 | } 19 | public void recoverMemento(Memento memento){ 20 | this.state = memento.getState(); 21 | } 22 | public String getState() { 23 | return state; 24 | } 25 | public void setState(String state) { 26 | this.state = state; 27 | } 28 | } 29 | //备忘录 30 | class Memento { 31 | private String state; 32 | public Memento(String state){ 33 | this.state = state; 34 | } 35 | public String getState() { 36 | return state; 37 | } 38 | public void setState(String state) { 39 | this.state = state; 40 | } 41 | } 42 | //负责人 43 | class Caretaker { 44 | private Memento memento; 45 | public Memento recoverMemento() throws Exception{ 46 | if(memento==null) 47 | throw new Exception("没有保存的状态"); 48 | return this.memento;//恢复状态 49 | } 50 | public void saveMemento(Memento memento){ 51 | this.memento = memento;//保存状态 52 | } 53 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/memento/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Administrator 3 | * 备忘录模式 4 | */ 5 | package com.anxpp.designpattern.memento; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/memento/textEditor/TextEditor.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.memento.textEditor; 2 | 3 | import java.util.LinkedList; 4 | 5 | //文本编辑器 6 | public class TextEditor { 7 | public static void main(String[] args) { 8 | //使用这个文本编辑器 9 | MyTextEditor editor = new MyTextEditor("这里是初始文本,可能为文件中读取的值。"); 10 | System.out.println("开始修改文本:"); 11 | editor.append("添加文字1"); 12 | editor.delWords(); //删除最后一个 13 | // editor.delWords(2); //删除最后2个 这两个方法是没有问题的,这里避免控制台输出太多,取消这两次修改 14 | // editor.delWords(1,5); //删除前面5个 15 | System.out.println("开始恢复:"); 16 | for(int i=0;i<10;i++) editor.recoverMemento();//恢复大于实际修改的次数不会出错,只会将文本设为o初始化状态 17 | System.out.println("开始重做:"); 18 | for(int i=0;i<10;i++) editor.redo(); //重做大于实际恢复的次数不会出错,只会将文本设为最后状态 19 | System.out.println("再次恢复:"); 20 | for(int i=0;i<10;i++) editor.recoverMemento();//恢复大于实际修改的次数不会出错,只会将文本设为o初始化状态 21 | System.out.println("再次重做:"); 22 | for(int i=0;i<10;i++) editor.redo(); //重做大于实际恢复的次数不会出错,只会将文本设为最后状态 23 | System.out.println("再次恢复:"); 24 | for(int i=0;i<10;i++) editor.recoverMemento();//恢复大于实际修改的次数不会出错,只会将文本设为o初始化状态 25 | editor.append("添加文字2"); 26 | System.out.println("再次重做:"); 27 | for(int i=0;i<10;i++) editor.redo(); //重做大于实际恢复的次数不会出错,只会将文本设为最后状态 28 | } 29 | } 30 | interface IMemento {} 31 | //发起人兼负责人 32 | class MyTextEditor { 33 | public StringBuffer text; 34 | private LinkedList mementos; //保存快照 35 | private LinkedList undos; //保存撤销的操作 36 | public MyTextEditor(){ 37 | this(""); 38 | } 39 | public MyTextEditor(String defaultStr){ 40 | text = new StringBuffer(defaultStr); 41 | mementos = new LinkedList(); 42 | undos = new LinkedList(); 43 | print(); 44 | } 45 | public void clearHistory(){ 46 | mementos.clear(); 47 | undos.clear(); 48 | } 49 | public void append(String appendStr){ 50 | if(appendStr==null||appendStr.length()==0) return; 51 | createMemento(); 52 | text.append(appendStr); 53 | print(); 54 | undos.clear(); 55 | } 56 | //删除最后一个 57 | public void delWords(){ 58 | delWords(1); 59 | } 60 | //删除最后n个 61 | public void delWords(int n){ 62 | if(n<1||n>text.length()) return; 63 | delWords(text.length()-n+1,text.length()); 64 | } 65 | //删除中间start到end的字符,第一个文字为第一个(而不是0) 66 | public void delWords(int start,int end){ 67 | if(start<1 || end>text.length()+1) return; 68 | createMemento(); 69 | text = text.delete(start-1, end); 70 | print(); 71 | } 72 | public void reset(String text){ 73 | this.text = new StringBuffer(text); 74 | } 75 | //新的快照 76 | public void createMemento(){ 77 | mementos.push(new Memento(this)); 78 | } 79 | //恢复状态 80 | public boolean recoverMemento(){ 81 | Memento memento = (Memento) mementos.poll(); 82 | if(memento==null) return false; 83 | undos.push(new Memento(this)); 84 | reset(memento.state); 85 | print(); 86 | return true; 87 | } 88 | //redo,redo的操作也可以恢复! 89 | public boolean redo(){ 90 | Memento memento = (Memento) undos.poll(); 91 | if(memento==null) return false; 92 | createMemento(); 93 | reset(memento.state); 94 | print(); 95 | return true; 96 | } 97 | //内部类实现备忘录 98 | private class Memento implements IMemento{ 99 | private String state; 100 | private Memento(MyTextEditor editor){ 101 | this.state = editor.text.toString(); 102 | } 103 | } 104 | void print(){ 105 | System.out.println("当前文本:" + text); 106 | } 107 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/memento/textEditor/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Administrator 3 | * 备忘录模式的应用 4 | */ 5 | package com.anxpp.designpattern.memento.textEditor; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Administrator 3 | * 以上为23种java模式的演示代码(24种) 4 | */ 5 | package com.anxpp.designpattern; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/prototype/APITestUse.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.prototype; 2 | //使用 java 自带的支持 3 | public class APITestUse { 4 | public static void main(String args[]) throws CloneNotSupportedException{ 5 | MyObject myObject = new MyObject(); 6 | myObject.i = 500; 7 | MyObject myObjectClone = (MyObject) myObject.clone(); 8 | System.out.println(myObjectClone.i); 9 | } 10 | } 11 | class MyObject implements Cloneable{ 12 | int i; 13 | public Object clone() throws CloneNotSupportedException{ 14 | return super.clone(); 15 | } 16 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/prototype/SerializablePrototype.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.prototype; 2 | import java.io.File; 3 | import java.io.FileInputStream; 4 | import java.io.FileOutputStream; 5 | import java.io.ObjectInputStream; 6 | import java.io.ObjectOutputStream; 7 | import java.io.Serializable; 8 | //使用Serializable支持克隆 9 | public class SerializablePrototype implements Serializable{ 10 | private static final long serialVersionUID = 1L; 11 | private int i; 12 | private transient int notClone;//transient关键字的成员不会被序列化 13 | public int getI() { 14 | return i; 15 | } 16 | public void setI(int i) { 17 | this.i = i; 18 | } 19 | public int getNotClone() { 20 | return notClone; 21 | } 22 | public void setNotClone(int notClone) { 23 | this.notClone = notClone; 24 | } 25 | public static long getSerialversionuid() { 26 | return serialVersionUID; 27 | } 28 | public void writeToFile(String path) throws Exception{ 29 | FileOutputStream outStream = new FileOutputStream(path); 30 | ObjectOutputStream objectOutputStream = new ObjectOutputStream(outStream); 31 | objectOutputStream.writeObject(this); 32 | outStream.close(); 33 | } 34 | public SerializablePrototype ReadFromFile(String path) throws Exception{ 35 | File file = new File(path); 36 | if(!file.exists()) 37 | file.createNewFile(); 38 | FileInputStream inStream = new FileInputStream(path); 39 | ObjectInputStream objectOutputStream = new ObjectInputStream(inStream); 40 | Object o= objectOutputStream.readObject(); 41 | inStream.close(); 42 | return (SerializablePrototype) o; 43 | } 44 | public static void main(String args[]) throws Exception{ 45 | String path = "D:/SerializablePrototype.instance"; 46 | SerializablePrototype prototype = new SerializablePrototype(); 47 | prototype.setI(123); 48 | prototype.setNotClone(456); 49 | prototype.writeToFile(path); 50 | SerializablePrototype prototypeClone = new SerializablePrototype(); 51 | prototypeClone = prototype.ReadFromFile(path); 52 | System.out.println(prototypeClone.getI() + " " + prototypeClone.getNotClone() + " "); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/prototype/SimplePrototype.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.prototype; 2 | //具体原型 3 | public class SimplePrototype implements Prototype,Cloneable { 4 | int value; 5 | //clone()实现 6 | @Override 7 | public Object cloneSelf() { 8 | SimplePrototype self = new SimplePrototype(); 9 | self.value = value; 10 | return self; 11 | } 12 | //使用 13 | public static void main(String args[]){ 14 | SimplePrototype simplePrototype = new SimplePrototype(); 15 | simplePrototype.value = 500; 16 | SimplePrototype simplePrototypeClone = (SimplePrototype) simplePrototype.cloneSelf(); 17 | System.out.println(simplePrototypeClone.value); 18 | } 19 | } 20 | //抽象原型 21 | interface Prototype{ 22 | Object cloneSelf();//克隆自身的方法 23 | } 24 | //客户端使用 25 | class Client{ 26 | SimplePrototype prototype; 27 | public Client(SimplePrototype prototype){ 28 | this.prototype = prototype; 29 | } 30 | public Object getPrototype(){ 31 | return prototype.cloneSelf(); 32 | } 33 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/prototype/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Administrator 3 | * 原型模式 4 | */ 5 | package com.anxpp.designpattern.prototype; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/proxy/AbstractObject.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.proxy; 2 | //抽象对象 3 | public interface AbstractObject { 4 | void method1(); 5 | int method2(); 6 | void method3(); 7 | } 8 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/proxy/ProxyObject.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.proxy; 2 | //代理对象 3 | public class ProxyObject implements AbstractObject { 4 | AbstractObject object = new TargetObject(); 5 | @Override 6 | public void method1() { 7 | object.method1(); 8 | } 9 | @Override 10 | public int method2() { 11 | return object.method2(); 12 | } 13 | @Override 14 | public void method3() { 15 | System.out.println("调用目标对象前的操作"); 16 | object.method3(); 17 | System.out.println("调用目标对象后的操作"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/proxy/TargetObject.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.proxy; 2 | //具体对象 3 | public class TargetObject implements AbstractObject { 4 | @Override 5 | public void method1() { 6 | System.out.println("具体对象的方法1"); 7 | } 8 | @Override 9 | public int method2() { 10 | System.out.println("具体对象的方法2"); 11 | return 0; 12 | } 13 | @Override 14 | public void method3() { 15 | System.out.println("具体对象的方法3"); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/proxy/TestUse.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.proxy; 2 | public class TestUse { 3 | public static void main(String args[]){ 4 | AbstractObject obj = new ProxyObject(); 5 | obj.method1(); 6 | obj.method2(); 7 | obj.method3(); 8 | } 9 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/proxy/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Administrator 3 | * 代理模式 4 | */ 5 | package com.anxpp.designpattern.proxy; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/simplefactory/SimpleFactory.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.simplefactory; 2 | //演示简单工厂 3 | public class SimpleFactory { 4 | public static void main(String args[]) throws Exception{ 5 | Factory factory = new Factory(); 6 | factory.produce("PRO5").run(); 7 | factory.produce("PRO6").run(); 8 | } 9 | } 10 | //抽象产品 11 | interface MeizuPhone{ 12 | void run(); 13 | } 14 | //具体产品X2 15 | class PRO5 implements MeizuPhone{ 16 | @Override 17 | public void run() { 18 | System.out.println("我是一台PRO5"); 19 | } 20 | } 21 | class PRO6 implements MeizuPhone{ 22 | @Override 23 | public void run() { 24 | System.out.println("我是一台PRO6"); 25 | } 26 | } 27 | //工厂 28 | class Factory{ 29 | MeizuPhone produce(String product) throws Exception{ 30 | if(product.equals("PRO5")) 31 | return new PRO5(); 32 | else if(product.equals("PRO6")) 33 | return new PRO6(); 34 | throw new Exception("No Such Class"); 35 | } 36 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/simplefactory/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Administrator 3 | * 简单工厂模式 4 | */ 5 | package com.anxpp.designpattern.simplefactory; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/singleton/EnumSingleton.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.singleton; 2 | /** 3 | * 简枚举实现单例模式,可以用于多线程 4 | * @author Administrator 5 | * 6 | */ 7 | public enum EnumSingleton { 8 | instance; 9 | } 10 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/singleton/SimpleSingleton.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.singleton; 2 | /** 3 | * 简单的单例模式,不能用于多线程 4 | * @author Administrator 5 | * 6 | */ 7 | public class SimpleSingleton { 8 | private static SimpleSingleton instance; 9 | private SimpleSingleton(){} 10 | public static SimpleSingleton getIntance(){ 11 | if(instance == null) 12 | instance = new SimpleSingleton(); 13 | return instance; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/singleton/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author http://anxpp.com 3 | * 单例模式 4 | */ 5 | package com.anxpp.designpattern.singleton; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/state/ISaveData.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.state; 2 | //抽象状态 3 | public interface ISaveData { 4 | void save(Object data); 5 | } 6 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/state/SaveBigData.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.state; 2 | //具体状态 3 | public enum SaveBigData implements ISaveData{ 4 | instance; 5 | @Override 6 | public void save(Object data) { 7 | System.out.println("保存到文件:" + data); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/state/SaveDataController.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.state; 2 | //环境(Context) 3 | public class SaveDataController { 4 | private ISaveData saveData; 5 | public void save(String data){ 6 | //为了演示,此处的大的数据其实也是很小的 7 | if(data.length()<1<<2) 8 | saveData = SaveSmallData.instance; 9 | else if(data.length()<1<<4) 10 | saveData = SaveMiddleData.instance; 11 | else 12 | saveData = SaveBigData.instance; 13 | saveData.save(data); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/state/SaveMiddleData.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.state; 2 | //具体状态 3 | public enum SaveMiddleData implements ISaveData{ 4 | instance; 5 | @Override 6 | public void save(Object data) { 7 | System.out.println("保存到Mysql:" + data); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/state/SaveSmallData.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.state; 2 | //具体状态 3 | public enum SaveSmallData implements ISaveData{ 4 | instance; 5 | @Override 6 | public void save(Object data) { 7 | System.out.println("保存到Redis:" + data); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/state/TestUse.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.state; 2 | public class TestUse { 3 | public static void main(String args[]){ 4 | String smallData = "小数据"; 5 | String middleData = "介于小数据和大数据之间的数据"; 6 | String bifgData = "这里就假定这是一个很大很大很大的数据"; 7 | SaveDataController saveDataController = new SaveDataController(); 8 | saveDataController.save(smallData); 9 | saveDataController.save(middleData); 10 | saveDataController.save(bifgData); 11 | } 12 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/state/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Administrator 3 | * 状态模式 4 | */ 5 | package com.anxpp.designpattern.state; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/strategy/ISaveData.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.strategy; 2 | //策略 3 | public interface ISaveData { 4 | void save(Object data); 5 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/strategy/SaveClient.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.strategy; 2 | //环境 3 | public class SaveClient { 4 | private ISaveData saveData; 5 | public SaveClient(ISaveData saveData){ 6 | this.saveData = saveData; 7 | } 8 | public void setSaveData(ISaveData saveData){ 9 | this.saveData = saveData; 10 | } 11 | public void save(Object data){ 12 | saveData.save(data); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/strategy/SaveToFile.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.strategy; 2 | //具体策略 3 | public class SaveToFile implements ISaveData { 4 | @Override 5 | public void save(Object data) { 6 | System.out.println("数据:" + data + " 保存到文件"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/strategy/SaveToMysql.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.strategy; 2 | //具体策略 3 | public class SaveToMysql implements ISaveData { 4 | @Override 5 | public void save(Object data) { 6 | System.out.println("数据:" + data + " 保存到Mysql"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/strategy/SaveToRedis.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.strategy; 2 | //具体策略 3 | public class SaveToRedis implements ISaveData { 4 | @Override 5 | public void save(Object data) { 6 | System.out.println("数据:" + data + " 保存到Redis"); 7 | } 8 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/strategy/TestUse.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.strategy; 2 | public class TestUse { 3 | public static void main(String args[]){ 4 | Object data = "数据"; 5 | ISaveData saveData = new SaveToRedis(); 6 | SaveClient client = new SaveClient(saveData); 7 | client.save(data); 8 | client.setSaveData(new SaveToFile()); 9 | client.save(data); 10 | } 11 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/strategy/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Administrator 3 | * 策略模式 4 | */ 5 | package com.anxpp.designpattern.strategy; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/templatemethod/AbstractTemplate.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.templatemethod; 2 | //抽象模板 3 | public abstract class AbstractTemplate { 4 | Object data; 5 | //这个就是模板方法 6 | void dealData(){ 7 | getData(); 8 | calcData(); 9 | printData(); 10 | } 11 | //下面是普通方法,可能已经实现,也可能需要子类实现 12 | abstract void getData(); 13 | abstract void calcData(); 14 | void printData(){ 15 | System.out.println(data); 16 | } 17 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/templatemethod/Template.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.templatemethod; 2 | //具体模板 3 | public class Template extends AbstractTemplate { 4 | @Override 5 | void getData() { 6 | data = "data"; 7 | } 8 | @Override 9 | void calcData() { 10 | data = (String)data+data; 11 | } 12 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/templatemethod/TestUse.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.templatemethod; 2 | public class TestUse { 3 | public static void main(String args[]){ 4 | Template template = new Template(); 5 | template.dealData(); 6 | } 7 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/templatemethod/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Administrator 3 | * 模板方法模式 4 | */ 5 | package com.anxpp.designpattern.templatemethod; -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/visitor/APPOwner.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.visitor; 2 | //具体访问者 3 | public class APPOwner implements Visitor{ 4 | @Override 5 | public void visit(UserVIP user) { 6 | String estimation = user.getEstimation(); 7 | if(estimation.length()>5) 8 | System.out.println("记录一条有效反馈:" + estimation); 9 | } 10 | @Override 11 | public void visit(UserOrdinary user) { 12 | String estimation = user.getEstimation(); 13 | if(estimation.length()>10) 14 | System.out.println("记录一条有效反馈:" + estimation); 15 | } 16 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/visitor/Dispatch.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.visitor; 2 | //演示java的静态分派和动态分派 3 | //结果会输出:Collection 4 | //所以重载的分派是根据静态类型进行的 5 | public class Dispatch { 6 | void print(FatherClass c){ 7 | System.out.print("父类"); 8 | } 9 | void print(ChildClass c){ 10 | System.out.print("子类"); 11 | } 12 | public static void main(String args[]){ 13 | FatherClass child = new ChildClass(); 14 | new Dispatch().print(child); 15 | child.print(); 16 | } 17 | } 18 | class FatherClass{ 19 | void print(){ 20 | System.out.println("父类"); 21 | } 22 | } 23 | class ChildClass extends FatherClass{ 24 | void print(){ 25 | System.out.print("子类"); 26 | } 27 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/visitor/MultiDispatch.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.visitor; 2 | 3 | public class MultiDispatch { 4 | public static void main(String args[]){ 5 | Father child = new Child(); 6 | child.print(); 7 | new Child().print(new Vistor()); 8 | } 9 | } 10 | class Father{ 11 | void print(){ 12 | System.out.println("父类"); 13 | } 14 | } 15 | class Child extends Father{ 16 | void print(){ 17 | System.out.print("子类"); 18 | } 19 | void print(Vistor c){ 20 | c.print(this); 21 | } 22 | } 23 | class Vistor { 24 | public void print(Child child){ 25 | child.print(); 26 | } 27 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/visitor/TestUse.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.visitor; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Iterator; 5 | 6 | public class TestUse { 7 | public static void main(String args[]){ 8 | Visitor appOwner = new APPOwner(); 9 | ArrayList users = new ArrayList(); 10 | users.add(new UserOrdinary("普通用户短反馈")); 11 | users.add(new UserOrdinary("这是一个普通用户的比较长的反馈")); 12 | users.add(new UserVIP("VIP用户的短反馈")); 13 | users.add(new UserVIP("VIP用户的比较长的反馈反馈")); 14 | Iterator iterator = users.iterator(); 15 | while(iterator.hasNext()){ 16 | iterator.next().accept(appOwner); 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/visitor/User.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.visitor; 2 | //抽象元素 3 | public interface User { 4 | void accept(Visitor visitor); 5 | } 6 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/visitor/UserOrdinary.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.visitor; 2 | //普通用户,具体元素 3 | public class UserOrdinary implements User{ 4 | String estimation; 5 | public UserOrdinary(String estimation){ 6 | this.estimation = estimation; 7 | } 8 | @Override 9 | public void accept(Visitor visitor) { 10 | visitor.visit(this); 11 | } 12 | String getEstimation(){ 13 | return estimation; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/visitor/UserVIP.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.visitor; 2 | //VIP用户,具体元素 3 | public class UserVIP implements User{ 4 | String estimation; 5 | public UserVIP(String estimation){ 6 | this.estimation = estimation; 7 | } 8 | @Override 9 | public void accept(Visitor visitor) { 10 | visitor.visit(this); 11 | } 12 | String getEstimation(){ 13 | return estimation; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/visitor/Visitor.java: -------------------------------------------------------------------------------- 1 | package com.anxpp.designpattern.visitor; 2 | //抽象访问者 3 | public interface Visitor { 4 | void visit(UserVIP user); 5 | void visit(UserOrdinary user); 6 | } -------------------------------------------------------------------------------- /src/com/anxpp/designpattern/visitor/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Administrator 3 | * 访问者模式 4 | */ 5 | package com.anxpp.designpattern.visitor; --------------------------------------------------------------------------------