├── .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;
--------------------------------------------------------------------------------