├── .gitignore ├── src └── com │ └── designpattern │ ├── Prototype │ ├── 包说明 │ ├── Java原型结构 │ ├── 标准原型结构 │ ├── shallowcopy │ │ ├── Plan.java │ │ └── Client.java │ └── deepcopy │ │ ├── Plan.java │ │ └── Client.java │ ├── state │ ├── 包说明 │ ├── pattern_realize │ │ ├── State.java │ │ ├── NormalState.java │ │ ├── DecelerateState.java │ │ ├── ExpediteState.java │ │ ├── DizzinessState.java │ │ ├── Client.java │ │ └── Hero.java │ ├── common_realize │ │ └── Client.java │ └── 结构 │ ├── Flyweight │ ├── 包说明 │ ├── simple │ │ ├── Flyweight.java │ │ ├── Menu.java │ │ ├── ConcreteFlyweight.java │ │ ├── Client.java │ │ └── FlyweightFactory.java │ ├── composite │ │ ├── Flyweight.java │ │ ├── Menu.java │ │ ├── ConcreteFlyweight.java │ │ ├── ConcreteCompositeFlyweight.java │ │ ├── Client.java │ │ └── FlyweightFactory.java │ ├── 单纯享元模式结构 │ └── 复合享元模式结构 │ ├── bridge │ ├── 包说明.txt │ ├── solution_1 │ │ ├── CommonMessage.java │ │ ├── UrgencyMessage.java │ │ ├── Message.java │ │ ├── VeryUrgencyMessage.java │ │ ├── CommonEmailMessage.java │ │ ├── CommonMobileMessage.java │ │ ├── UrgencyEmailMessage.java │ │ ├── UrgencyMobileMessage.java │ │ ├── CommonSystemMessage.java │ │ ├── UrgencySystemMessage.java │ │ ├── VeryUrgencyEmailMessage.java │ │ ├── VeryUrgencyMobileMessage.java │ │ ├── VeryUrgencySystemMessage.java │ │ └── Client.java │ ├── solution_2 │ │ ├── EmailMessage.java │ │ ├── MessageImplementor.java │ │ ├── MobileMessage.java │ │ ├── SystemMessage.java │ │ ├── CommonMessage.java │ │ ├── UrgencyMessage.java │ │ ├── AbstractMessage.java │ │ ├── VeryUrgencyMessage.java │ │ └── Client.java │ ├── scene_example │ │ └── scene_example.java │ └── 结构 │ ├── Memento │ ├── ###包说明 │ ├── undoByMemento │ │ ├── Command.java │ │ ├── People.java │ │ ├── ChessCaretaker.java │ │ ├── ChessMemento.java │ │ ├── TakeBackCommand.java │ │ ├── ChessOriginator.java │ │ └── Client.java │ ├── SingleCheckpoints │ │ ├── ChessCaretaker.java │ │ ├── ChessMemento.java │ │ ├── Client.java │ │ └── ChessOriginator.java │ ├── MutilCheckpoints │ │ ├── ChessCaretaker.java │ │ ├── ChessMemento.java │ │ ├── ChessOriginator.java │ │ └── Client.java │ ├── OfflineStorage │ │ ├── ChessMemento.java │ │ ├── Client.java │ │ ├── ChessOriginator.java │ │ └── ChessCaretaker.java │ ├── 自述模式结构 │ └── 白箱实现(利用宽接口)结构 │ ├── factory │ ├── method │ │ ├── Mobile.java │ │ ├── HuaweiMobile.java │ │ ├── XiaomiMobile.java │ │ ├── MobileFactory.java │ │ ├── HuaweiFactory.java │ │ ├── XiaomiFactory.java │ │ └── Test.java │ ├── simple │ │ ├── Mobile.java │ │ ├── HuaweiMobile.java │ │ ├── XiaomiMobile.java │ │ ├── Test.java │ │ └── MobileFactory.java │ └── absract │ │ ├── AbstractProduct.java │ │ ├── HuaweiMP3.java │ │ ├── XiaomiMP3.java │ │ ├── HuaweiMobile.java │ │ ├── MP3.java │ │ ├── XiaomiMobile.java │ │ ├── Mobile.java │ │ ├── AbstractFactory.java │ │ ├── Test.java │ │ ├── HuaweiFactory.java │ │ └── XiaomiFactory.java │ ├── Command │ ├── extend包说明.txt │ ├── Command.java │ ├── extend │ │ ├── CommandQueue │ │ │ ├── Command.java │ │ │ ├── H5Coder.java │ │ │ ├── JavaCoder.java │ │ │ ├── H5Command.java │ │ │ ├── JavaCommand.java │ │ │ ├── Manager.java │ │ │ ├── Client.java │ │ │ └── CommandQueue.java │ │ ├── MacroCommand │ │ │ ├── Command.java │ │ │ ├── MacroCommand.java │ │ │ ├── OSStartCommand.java │ │ │ ├── HDDStartCommand.java │ │ │ ├── MBRStartCommand.java │ │ │ ├── BIOSStartCommand.java │ │ │ ├── Computer.java │ │ │ ├── ComputerMacroCommand.java │ │ │ └── Client.java │ │ ├── Undo │ │ │ ├── Command.java │ │ │ ├── RequestMakeDir.java │ │ │ ├── CreateDirCommand.java │ │ │ ├── Client.java │ │ │ └── MakeDir.java │ │ ├── MultiUndo │ │ │ ├── Command.java │ │ │ ├── RequestMakeDir.java │ │ │ ├── CreateDirCommand.java │ │ │ ├── Client.java │ │ │ └── MakeDir.java │ │ └── RequestLog │ │ │ ├── DeleteCommand.java │ │ │ ├── InsertCommand.java │ │ │ ├── UpdateCommand.java │ │ │ ├── Operator.java │ │ │ ├── Command.java │ │ │ ├── SqlExecuteTool.java │ │ │ └── Client.java │ ├── TVOnCommand.java │ ├── TV.java │ ├── TVOffCommand.java │ ├── RemoteControl.java │ ├── Client.java │ └── 结构 │ ├── strategy │ ├── AbstractSaleActivity.java │ ├── SaleActivity618.java │ ├── SaleActivity1111.java │ ├── SaleActivity1212.java │ ├── Test.java │ └── ActivityEntry.java │ ├── iterator │ ├── Iterator.java │ ├── Aggregate.java │ ├── Test.java │ ├── ConcreteAggregate.java │ ├── ConcreteIterator.java │ └── jdk_use_iterator │ │ ├── IteratorTest.java │ │ └── IteratorTest1.java │ ├── Decorator │ ├── Coder.java │ ├── SpecificCoder.java │ ├── Decorator.java │ ├── JavaCoder.java │ ├── JavaArchitect.java │ ├── Test.java │ └── 结构 │ ├── builder │ ├── BrushPen.java │ ├── BallpointPen.java │ ├── PenBuilder.java │ ├── PenDirector.java │ ├── Test.java │ ├── Pen.java │ └── impl │ │ ├── BrushPenBuilder.java │ │ └── BallpointPenBuilder.java │ ├── facade │ ├── TVI.java │ ├── LightI.java │ ├── SmartHomeI.java │ ├── impl │ │ ├── TV.java │ │ ├── Light.java │ │ └── SmartHome.java │ └── Test.java │ ├── Adapter │ ├── ClassAdapter │ │ ├── MyCharger.java │ │ ├── Test.java │ │ ├── RussiaSocket.java │ │ ├── PowerAdapter.java │ │ └── 结构 │ ├── ObjectAdapter │ │ ├── MyCharger.java │ │ ├── RussiaSocket.java │ │ ├── Test.java │ │ ├── PowerAdapter.java │ │ └── 结构 │ └── DefaultAdapter │ │ ├── Test.java │ │ ├── Person.java │ │ ├── Student.java │ │ └── PersonAdapter.java │ ├── Visitor │ ├── 包说明 │ ├── Animal.java │ ├── Cat.java │ ├── Dog.java │ ├── Person.java │ ├── Owner.java │ ├── Someone.java │ ├── Client.java │ ├── Home.java │ └── expand │ │ ├── Dynamic │ │ └── Client.java │ │ ├── Static │ │ └── Client.java │ │ └── doubleDispatch │ │ └── Client.java │ ├── templete │ ├── StudentA.java │ ├── StudentB.java │ ├── Test.java │ └── Homeork.java │ ├── Mediator │ ├── Mediator.java │ ├── PeopleA.java │ ├── PeopleB.java │ ├── PeopleC.java │ ├── Client.java │ ├── People.java │ ├── MessageMediator.java │ └── 结构 │ ├── Observer │ ├── FansObserver.java │ ├── ConcreteFansObserver.java │ ├── Client.java │ ├── jdk_realize │ │ ├── Client.java │ │ ├── ConcreteFansObserver.java │ │ └── ConcreteWechatSubject.java │ ├── ConcreteWechatSubject.java │ ├── WechatSubject.java │ ├── push 结构 │ └── pull 结构 │ ├── utils │ ├── LocationUtil.java │ ├── DateFormatUtil.java │ └── FileUtil.java │ ├── proxy │ ├── dynamicproxy │ │ ├── MovieStar.java │ │ ├── Test.java │ │ ├── RealMovieStar.java │ │ └── ProxyMovieStarHandler.java │ └── staticproxy │ │ ├── MovieStar.java │ │ ├── Test.java │ │ ├── RealMovieStar.java │ │ └── ProxyMovieStar.java │ ├── Interpreter │ ├── Context.java │ ├── NotExp.java │ ├── VariableExp.java │ ├── BooleanExp.java │ ├── 结构 │ ├── OrExp.java │ ├── AndExp.java │ └── Client.java │ ├── Composite │ ├── Leaf.java │ ├── Component.java │ ├── Client.java │ ├── Composite.java │ └── 结构 │ ├── ChainOfResponsibility │ ├── Client.java │ ├── KFC.java │ ├── DongBaSubbranch.java │ ├── WangJingSubbranch.java │ ├── JiuXianQiaoSubbranch.java │ └── 结构 │ └── singleton │ └── SingleTest.java ├── 脑图 ├── 中介者模式.xmind ├── 享元模式.xmind ├── 代理模式.xmind ├── 单例模式.xmind ├── 原型模式.xmind ├── 命令模式.xmind ├── 备忘录模式.xmind ├── 外观模式.xmind ├── 工厂模式.xmind ├── 建造者模式.xmind ├── 桥接模式.xmind ├── 状态模式.xmind ├── 策略模式.xmind ├── 组合模式.xmind ├── 职责链模式.xmind ├── 装饰者模式.xmind ├── 观察者模式.xmind ├── 解释器模式.xmind ├── 访问者模式.xmind ├── 迭代器模式.xmind ├── 适配器模式.xmind ├── 模板方法模式.xmind └── 设计模式总结篇.xmind ├── Images ├── summary.png └── summary-max.png ├── .classpath ├── .project └── .settings └── org.eclipse.jdt.core.prefs /.gitignore: -------------------------------------------------------------------------------- 1 | /bin/ 2 | -------------------------------------------------------------------------------- /src/com/designpattern/Prototype/包说明: -------------------------------------------------------------------------------- 1 | 浅拷贝实例: shallowcopy 2 | 深拷贝实例: deepcopy -------------------------------------------------------------------------------- /脑图/中介者模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/中介者模式.xmind -------------------------------------------------------------------------------- /脑图/享元模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/享元模式.xmind -------------------------------------------------------------------------------- /脑图/代理模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/代理模式.xmind -------------------------------------------------------------------------------- /脑图/单例模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/单例模式.xmind -------------------------------------------------------------------------------- /脑图/原型模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/原型模式.xmind -------------------------------------------------------------------------------- /脑图/命令模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/命令模式.xmind -------------------------------------------------------------------------------- /脑图/备忘录模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/备忘录模式.xmind -------------------------------------------------------------------------------- /脑图/外观模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/外观模式.xmind -------------------------------------------------------------------------------- /脑图/工厂模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/工厂模式.xmind -------------------------------------------------------------------------------- /脑图/建造者模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/建造者模式.xmind -------------------------------------------------------------------------------- /脑图/桥接模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/桥接模式.xmind -------------------------------------------------------------------------------- /脑图/状态模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/状态模式.xmind -------------------------------------------------------------------------------- /脑图/策略模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/策略模式.xmind -------------------------------------------------------------------------------- /脑图/组合模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/组合模式.xmind -------------------------------------------------------------------------------- /脑图/职责链模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/职责链模式.xmind -------------------------------------------------------------------------------- /脑图/装饰者模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/装饰者模式.xmind -------------------------------------------------------------------------------- /脑图/观察者模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/观察者模式.xmind -------------------------------------------------------------------------------- /脑图/解释器模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/解释器模式.xmind -------------------------------------------------------------------------------- /脑图/访问者模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/访问者模式.xmind -------------------------------------------------------------------------------- /脑图/迭代器模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/迭代器模式.xmind -------------------------------------------------------------------------------- /脑图/适配器模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/适配器模式.xmind -------------------------------------------------------------------------------- /脑图/模板方法模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/模板方法模式.xmind -------------------------------------------------------------------------------- /脑图/设计模式总结篇.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/脑图/设计模式总结篇.xmind -------------------------------------------------------------------------------- /Images/summary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/Images/summary.png -------------------------------------------------------------------------------- /src/com/designpattern/state/包说明: -------------------------------------------------------------------------------- 1 | common_realize:普通实现,非状态模式实现 2 | 3 | pattern_realize:状态模式实现实例 -------------------------------------------------------------------------------- /Images/summary-max.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JsonShare/DesignPattern/HEAD/Images/summary-max.png -------------------------------------------------------------------------------- /src/com/designpattern/Flyweight/包说明: -------------------------------------------------------------------------------- 1 | 单纯享元模式实例 com.designpattern.Flyweight.simple 2 | 复合享元模式实例 com.designpattern.Flyweight.composite -------------------------------------------------------------------------------- /src/com/designpattern/bridge/包说明.txt: -------------------------------------------------------------------------------- 1 | 对应博客源码 2 | solution_1 方案一源码,即未使用桥接模式 3 | solution_1 方案二源码,即使用桥接模式 4 | 5 | scene_example JDBC模拟--讲解桥接模式 -------------------------------------------------------------------------------- /src/com/designpattern/Memento/###包说明: -------------------------------------------------------------------------------- 1 | 2 | 3 | 单个检查点 SingleCheckpoints 4 | 多重检查点 MutilCheckpoints 5 | 6 | 利用备忘录实现撤销操作 undoByMemento 7 | 8 | 离线存储 OfflineStorage -------------------------------------------------------------------------------- /src/com/designpattern/factory/method/Mobile.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.method; 2 | /** 3 | * 类说明 :抽象手机类 4 | */ 5 | public abstract class Mobile { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /src/com/designpattern/factory/simple/Mobile.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.simple; 2 | /** 3 | * 类说明 :抽象手机类 4 | */ 5 | public abstract class Mobile { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend包说明.txt: -------------------------------------------------------------------------------- 1 | extend 为命令模式的扩展说明 2 | 3 | Undo 撤销请求简单实例 4 | MultiUndo 多次撤销实例 5 | CommandQueue 队列请求实例 6 | MacroCommand 宏命令请求实例 7 | RequestLog 请求日志实例 -------------------------------------------------------------------------------- /src/com/designpattern/factory/absract/AbstractProduct.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.absract; 2 | /** 3 | * 类说明 :抽象产品类 4 | */ 5 | public abstract class AbstractProduct { 6 | 7 | } -------------------------------------------------------------------------------- /src/com/designpattern/factory/absract/HuaweiMP3.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.absract; 2 | /** 3 | * 类说明 :具体MP3--华为MP3 4 | */ 5 | public class HuaweiMP3 extends MP3{ 6 | 7 | } 8 | -------------------------------------------------------------------------------- /src/com/designpattern/factory/absract/XiaomiMP3.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.absract; 2 | /** 3 | * 类说明 :具体MP3--小米MP3 4 | */ 5 | public class XiaomiMP3 extends MP3{ 6 | 7 | } 8 | -------------------------------------------------------------------------------- /src/com/designpattern/factory/absract/HuaweiMobile.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.absract; 2 | /** 3 | * 类说明 :具体手机--华为手机 4 | */ 5 | public class HuaweiMobile extends Mobile{ 6 | 7 | } 8 | -------------------------------------------------------------------------------- /src/com/designpattern/factory/absract/MP3.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.absract; 2 | /** 3 | * 类说明 :抽象MP3类 4 | */ 5 | public abstract class MP3 extends AbstractProduct{ 6 | 7 | } 8 | -------------------------------------------------------------------------------- /src/com/designpattern/factory/absract/XiaomiMobile.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.absract; 2 | /** 3 | * 类说明 :具体手机--小米手机 4 | */ 5 | public class XiaomiMobile extends Mobile{ 6 | 7 | } 8 | -------------------------------------------------------------------------------- /src/com/designpattern/factory/method/HuaweiMobile.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.method; 2 | /** 3 | * 类说明 :具体手机--华为手机 4 | */ 5 | public class HuaweiMobile extends Mobile{ 6 | 7 | } 8 | -------------------------------------------------------------------------------- /src/com/designpattern/factory/method/XiaomiMobile.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.method; 2 | /** 3 | * 类说明 :具体手机--小米手机 4 | */ 5 | public class XiaomiMobile extends Mobile{ 6 | 7 | } 8 | -------------------------------------------------------------------------------- /src/com/designpattern/factory/simple/HuaweiMobile.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.simple; 2 | /** 3 | * 类说明 :具体手机--华为手机 4 | */ 5 | public class HuaweiMobile extends Mobile{ 6 | 7 | } 8 | -------------------------------------------------------------------------------- /src/com/designpattern/factory/simple/XiaomiMobile.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.simple; 2 | /** 3 | * 类说明 :具体手机--小米手机 4 | */ 5 | public class XiaomiMobile extends Mobile{ 6 | 7 | } 8 | -------------------------------------------------------------------------------- /src/com/designpattern/factory/absract/Mobile.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.absract; 2 | /** 3 | * 类说明 :抽象手机类 4 | */ 5 | public abstract class Mobile extends AbstractProduct{ 6 | 7 | } 8 | -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_1/CommonMessage.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_1; 2 | /** 3 | * 普通消息接口 4 | * @author Json 5 | */ 6 | public interface CommonMessage extends Message { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /src/com/designpattern/strategy/AbstractSaleActivity.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.strategy; 2 | /** 3 | * 类说明 :促销活动抽象接口 4 | */ 5 | public interface AbstractSaleActivity { 6 | 7 | public void saleEvent(); 8 | } 9 | -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_1/UrgencyMessage.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_1; 2 | /** 3 | * 加急消息接口 4 | * @author Json 5 | */ 6 | public interface UrgencyMessage extends Message { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /src/com/designpattern/factory/method/MobileFactory.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.method; 2 | /** 3 | * 类说明 :抽象手机生产工厂 4 | */ 5 | public abstract interface MobileFactory { 6 | 7 | public abstract Mobile product(); 8 | } 9 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/Command.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command; 2 | /** 3 | * 抽象命令角色类 4 | * @author Json 5 | */ 6 | public interface Command { 7 | /** 8 | * 执行方法 9 | */ 10 | void execute(); 11 | } 12 | -------------------------------------------------------------------------------- /src/com/designpattern/iterator/Iterator.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.iterator; 2 | /** 3 | * 抽象迭代器接口 4 | * @author Json 5 | */ 6 | public interface Iterator { 7 | 8 | public boolean hasNext(); 9 | 10 | public Object next(); 11 | } 12 | -------------------------------------------------------------------------------- /src/com/designpattern/Decorator/Coder.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Decorator; 2 | /** 3 | * 抽象构建角色 4 | * 程序员接口 5 | * @author Json 6 | */ 7 | public interface Coder { 8 | 9 | /** 10 | * 写代码 11 | */ 12 | public void writeCode(); 13 | } 14 | -------------------------------------------------------------------------------- /src/com/designpattern/builder/BrushPen.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.builder; 2 | /** 3 | * 具体产品类 -- 画笔 4 | * @author Json 5 | */ 6 | public class BrushPen extends Pen{ 7 | public BrushPen(){ 8 | System.out.println("生产组装画笔"); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/com/designpattern/facade/TVI.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.facade; 2 | /** 3 | * 类说明 :电视接口 4 | */ 5 | public interface TVI { 6 | /** 7 | * 开机 8 | */ 9 | public void on(); 10 | /** 11 | * 关机 12 | */ 13 | public void off(); 14 | } 15 | -------------------------------------------------------------------------------- /src/com/designpattern/Adapter/ClassAdapter/MyCharger.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Adapter.ClassAdapter; 2 | /** 3 | * 自带的充电插头 - 双脚扁头 4 | * PS: 目标接口,或称为标准接口 5 | * @author Json 6 | */ 7 | public interface MyCharger { 8 | public void charge(); 9 | } 10 | -------------------------------------------------------------------------------- /src/com/designpattern/Adapter/ObjectAdapter/MyCharger.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Adapter.ObjectAdapter; 2 | /** 3 | * 自带的充电插头 - 双脚扁头 4 | * PS: 目标接口,或称为标准接口 5 | * @author Json 6 | */ 7 | public interface MyCharger { 8 | public void charge(); 9 | } 10 | -------------------------------------------------------------------------------- /src/com/designpattern/builder/BallpointPen.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.builder; 2 | /** 3 | * 具体产品类 -- 圆珠笔 4 | * @author Json 5 | */ 6 | public class BallpointPen extends Pen{ 7 | public BallpointPen(){ 8 | System.out.println("生产组装圆珠笔"); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/com/designpattern/facade/LightI.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.facade; 2 | /** 3 | * 类说明 :灯光接口 4 | */ 5 | public interface LightI { 6 | /** 7 | * 开灯 8 | */ 9 | public void on(); 10 | /** 11 | * 关灯 12 | */ 13 | public void off(); 14 | } 15 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/CommandQueue/Command.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.CommandQueue; 2 | /** 3 | * 抽象命令角色类 4 | * @author Json 5 | */ 6 | public interface Command { 7 | /** 8 | * 执行方法 9 | */ 10 | void execute(); 11 | } 12 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/MacroCommand/Command.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.MacroCommand; 2 | /** 3 | * 抽象命令角色类 4 | * @author Json 5 | */ 6 | public interface Command { 7 | /** 8 | * 执行方法 9 | */ 10 | void execute(); 11 | } 12 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/Undo/Command.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.Undo; 2 | /** 3 | * 包含撤销命令的接口 4 | * @author Json 5 | */ 6 | public interface Command { 7 | //执行方法 8 | void execute(); 9 | //撤销方法 10 | void undo(); 11 | } 12 | -------------------------------------------------------------------------------- /src/com/designpattern/Visitor/包说明: -------------------------------------------------------------------------------- 1 | 访问者模式拓展篇实例: com.designpattern.Visitor.expand 2 | 3 | 静态分派 : com.designpattern.Visitor.expand.Static 4 | 5 | 动态分派: com.designpattern.Visitor.expand.Dynamic 6 | 7 | 双分派: com.designpattern.Visitor.expand.doubleDispatch 8 | 9 | -------------------------------------------------------------------------------- /src/com/designpattern/facade/SmartHomeI.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.facade; 2 | /** 3 | * 类说明 :智能家居总开关接口 4 | */ 5 | public interface SmartHomeI { 6 | /** 7 | * 总开 8 | */ 9 | public void on(); 10 | /** 11 | * 总关 12 | */ 13 | public void off(); 14 | } 15 | -------------------------------------------------------------------------------- /src/com/designpattern/Visitor/Animal.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Visitor; 2 | 3 | /** 4 | * 抽象节点(元素)角色 -- 宠物 5 | * @author Json<> 6 | */ 7 | public abstract class Animal { 8 | //吃食操作 9 | public abstract void accept(Person person); 10 | } 11 | -------------------------------------------------------------------------------- /src/com/designpattern/templete/StudentA.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.templete; 2 | /** 3 | * 类说明 :A同学完成作业类 4 | */ 5 | public class StudentA extends Homeork{ 6 | 7 | @Override 8 | void doHomework() { 9 | //TODO 业务 10 | System.out.println("A同学是这样完成作业的!"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/com/designpattern/factory/absract/AbstractFactory.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.absract; 2 | /** 3 | * 类说明 :抽象工厂类 4 | */ 5 | public abstract interface AbstractFactory { 6 | 7 | public abstract Mobile productMobile(); 8 | 9 | public abstract MP3 productMP3(); 10 | } 11 | -------------------------------------------------------------------------------- /src/com/designpattern/templete/StudentB.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.templete; 2 | /** 3 | * 类说明 :B同学完成作业类 4 | */ 5 | public class StudentB extends Homeork{ 6 | 7 | @Override 8 | void doHomework() { 9 | // TODO 业务 10 | System.out.println("B同学是这样完成作业的!"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/MultiUndo/Command.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.MultiUndo; 2 | /** 3 | * 包含撤销命令的接口 4 | * @author Json 5 | */ 6 | public interface Command { 7 | //执行方法 8 | void execute(String dirName); 9 | //撤销方法 10 | void undo(); 11 | } 12 | -------------------------------------------------------------------------------- /src/com/designpattern/Mediator/Mediator.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Mediator; 2 | 3 | /** 4 | * 抽象中介者类 5 | * @author Json<> 6 | */ 7 | public interface Mediator { 8 | /** 9 | * 发送消息 10 | */ 11 | public void chat(People p,String message); 12 | } 13 | -------------------------------------------------------------------------------- /src/com/designpattern/iterator/Aggregate.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.iterator; 2 | /** 3 | * 抽象容器 4 | * @author Json 5 | */ 6 | public interface Aggregate { 7 | 8 | public void add(Object obj); 9 | 10 | public void remove(Object obj); 11 | 12 | public Iterator iterator(); 13 | } 14 | -------------------------------------------------------------------------------- /src/com/designpattern/Memento/undoByMemento/Command.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Memento.undoByMemento; 2 | 3 | /** 4 | * 包含撤销命令的接口 5 | * @author Json<> 6 | */ 7 | public interface Command { 8 | //下棋操作 9 | void execute(); 10 | //撤销方法 11 | void undo(); 12 | } 13 | -------------------------------------------------------------------------------- /.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/com/designpattern/Decorator/SpecificCoder.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Decorator; 2 | /** 3 | * 具体构建角色 4 | * 一个具体的程序员 5 | * @author Json 6 | */ 7 | public class SpecificCoder implements Coder { 8 | @Override 9 | public void writeCode() { 10 | System.out.println("我是一个程序员,我能写代码..."); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/com/designpattern/Adapter/ClassAdapter/Test.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Adapter.ClassAdapter; 2 | /** 3 | * 测试 4 | * @author Json 5 | */ 6 | public class Test { 7 | public static void main(String[] args) { 8 | MyCharger charger = new PowerAdapter(); 9 | //通过适配器调用特殊功能 10 | charger.charge(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/com/designpattern/strategy/SaleActivity618.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.strategy; 2 | /** 3 | * 类说明 :定义具体的促销活动 - 518活动 4 | */ 5 | public class SaleActivity618 implements AbstractSaleActivity { 6 | 7 | @Override 8 | public void saleEvent() { 9 | //TODO 业务逻辑 10 | System.out.println("618促销活动!"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_1/Message.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_1; 2 | /** 3 | * 消息统一接口 4 | * @author Json 5 | */ 6 | public interface Message { 7 | /** 8 | * 发送消息 9 | * @param message 消息内容 10 | * @param users 接收人 11 | */ 12 | public void send(String message,String users); 13 | } 14 | -------------------------------------------------------------------------------- /src/com/designpattern/strategy/SaleActivity1111.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.strategy; 2 | /** 3 | * 类说明 :定义具体的促销活动 - 1111活动 4 | */ 5 | public class SaleActivity1111 implements AbstractSaleActivity { 6 | 7 | @Override 8 | public void saleEvent() { 9 | // TODO 业务逻辑 10 | System.out.println("双十一促销活动!"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/com/designpattern/strategy/SaleActivity1212.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.strategy; 2 | /** 3 | * 类说明 :定义具体的促销活动 - 1212活动 4 | */ 5 | public class SaleActivity1212 implements AbstractSaleActivity{ 6 | 7 | @Override 8 | public void saleEvent() { 9 | // TODO 业务逻辑 10 | System.out.println("双十二促销活动!"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/com/designpattern/Adapter/ClassAdapter/RussiaSocket.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Adapter.ClassAdapter; 2 | /** 3 | * 俄罗斯插座 4 | * PS: 已存在的、具有特殊功能、但不符合我们既有的标准接口的类 5 | * @author Json 6 | */ 7 | public class RussiaSocket { 8 | //双脚圆形充电 9 | public void specificCharge(){ 10 | System.out.println("充电中..."); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/com/designpattern/Adapter/ObjectAdapter/RussiaSocket.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Adapter.ObjectAdapter; 2 | /** 3 | * 俄罗斯插座 4 | * PS: 已存在的、具有特殊功能、但不符合我们既有的标准接口的类 5 | * @author Json 6 | */ 7 | public class RussiaSocket { 8 | //双脚圆形充电 9 | public void specificCharge(){ 10 | System.out.println("充电中..."); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/com/designpattern/factory/method/HuaweiFactory.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.method; 2 | /** 3 | * 类说明 :具体工厂类 - 华为工厂 4 | */ 5 | public class HuaweiFactory implements MobileFactory{ 6 | 7 | @Override 8 | public Mobile product() { 9 | System.out.println("生产华为手机."); 10 | return new HuaweiMobile(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/com/designpattern/Flyweight/simple/Flyweight.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Flyweight.simple; 2 | 3 | /** 4 | * 享元接口 5 | * @author Json<> 6 | */ 7 | public interface Flyweight { 8 | /** 9 | * 传入外部状态 10 | * @param extrinsicState 外部状态 11 | */ 12 | public void operation(String extrinsicState); 13 | } 14 | -------------------------------------------------------------------------------- /src/com/designpattern/Observer/FansObserver.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Observer; 2 | 3 | /** 4 | * 观察者接口,定义一个更新的接口给那些在目标发生改变的时候被通知的对象 5 | * 这里模拟 -- 粉丝用户接口 6 | * @author Json<> 7 | */ 8 | public interface FansObserver { 9 | /** 10 | * 粉丝接收文章接口 11 | */ 12 | public void update(String article); 13 | } 14 | -------------------------------------------------------------------------------- /src/com/designpattern/factory/method/XiaomiFactory.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.method; 2 | /** 3 | * 类说明 :具体工厂类 - 小米工厂 4 | */ 5 | public class XiaomiFactory implements MobileFactory{ 6 | 7 | @Override 8 | public Mobile product() { 9 | System.out.println("生产小米手机."); 10 | return new XiaomiMobile(); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/com/designpattern/state/pattern_realize/State.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.state.pattern_realize; 2 | 3 | /** 4 | * 封装与Context的一个特定状态相关的行为:英雄移动 5 | * @author Json<> 6 | */ 7 | public interface State { 8 | 9 | /** 10 | * 处理移动状态 11 | * @param hero 12 | */ 13 | public void move(Hero hero); 14 | } 15 | -------------------------------------------------------------------------------- /src/com/designpattern/Flyweight/composite/Flyweight.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Flyweight.composite; 2 | 3 | /** 4 | * 享元接口 5 | * @author Json<> 6 | */ 7 | public interface Flyweight { 8 | /** 9 | * 传入外部状态 10 | * @param extrinsicState 外部状态 11 | */ 12 | public void operation(String extrinsicState); 13 | } 14 | -------------------------------------------------------------------------------- /src/com/designpattern/Visitor/Cat.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Visitor; 2 | 3 | /** 4 | * 具体节点(元素)角色 -- 宠物猫 5 | * @author Json<> 6 | */ 7 | public class Cat extends Animal { 8 | 9 | @Override 10 | public void accept(Person person) { 11 | person.feed(this); 12 | System.out.println("好好吃,喵喵喵!!!"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/com/designpattern/Visitor/Dog.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Visitor; 2 | 3 | /** 4 | * 具体节点(元素)角色 -- 宠物狗 5 | * @author Json<> 6 | */ 7 | public class Dog extends Animal { 8 | 9 | @Override 10 | public void accept(Person person) { 11 | person.feed(this); 12 | System.out.println("好好吃,汪汪汪!!!"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/com/designpattern/state/pattern_realize/NormalState.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.state.pattern_realize; 2 | 3 | /** 4 | * 特定状态 -- 正常状态 5 | * @author Json<> 6 | */ 7 | public class NormalState implements State{ 8 | 9 | @Override 10 | public void move(Hero hero) { 11 | //正常跑动则不打印内容,否则会刷屏 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/TVOnCommand.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command; 2 | /** 3 | * 具体命令角色类 -- 电视打开命令 4 | * @author Json 5 | */ 6 | public class TVOnCommand implements Command { 7 | private TV tv; 8 | public TVOnCommand(TV tv){ 9 | this.tv = tv; 10 | } 11 | 12 | @Override 13 | public void execute() { 14 | tv.on(); 15 | } 16 | } -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/CommandQueue/H5Coder.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.CommandQueue; 2 | /** 3 | * 接收者角色类 - H5工程师 4 | * @author Json 5 | */ 6 | public class H5Coder { 7 | /** 8 | * 真正执行命令相应的操作 9 | */ 10 | public void work(String task){ 11 | System.out.println("H5工程师要完成【"+task+"】"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/TV.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command; 2 | /** 3 | * 接收者角色类 -- 电视 4 | * @author Json 5 | */ 6 | public class TV { 7 | /** 8 | * 打开方法 9 | */ 10 | public void on(){ 11 | System.out.println("电视打开"); 12 | } 13 | /** 14 | * 关闭方法 15 | */ 16 | public void off(){ 17 | System.out.println("电视关闭"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/TVOffCommand.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command; 2 | /** 3 | * 具体命令角色类 -- 电视关闭命令 4 | * @author Json 5 | */ 6 | public class TVOffCommand implements Command { 7 | private TV tv; 8 | public TVOffCommand(TV tv){ 9 | this.tv = tv; 10 | } 11 | 12 | @Override 13 | public void execute() { 14 | tv.off(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/com/designpattern/Visitor/Person.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Visitor; 2 | 3 | /** 4 | * 抽象访问者接口 -- 人 5 | * @author Json<> 6 | */ 7 | public abstract class Person { 8 | /** 9 | * 喂食狗 10 | */ 11 | public abstract void feed(Cat cat); 12 | 13 | /** 14 | * 喂食猫 15 | */ 16 | public abstract void feed(Dog dog); 17 | } 18 | -------------------------------------------------------------------------------- /src/com/designpattern/Adapter/DefaultAdapter/Test.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Adapter.DefaultAdapter; 2 | /** 3 | * 测试 4 | * @author Json 5 | */ 6 | public class Test { 7 | public static void main(String[] args) { 8 | Person p = new Student("张三"); 9 | p.study(); 10 | p.eat(); 11 | p.sleep(); 12 | System.out.println("我是"+p.getName()); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/CommandQueue/JavaCoder.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.CommandQueue; 2 | /** 3 | * 接收者角色类 - Java工程师 4 | * @author Json 5 | */ 6 | public class JavaCoder { 7 | /** 8 | * 真正执行命令相应的操作 9 | */ 10 | public void work(String task){ 11 | System.out.println("java工程师要完成【"+task+"】"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_2/EmailMessage.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_2; 2 | /** 3 | * 使用邮件方式发送信息 4 | * @author Json 5 | */ 6 | public class EmailMessage implements MessageImplementor { 7 | 8 | @Override 9 | public void send(String message, String users) { 10 | System.out.println("使用邮件方式,发送信息【"+message+"】To【"+users+"】"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_2/MessageImplementor.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_2; 2 | /** 3 | * 实现发送消息的统一接口 4 | * @author Json 5 | */ 6 | public interface MessageImplementor { 7 | /** 8 | * 发送消息 9 | * @param message 消息内容 10 | * @param toUser 接收人 11 | */ 12 | public void send(String message,String users); 13 | } 14 | -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_2/MobileMessage.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_2; 2 | /** 3 | * 使用短信方式发送信息 4 | * @author Json 5 | */ 6 | public class MobileMessage implements MessageImplementor { 7 | 8 | @Override 9 | public void send(String message, String users) { 10 | System.out.println("使用短信方式,发送信息【"+message+"】To【"+users+"】"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/com/designpattern/builder/PenBuilder.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.builder; 2 | /** 3 | * 抽象建造者 -- 笔builder 4 | */ 5 | public abstract interface PenBuilder { 6 | /** 7 | * 生产笔芯 8 | */ 9 | abstract void buildCartridge(); 10 | /** 11 | * 生产外壳 12 | */ 13 | abstract void buildShell(); 14 | /** 15 | * 组装笔 16 | */ 17 | abstract Pen buildPen(); 18 | } 19 | -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_1/VeryUrgencyMessage.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_1; 2 | /** 3 | * 特急消息接口 4 | * @author Json 5 | */ 6 | public interface VeryUrgencyMessage extends Message { 7 | 8 | /** 9 | * 扩展自己的新功能:特急任务,需要催促接收人尽快完成 10 | * @param messageId 消息的编号 11 | * @return 12 | */ 13 | public void urge(String messageId); 14 | } 15 | -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_2/SystemMessage.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_2; 2 | /** 3 | * 使用站內消息方式发送信息 4 | * @author Json 5 | */ 6 | public class SystemMessage implements MessageImplementor { 7 | 8 | @Override 9 | public void send(String message, String users) { 10 | System.out.println("使用站內消息方式,发送信息【"+message+"】To【"+users+"】"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/com/designpattern/facade/impl/TV.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.facade.impl; 2 | 3 | import com.designpattern.facade.TVI; 4 | 5 | /** 6 | * 类说明 :电视接口实现类 7 | */ 8 | public class TV implements TVI { 9 | @Override 10 | public void on() { 11 | System.out.println("打开电视"); 12 | } 13 | @Override 14 | public void off() { 15 | System.out.println("关闭电视"); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/com/designpattern/utils/LocationUtil.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.utils; 2 | 3 | /** 4 | * 坐标工具类 -- 简单计算坐标间距 5 | * @author Json<> 6 | */ 7 | public class LocationUtil { 8 | //计算坐标之间的距离 9 | public static double getDistance(int x1,int y1,int x2,int y2){ 10 | return Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/com/designpattern/factory/method/Test.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.method; 2 | 3 | /** 4 | * 类说明 :测试 5 | */ 6 | public class Test { 7 | public static void main(String[] args) { 8 | MobileFactory factory = null; 9 | 10 | factory = new XiaomiFactory(); 11 | factory.product(); 12 | 13 | factory = new HuaweiFactory(); 14 | factory.product(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/com/designpattern/Adapter/ObjectAdapter/Test.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Adapter.ObjectAdapter; 2 | /** 3 | * 测试 4 | * @author Json 5 | */ 6 | public class Test { 7 | public static void main(String[] args) { 8 | //使用特殊功能类,即适配类, 9 | // 需要先创建一个被适配类的对象作为参数 10 | PowerAdapter adapter = new PowerAdapter(new RussiaSocket()); 11 | adapter.charge(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/designpattern/builder/PenDirector.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.builder; 2 | /** 3 | * 导演类 Director 4 | * @author Json 5 | */ 6 | public class PenDirector { 7 | 8 | public Pen constructPen(PenBuilder pen_builder){ 9 | //生产笔芯 10 | pen_builder.buildCartridge(); 11 | //生产外壳 12 | pen_builder.buildShell(); 13 | //组装笔 14 | return pen_builder.buildPen(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/com/designpattern/Adapter/DefaultAdapter/Person.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Adapter.DefaultAdapter; 2 | /** 3 | * 关于人的接口 4 | * @author Json 5 | */ 6 | public interface Person { 7 | public String getName(); 8 | //工作 9 | public void work(); 10 | //学习 11 | public void study(); 12 | //吃饭 13 | public void eat(); 14 | //睡觉 15 | public void sleep(); 16 | 17 | //...很多方法省略 18 | } 19 | -------------------------------------------------------------------------------- /src/com/designpattern/Decorator/Decorator.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Decorator; 2 | /** 3 | * 装饰角色 4 | * @author Json 5 | */ 6 | public class Decorator implements Coder { 7 | 8 | private Coder coder; 9 | public Decorator(Coder coder) { 10 | this.coder = coder; 11 | } 12 | 13 | @Override 14 | public void writeCode() { 15 | coder.writeCode(); 16 | //可以追加功能 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/com/designpattern/facade/impl/Light.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.facade.impl; 2 | 3 | import com.designpattern.facade.LightI; 4 | 5 | /** 6 | * 类说明 :灯光接口实现类 7 | */ 8 | public class Light implements LightI { 9 | @Override 10 | public void on() { 11 | System.out.println("打开灯"); 12 | } 13 | 14 | @Override 15 | public void off() { 16 | System.out.println("关闭灯"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/com/designpattern/templete/Test.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.templete; 2 | /** 3 | * 类说明 :测试 4 | */ 5 | public class Test { 6 | 7 | public static void main(String[] args) { 8 | //测试一次完成作业: 同学都是怎么样完成作业的 9 | StudentA A = new StudentA(); 10 | A.workflow(); 11 | 12 | System.out.println("---------------------"); 13 | 14 | StudentB B = new StudentB(); 15 | B.workflow(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/com/designpattern/Visitor/Owner.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Visitor; 2 | 3 | /** 4 | * 具体访问者角色 -- 主人 5 | * @author Json<> 6 | */ 7 | public class Owner extends Person { 8 | 9 | @Override 10 | public void feed(Cat cat) { 11 | System.out.println("主人喂食猫"); 12 | } 13 | 14 | @Override 15 | public void feed(Dog dog) { 16 | System.out.println("主人喂食狗"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/com/designpattern/Visitor/Someone.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Visitor; 2 | 3 | /** 4 | * 具体访问者角色 -- 其他人 5 | * @author Json<> 6 | */ 7 | public class Someone extends Person { 8 | 9 | @Override 10 | public void feed(Cat cat) { 11 | System.out.println("其他人喂食猫"); 12 | } 13 | 14 | @Override 15 | public void feed(Dog dog) { 16 | System.out.println("其他人喂食狗"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/MacroCommand/MacroCommand.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.MacroCommand; 2 | 3 | /** 4 | * 宏命令接口 5 | * @author Json 6 | */ 7 | public interface MacroCommand extends Command { 8 | /** 9 | * 宏命令的管理方法 10 | * 添加命令 11 | */ 12 | void addCommand(Command command); 13 | /** 14 | * 宏命令的管理方法 15 | * 移除命令 16 | */ 17 | void removeCommand(Command command); 18 | } 19 | -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_1/CommonEmailMessage.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_1; 2 | /** 3 | * 使用邮件方式发送【普通】信息 4 | * @author Json 5 | */ 6 | public class CommonEmailMessage implements CommonMessage { 7 | 8 | @Override 9 | public void send(String message, String users) { 10 | message = "*普通*:" + message; 11 | System.out.println("使用邮件方式,发送信息【"+message+"】To【"+users+"】"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_1/CommonMobileMessage.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_1; 2 | /** 3 | * 使用短信方式发送【普通】信息 4 | * @author Json 5 | */ 6 | public class CommonMobileMessage implements UrgencyMessage { 7 | 8 | @Override 9 | public void send(String message, String users) { 10 | message = "*普通*:" + message; 11 | System.out.println("使用短信方式,发送信息【"+message+"】To【"+users+"】"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_1/UrgencyEmailMessage.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_1; 2 | /** 3 | * 使用邮件方式发送【加急】信息 4 | * @author Json 5 | */ 6 | public class UrgencyEmailMessage implements UrgencyMessage { 7 | 8 | @Override 9 | public void send(String message, String users) { 10 | message = "*加急*:" + message; 11 | System.out.println("使用邮件方式,发送信息【"+message+"】To【"+users+"】"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_1/UrgencyMobileMessage.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_1; 2 | /** 3 | * 使用短信方式发送【加急】信息 4 | * @author Json 5 | */ 6 | public class UrgencyMobileMessage implements UrgencyMessage { 7 | 8 | @Override 9 | public void send(String message, String users) { 10 | message = "*加急*:" + message; 11 | System.out.println("使用短信方式,发送信息【"+message+"】To【"+users+"】"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/designpattern/Decorator/JavaCoder.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Decorator; 2 | /** 3 | * 一个具体的装饰角色 4 | * java普通程序员 5 | * @author Json 6 | */ 7 | public class JavaCoder extends Decorator { 8 | 9 | public JavaCoder(Coder coder) { 10 | super(coder); 11 | } 12 | 13 | @Override 14 | public void writeCode(){ 15 | super.writeCode(); 16 | //可以追加功能 17 | System.out.println("我是Java程序员..."); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_1/CommonSystemMessage.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_1; 2 | /** 3 | * 使用站内消息方式发送【普通】信息 4 | * @author Json 5 | */ 6 | public class CommonSystemMessage implements UrgencyMessage { 7 | 8 | @Override 9 | public void send(String message, String users) { 10 | message = "*普通*:" + message; 11 | System.out.println("使用站内消息方式,发送信息【"+message+"】To【"+users+"】"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_1/UrgencySystemMessage.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_1; 2 | /** 3 | * 使用站内消息方式发送【加急】信息 4 | * @author Json 5 | */ 6 | public class UrgencySystemMessage implements UrgencyMessage { 7 | 8 | @Override 9 | public void send(String message, String users) { 10 | message = "*加急*:" + message; 11 | System.out.println("使用站内消息方式,发送信息【"+message+"】To【"+users+"】"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/designpattern/Decorator/JavaArchitect.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Decorator; 2 | /** 3 | * 一个具体的装饰角色 4 | * java架构师 5 | * @author Json 6 | */ 7 | public class JavaArchitect extends Decorator { 8 | 9 | public JavaArchitect(Coder coder) { 10 | super(coder); 11 | } 12 | 13 | @Override 14 | public void writeCode(){ 15 | super.writeCode(); 16 | //可以追加功能 17 | System.out.println("我是Java架构师..."); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/designpattern/Adapter/ClassAdapter/PowerAdapter.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Adapter.ClassAdapter; 2 | /** 3 | * 电源适配器 4 | * PS: 适配器类,继承了被适配类,同时实现标准接口 5 | * @author Json 6 | */ 7 | public class PowerAdapter extends RussiaSocket implements MyCharger{ 8 | 9 | @Override 10 | public void charge() { 11 | // 这里是使用委托的方式完成特殊功能 12 | System.out.println("我是适配类:双脚扁头充电->可以在->双脚圆形插孔充电."); 13 | this.specificCharge(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | DesignPattern 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 | -------------------------------------------------------------------------------- /src/com/designpattern/Flyweight/simple/Menu.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Flyweight.simple; 2 | 3 | /** 4 | * 点菜的菜单(简单模拟,列举几个常见的菜名) 5 | * @author Json<> 6 | */ 7 | public class Menu { 8 | public static String 鱼香肉丝 = "01"; 9 | public static String 酸辣土豆丝 = "02"; 10 | public static String 鱼香茄条 = "03"; 11 | public static String 酸菜鱼 = "04"; 12 | public static String 水煮肉片 = "05"; 13 | public static String 米饭 = "99"; 14 | } 15 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/MacroCommand/OSStartCommand.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.MacroCommand; 2 | 3 | /** 4 | * 具体命令 -- OS启动命令 5 | * @author Json 6 | */ 7 | public class OSStartCommand implements Command { 8 | private Computer computer; 9 | public OSStartCommand(Computer computer){ 10 | this.computer = computer; 11 | } 12 | 13 | @Override 14 | public void execute() { 15 | computer.startOS(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/com/designpattern/Flyweight/composite/Menu.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Flyweight.composite; 2 | 3 | /** 4 | * 点菜的菜单(简单模拟,列举几个常见的菜名) 5 | * @author Json<> 6 | */ 7 | public class Menu { 8 | public static String 鱼香肉丝 = "01"; 9 | public static String 酸辣土豆丝 = "02"; 10 | public static String 鱼香茄条 = "03"; 11 | public static String 酸菜鱼 = "04"; 12 | public static String 水煮肉片 = "05"; 13 | public static String 米饭 = "99"; 14 | } 15 | -------------------------------------------------------------------------------- /src/com/designpattern/proxy/dynamicproxy/MovieStar.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.proxy.dynamicproxy; 2 | /** 3 | * 定义一个抽象角色:电影明星 4 | * @author Json 5 | */ 6 | public interface MovieStar { 7 | /** 8 | * 找电影合作 9 | */ 10 | void discussCooperation(); 11 | /** 12 | * 签合同 13 | */ 14 | void signContract(); 15 | /** 16 | * 出演电影角色 17 | */ 18 | void playRoleInMovie(); 19 | /** 20 | * 收演出费 21 | */ 22 | void collectMoney(); 23 | } 24 | -------------------------------------------------------------------------------- /src/com/designpattern/proxy/staticproxy/MovieStar.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.proxy.staticproxy; 2 | /** 3 | * 定义一个抽象角色:电影明星 4 | * @author Json 5 | */ 6 | public interface MovieStar { 7 | /** 8 | * 找电影合作 9 | */ 10 | void discussCooperation(); 11 | /** 12 | * 签合同 13 | */ 14 | void signContract(); 15 | /** 16 | * 出演电影角色 17 | */ 18 | void playRoleInMovie(); 19 | /** 20 | * 收演出费 21 | */ 22 | void collectMoney(); 23 | } 24 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/MacroCommand/HDDStartCommand.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.MacroCommand; 2 | 3 | /** 4 | * 具体命令 -- HDD启动命令 5 | * @author Json 6 | */ 7 | public class HDDStartCommand implements Command { 8 | private Computer computer; 9 | public HDDStartCommand(Computer computer){ 10 | this.computer = computer; 11 | } 12 | 13 | @Override 14 | public void execute() { 15 | computer.startHDD(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/MacroCommand/MBRStartCommand.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.MacroCommand; 2 | 3 | /** 4 | * 具体命令 -- MBR启动命令 5 | * @author Json 6 | */ 7 | public class MBRStartCommand implements Command { 8 | private Computer computer; 9 | public MBRStartCommand(Computer computer){ 10 | this.computer = computer; 11 | } 12 | 13 | @Override 14 | public void execute() { 15 | computer.startMBR(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/com/designpattern/factory/absract/Test.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.absract; 2 | /** 3 | * 类说明 :测试 4 | */ 5 | public class Test { 6 | 7 | public static void main(String[] args) { 8 | AbstractFactory factory = null; 9 | 10 | factory = new XiaomiFactory(); 11 | factory.productMobile(); 12 | factory.productMP3(); 13 | 14 | factory = new HuaweiFactory(); 15 | factory.productMobile(); 16 | factory.productMP3(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/com/designpattern/factory/simple/Test.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.simple; 2 | 3 | /** 4 | * 类说明 :测试 5 | */ 6 | public class Test { 7 | public static void main(String[] args) { 8 | /** 9 | * 客户要订购生产小米手机 10 | */ 11 | MobileFactory.product("xiaomi"); 12 | /** 13 | * 客户要订购生产华为手机 14 | */ 15 | MobileFactory.product("huawei"); 16 | /** 17 | * 客户要订购生产锤子手机 18 | */ 19 | MobileFactory.product("chuizi"); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/MacroCommand/BIOSStartCommand.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.MacroCommand; 2 | 3 | /** 4 | * 具体命令 -- BIOS启动命令 5 | * @author Json 6 | */ 7 | public class BIOSStartCommand implements Command { 8 | private Computer computer; 9 | public BIOSStartCommand(Computer computer){ 10 | this.computer = computer; 11 | } 12 | 13 | @Override 14 | public void execute() { 15 | computer.startBIOS(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/com/designpattern/Prototype/Java原型结构: -------------------------------------------------------------------------------- 1 | public class PrototypeClass implements Cloneable{ 2 | //覆写父类Object方法 3 | @Override 4 | public PrototypeClass clone(){ 5 | PrototypeClass prototypeClass = null; 6 | try { 7 | prototypeClass = (PrototypeClass)super.clone(); 8 | } catch (CloneNotSupportedException e) { 9 | //异常处理 10 | } 11 | return prototypeClass; 12 | } 13 | } -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_2/CommonMessage.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_2; 2 | /** 3 | * 扩展抽象的消息 -- 普通消息 4 | * @author Json 5 | */ 6 | public class CommonMessage extends AbstractMessage{ 7 | 8 | public CommonMessage(MessageImplementor impl) { 9 | super(impl); 10 | } 11 | 12 | public void sendMessage(String message, String toUser) { 13 | message = "*普通*:" + message; 14 | super.sendMessage(message, toUser); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_2/UrgencyMessage.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_2; 2 | /** 3 | * 扩展抽象的消息 -- 加急消息 4 | * @author Json 5 | */ 6 | public class UrgencyMessage extends AbstractMessage{ 7 | 8 | public UrgencyMessage(MessageImplementor impl) { 9 | super(impl); 10 | } 11 | 12 | public void sendMessage(String message, String toUser) { 13 | message = "*加急*:" + message; 14 | super.sendMessage(message, toUser); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/com/designpattern/factory/absract/HuaweiFactory.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.absract; 2 | /** 3 | * 类说明 :华为工厂类 4 | */ 5 | public class HuaweiFactory implements AbstractFactory{ 6 | 7 | @Override 8 | public Mobile productMobile() { 9 | System.out.println("生产华为手机."); 10 | return new HuaweiMobile(); 11 | } 12 | 13 | @Override 14 | public MP3 productMP3() { 15 | System.out.println("生产华为MP3."); 16 | return new HuaweiMP3(); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/com/designpattern/factory/absract/XiaomiFactory.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.absract; 2 | /** 3 | * 类说明 :小米工厂类 4 | */ 5 | public class XiaomiFactory implements AbstractFactory{ 6 | 7 | @Override 8 | public Mobile productMobile() { 9 | System.out.println("生产小米手机."); 10 | return new XiaomiMobile(); 11 | } 12 | 13 | @Override 14 | public MP3 productMP3() { 15 | System.out.println("生产小米MP3."); 16 | return new XiaomiMP3(); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/com/designpattern/proxy/staticproxy/Test.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.proxy.staticproxy; 2 | /** 3 | * 测试 4 | * @author Json 5 | */ 6 | public class Test { 7 | public static void main(String[] args) { 8 | RealMovieStar real = new RealMovieStar(); 9 | MovieStar proxy = new ProxyMovieStar(real); 10 | proxy.discussCooperation(); 11 | proxy.signContract(); 12 | proxy.playRoleInMovie();//需要真实对象实现操作(出演电影) 13 | proxy.collectMoney(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/com/designpattern/Adapter/ClassAdapter/结构: -------------------------------------------------------------------------------- 1 | 类适配: 2 | 3 | //目标接口,或称为标准接口 4 | public interface Target { 5 | //普通功能 6 | public void request(); 7 | } 8 | 9 | //已存在的、具有特殊功能、但不符合我们既有的标准接口的类 10 | public class Adaptee { 11 | public void specificRequest() { 12 | } 13 | } 14 | 15 | //适配器类,继承了被适配类,同时实现标准接口 16 | public class Adapter extends Adaptee implements Target { 17 | @Override 18 | public void request() { 19 | this.specificRequest(); 20 | } 21 | } -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/Undo/RequestMakeDir.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.Undo; 2 | /** 3 | * 请求者 4 | * @author Json 5 | */ 6 | public class RequestMakeDir { 7 | Command createCommand; 8 | public void setCreateCommand(Command command) { 9 | this.createCommand = command; 10 | } 11 | 12 | public void executeCreateCommand(){ 13 | createCommand.execute(); 14 | } 15 | 16 | public void undoCreateCommand(){ 17 | createCommand.undo(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/designpattern/Visitor/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Visitor; 2 | 3 | /** 4 | * 客户端测试 5 | * @author Json<> 6 | */ 7 | public class Client { 8 | public static void main(String[] args) { 9 | Home owerHome = new Home(); 10 | owerHome.add(new Dog()); 11 | owerHome.add(new Cat()); 12 | 13 | Owner owner = new Owner(); 14 | owerHome.action(owner); 15 | 16 | Someone someone = new Someone(); 17 | owerHome.action(someone); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/designpattern/iterator/Test.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.iterator; 2 | /** 3 | * 测试 4 | * @author Json 5 | */ 6 | public class Test { 7 | public static void main(String[] args) { 8 | Aggregate agg = new ConcreteAggregate(); 9 | agg.add("Java"); 10 | agg.add("Ruby"); 11 | agg.add("Python"); 12 | 13 | Iterator iterator = agg.iterator(); 14 | while(iterator.hasNext()){ 15 | String s = (String) iterator.next(); 16 | System.out.println(s); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/RemoteControl.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command; 2 | /** 3 | * 请求者角色类 -- 遥控器Invoker 4 | * @author Json 5 | */ 6 | public class RemoteControl { 7 | private Command onCommand,offCommand; 8 | 9 | public RemoteControl(Command _on,Command _off){ 10 | this.onCommand = _on; 11 | this.offCommand = _off; 12 | } 13 | 14 | public void turnOn(){ 15 | onCommand.execute(); 16 | } 17 | 18 | public void turnOff(){ 19 | offCommand.execute(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/com/designpattern/Memento/undoByMemento/People.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Memento.undoByMemento; 2 | 3 | /** 4 | * 请求者角色类 -- 下棋人Invoker 5 | * @author Json<> 6 | */ 7 | public class People { 8 | private Command command; 9 | 10 | public People(Command command){ 11 | this.command = command; 12 | } 13 | 14 | public void executeCreateCommand(){ 15 | command.execute(); 16 | } 17 | 18 | public void undoCreateCommand(){ 19 | command.undo(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/MultiUndo/RequestMakeDir.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.MultiUndo; 2 | /** 3 | * 请求者 4 | * @author Json 5 | */ 6 | public class RequestMakeDir { 7 | Command createCommand; 8 | public void setCreateCommand(Command command) { 9 | this.createCommand = command; 10 | } 11 | 12 | public void executeCreateCommand(String dirName){ 13 | createCommand.execute(dirName); 14 | } 15 | 16 | public void undoCreateCommand(){ 17 | createCommand.undo(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/RequestLog/DeleteCommand.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.RequestLog; 2 | /** 3 | * 具体命令角色类 -- 删除命令 4 | * @author Json 5 | */ 6 | public class DeleteCommand extends Command{ 7 | public DeleteCommand(String name) { 8 | super(name); 9 | } 10 | 11 | public void execute(String args) { 12 | this.args = args; 13 | operator.delete(args); 14 | } 15 | 16 | public void execute() { 17 | operator.delete(this.args); 18 | } 19 | } -------------------------------------------------------------------------------- /src/com/designpattern/Observer/ConcreteFansObserver.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Observer; 2 | 3 | /** 4 | * 具体观察者对象,实现更新的方法,使自身的状态和目标的状态保持一致 5 | * 这里模拟 -- 具体粉丝用户对象 6 | * @author Json<> 7 | */ 8 | public class ConcreteFansObserver implements FansObserver { 9 | /** 10 | * 文章信息 11 | */ 12 | private String article; 13 | 14 | @Override 15 | public void update(String article) { 16 | this.article = article; 17 | System.out.println("你关注的微信公众号发布文章了!文章标题:"+article+""); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/designpattern/builder/Test.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.builder; 2 | 3 | import com.designpattern.builder.impl.BallpointPenBuilder; 4 | import com.designpattern.builder.impl.BrushPenBuilder; 5 | 6 | /** 7 | * 测试 8 | * @author Json 9 | */ 10 | public class Test { 11 | public static void main(String[] args) { 12 | PenDirector director = new PenDirector(); 13 | Pen ballpointpen = director.constructPen(new BallpointPenBuilder()); 14 | Pen brushpen = director.constructPen(new BrushPenBuilder()); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/com/designpattern/strategy/Test.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.strategy; 2 | /** 3 | * 类说明 :测试 4 | */ 5 | public class Test { 6 | public static void main(String[] args) { 7 | //618活动 8 | ActivityEntry activity = new ActivityEntry(); 9 | activity.activityEntry("618"); 10 | 11 | //1111活动 12 | ActivityEntry activity1 = new ActivityEntry(); 13 | activity1.activityEntry("1111"); 14 | 15 | //1212活动 16 | ActivityEntry activity2 = new ActivityEntry(); 17 | activity2.activityEntry("1212"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/RequestLog/InsertCommand.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.RequestLog; 2 | /** 3 | * 具体命令角色类 -- 插入命令 4 | * @author Json 5 | */ 6 | public class InsertCommand extends Command{ 7 | public InsertCommand(String name) { 8 | super(name); 9 | } 10 | 11 | public void execute(String args) { 12 | this.args = args; 13 | operator.insert(args); 14 | } 15 | 16 | public void execute() { 17 | operator.insert(this.args); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/RequestLog/UpdateCommand.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.RequestLog; 2 | /** 3 | * 具体命令角色类 -- 修改命令 4 | * @author Json 5 | */ 6 | public class UpdateCommand extends Command{ 7 | public UpdateCommand(String name) { 8 | super(name); 9 | } 10 | 11 | public void execute(String args) { 12 | this.args = args; 13 | operator.update(args); 14 | } 15 | 16 | public void execute() { 17 | operator.update(this.args); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/designpattern/Memento/SingleCheckpoints/ChessCaretaker.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Memento.SingleCheckpoints; 2 | 3 | /** 4 | * 象棋备忘录管理者角色 5 | * @author Json<> 6 | */ 7 | public class ChessCaretaker { 8 | /** 9 | * 备忘录对象 10 | */ 11 | private ChessMemento memento; 12 | 13 | public ChessMemento retrieveMemento() { 14 | return this.memento; 15 | } 16 | 17 | public void saveMemento(ChessMemento memento) { 18 | this.memento = memento; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/MacroCommand/Computer.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.MacroCommand; 2 | /** 3 | * 接收者角色类 4 | * @author Json 5 | */ 6 | public class Computer { 7 | public void startBIOS(){ 8 | System.out.println("BIOS启动..."); 9 | } 10 | 11 | public void startMBR(){ 12 | System.out.println("MBR加载..."); 13 | } 14 | 15 | 16 | public void startHDD(){ 17 | System.out.println("HDD加载..."); 18 | } 19 | 20 | public void startOS(){ 21 | System.out.println("系统启动..."); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/com/designpattern/builder/Pen.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.builder; 2 | /** 3 | * 笔 -- 抽象产品类 4 | * @author Json 5 | */ 6 | public abstract class Pen { 7 | /**笔芯**/ 8 | private String cartridge; 9 | /**外壳**/ 10 | private String shell; 11 | 12 | public String getCartridge() { 13 | return cartridge; 14 | } 15 | public void setCartridge(String cartridge) { 16 | this.cartridge = cartridge; 17 | } 18 | public String getShell() { 19 | return shell; 20 | } 21 | public void setShell(String shell) { 22 | this.shell = shell; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/com/designpattern/facade/impl/SmartHome.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.facade.impl; 2 | 3 | import com.designpattern.facade.LightI; 4 | import com.designpattern.facade.SmartHomeI; 5 | import com.designpattern.facade.TVI; 6 | 7 | /** 8 | * 类说明 :智能家居总开关接口 9 | */ 10 | public class SmartHome implements SmartHomeI { 11 | 12 | private LightI light = new Light(); 13 | private TVI tv = new TV(); 14 | 15 | @Override 16 | public void on() { 17 | light.on(); 18 | tv.on(); 19 | } 20 | @Override 21 | public void off() { 22 | light.off(); 23 | tv.off(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/com/designpattern/iterator/ConcreteAggregate.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.iterator; 2 | 3 | import java.util.ArrayList; 4 | /** 5 | * 具体容器 6 | * @author Json 7 | */ 8 | public class ConcreteAggregate implements Aggregate { 9 | 10 | private ArrayList list = new ArrayList(); 11 | 12 | @Override 13 | public void add(Object obj) { 14 | list.add(obj); 15 | } 16 | 17 | @Override 18 | public void remove(Object obj) { 19 | list.remove(obj); 20 | } 21 | 22 | @Override 23 | public Iterator iterator() { 24 | return new ConcreteIterator(list); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/com/designpattern/templete/Homeork.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.templete; 2 | /** 3 | * 类说明 :学校教师作业 4 | */ 5 | public abstract class Homeork { 6 | 7 | final void workflow(){ 8 | //老师布置作业 9 | this.assginHomework(); 10 | //学生 做 作业 11 | this.doHomework(); 12 | //老师检查作业 13 | this.checkHomework(); 14 | } 15 | 16 | 17 | //布置作业 18 | void assginHomework(){ 19 | System.out.println("回家做课后习题,明天检查!"); 20 | } 21 | 22 | //学生 做 作业 23 | abstract void doHomework(); 24 | 25 | //检查作业 26 | void checkHomework(){ 27 | System.out.println("检查作业!"); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/com/designpattern/Interpreter/Context.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Interpreter; 2 | 3 | import java.util.Hashtable; 4 | 5 | /** 6 | * 上下文 7 | * @author Json<> 8 | */ 9 | public class Context { 10 | private Hashtable context = new Hashtable(); 11 | 12 | public void Assign(String name, boolean val) { 13 | context.put(name, new Boolean(val)); 14 | } 15 | 16 | public boolean LookUp(String name) { 17 | return ((Boolean)context.get(name)).booleanValue(); 18 | } 19 | 20 | public Context() { 21 | } 22 | } -------------------------------------------------------------------------------- /src/com/designpattern/Observer/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Observer; 2 | 3 | /** 4 | * 测试 5 | * @author Json<> 6 | */ 7 | public class Client { 8 | public static void main(String[] args) { 9 | //创建微信公众号主题 10 | ConcreteWechatSubject sub = new ConcreteWechatSubject(); 11 | //创建粉丝观察者 12 | FansObserver obsever = new ConcreteFansObserver(); 13 | FansObserver obsever1 = new ConcreteFansObserver(); 14 | //添加观察者 15 | sub.attach(obsever); 16 | sub.attach(obsever1); 17 | //微信公众号发布文章 18 | sub.setArticle("《关于建军90周年》"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/com/designpattern/state/pattern_realize/DecelerateState.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.state.pattern_realize; 2 | 3 | /** 4 | * 特定状态 -- 减速状态 5 | * @author Json<> 6 | */ 7 | public class DecelerateState implements State { 8 | 9 | @Override 10 | public void move(Hero hero) { 11 | System.out.println("减速状态,英雄減速移动"); 12 | //假设减速持续2.5秒 13 | try { 14 | Thread.sleep(2500); 15 | } catch (InterruptedException e) { 16 | e.printStackTrace(); 17 | } 18 | hero.setState(hero.NORMAL_STATE); 19 | System.out.println("减速状态结束,恢复正常状态"); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/com/designpattern/Composite/Leaf.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Composite; 2 | 3 | /** 4 | * 叶子 5 | * @author Json<> 6 | */ 7 | public class Leaf extends Component { 8 | /** 9 | * 叶子对象的名字 10 | */ 11 | private String name = ""; 12 | 13 | /** 14 | * 构造方法,传入叶子对象的名字 15 | * @param name 叶子对象的名字 16 | */ 17 | public Leaf(String name){ 18 | this.name = name; 19 | } 20 | 21 | /** 22 | * 输出叶子对象的结构,叶子对象没有子对象,也就是输出叶子对象的名字 23 | * @param str 前缀,主要是按照层级拼接的空格,实现向后缩进 24 | */ 25 | public void outputSelf(String str) { 26 | System.out.println(str+"- "+name); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/com/designpattern/Observer/jdk_realize/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Observer.jdk_realize; 2 | 3 | /** 4 | * 测试 5 | * @author Json<> 6 | */ 7 | public class Client { 8 | public static void main(String[] args) { 9 | //创建微信公众号主题 10 | ConcreteWechatSubject sub = new ConcreteWechatSubject(); 11 | //创建粉丝观察者 12 | ConcreteFansObserver obsever = new ConcreteFansObserver(); 13 | ConcreteFansObserver obsever1 = new ConcreteFansObserver(); 14 | //添加观察者 15 | sub.addObserver(obsever); 16 | sub.addObserver(obsever1); 17 | //微信公众号发布文章 18 | sub.setArticle("《关于建军90周年》"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/com/designpattern/ChainOfResponsibility/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.ChainOfResponsibility; 2 | 3 | /** 4 | * 客户端测试 5 | * @author Json<> 6 | */ 7 | public class Client { 8 | public static void main(String[] args) { 9 | //先要组装职责链 10 | JiuXianQiaoSubbranch jiuxianqiao = new JiuXianQiaoSubbranch(); 11 | WangJingSubbranch wangjing = new WangJingSubbranch(); 12 | DongBaSubbranch dongba = new DongBaSubbranch(); 13 | //组织责任链 14 | jiuxianqiao.setSuccessor(wangjing); 15 | wangjing.setSuccessor(dongba); 16 | //张三下单 ,定一份鸡腿堡套餐 17 | jiuxianqiao.handleRequest(900,200); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/designpattern/Mediator/PeopleA.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Mediator; 2 | 3 | /** 4 | * 具体同事类 -- 人员a 5 | * @author Json<> 6 | */ 7 | public class PeopleA extends People { 8 | 9 | public PeopleA(Mediator mediator,String name) { 10 | super(mediator, name); 11 | } 12 | 13 | /** 14 | * 接收消息 15 | */ 16 | public void receive(String message){ 17 | System.out.println("【A】收到消息:【"+message+"】"); 18 | } 19 | 20 | /** 21 | * 发送消息 22 | */ 23 | public void send(String message){ 24 | System.out.println("【A】发出消息:【"+message+"】"); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/com/designpattern/Mediator/PeopleB.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Mediator; 2 | 3 | /** 4 | * 具体同事类 -- 人员b 5 | * @author Json<> 6 | */ 7 | public class PeopleB extends People { 8 | 9 | public PeopleB(Mediator mediator,String name) { 10 | super(mediator, name); 11 | } 12 | 13 | /** 14 | * 接收消息 15 | */ 16 | public void receive(String message){ 17 | System.out.println("【B】收到消息:【"+message+"】"); 18 | } 19 | 20 | /** 21 | * 发送消息 22 | */ 23 | public void send(String message){ 24 | System.out.println("【B】发出消息:【"+message+"】"); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/com/designpattern/Mediator/PeopleC.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Mediator; 2 | 3 | /** 4 | * 具体同事类 -- 人员c 5 | * @author Json<> 6 | */ 7 | public class PeopleC extends People { 8 | 9 | public PeopleC(Mediator mediator,String name) { 10 | super(mediator, name); 11 | } 12 | 13 | /** 14 | * 接收消息 15 | */ 16 | public void receive(String message){ 17 | System.out.println("【C】收到消息:【"+message+"】"); 18 | } 19 | 20 | /** 21 | * 发送消息 22 | */ 23 | public void send(String message){ 24 | System.out.println("【C】发出消息:【"+message+"】"); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/com/designpattern/Adapter/ObjectAdapter/PowerAdapter.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Adapter.ObjectAdapter; 2 | /** 3 | * 电源适配器 4 | * PS: 适配器类,直接关联被适配类,同时实现标准接口 5 | * @author Json 6 | */ 7 | public class PowerAdapter implements MyCharger{ 8 | // 直接关联被适配类 9 | private RussiaSocket russiaSocket; 10 | // 可以通过构造函数传入具体需要适配的被适配类对象 11 | public PowerAdapter(RussiaSocket russiaSocket) { 12 | this.russiaSocket = russiaSocket; 13 | } 14 | 15 | @Override 16 | public void charge(){ 17 | // 这里是使用委托的方式完成特殊功能 18 | System.out.println("我是适配类:双脚扁头充电->可以在->双脚圆形插孔充电."); 19 | this.russiaSocket.specificCharge(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/com/designpattern/ChainOfResponsibility/KFC.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.ChainOfResponsibility; 2 | 3 | /** 4 | * 抽象职责类 -- 肯德基 5 | * @author Json<> 6 | */ 7 | public abstract class KFC { 8 | 9 | /** 10 | * 持有后继的职责对象 11 | */ 12 | protected KFC successor; 13 | 14 | /** 15 | * 设置后继的职责对象 16 | * @param successor 后继的职责对象 17 | */ 18 | public void setSuccessor(KFC successor) { 19 | this.successor = successor; 20 | } 21 | 22 | /** 23 | * 处理接单 24 | * @param _x 下单地点横坐标,用于判断距离 25 | * @param _y 下单地点纵坐标,用于判断距离 26 | */ 27 | public abstract void handleRequest(int _x,int _y); 28 | } 29 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/Undo/CreateDirCommand.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.Undo; 2 | 3 | /** 4 | * 具体命令 -- 创建目录 5 | * @author Json 6 | */ 7 | public class CreateDirCommand implements Command { 8 | private String dirName; 9 | MakeDir makeDir; 10 | public CreateDirCommand(MakeDir makeDir,String dirName) { 11 | this.makeDir = makeDir; 12 | this.dirName = dirName; 13 | } 14 | 15 | @Override 16 | public void execute() { 17 | makeDir.createDir(dirName); 18 | } 19 | 20 | @Override 21 | public void undo() { 22 | makeDir.deleteDir(dirName); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/com/designpattern/Visitor/Home.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Visitor; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * 结构对象角色类 -- 主人家 8 | * @author Json<> 9 | */ 10 | public class Home { 11 | private List nodeList = new ArrayList<>(); 12 | 13 | public void action(Person person) { 14 | for (Animal node : nodeList) { 15 | node.accept(person); 16 | } 17 | } 18 | 19 | /** 20 | * 添加操作 21 | * @param animal 22 | */ 23 | public void add(Animal animal) { 24 | nodeList.add(animal); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/com/designpattern/Observer/ConcreteWechatSubject.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Observer; 2 | 3 | /** 4 | * 具体的目标对象,负责把有关状态存入到相应的观察者对象, 5 | * 并在自己状态发生改变时,通知各个观察者 6 | * 这里模拟 -- 文章类 7 | * @author Json<> 8 | */ 9 | public class ConcreteWechatSubject extends WechatSubject { 10 | /** 11 | * 文章信息 12 | */ 13 | private String article; 14 | 15 | public String getArticle() { 16 | return article; 17 | } 18 | 19 | public void setArticle(String article) { 20 | this.article = article; 21 | System.out.println("发布文章:"+article+""); 22 | //通知所有粉丝查看文章 23 | this.notify(article); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/com/designpattern/Observer/jdk_realize/ConcreteFansObserver.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Observer.jdk_realize; 2 | 3 | import java.util.Observable; 4 | import java.util.Observer; 5 | 6 | /** 7 | * 具体观察者对象,实现更新的方法,使自身的状态和目标的状态保持一致 8 | * 这里模拟 -- 具体粉丝用户对象 9 | * @author Json<> 10 | */ 11 | public class ConcreteFansObserver implements Observer { 12 | /** 13 | * 文章信息 14 | */ 15 | private String article; 16 | 17 | @Override 18 | public void update(Observable o, Object article) { 19 | this.article = article.toString(); 20 | System.out.println("你关注的微信公众号发布文章了!文章标题:"+article.toString()+""); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/com/designpattern/proxy/dynamicproxy/Test.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.proxy.dynamicproxy; 2 | 3 | import java.lang.reflect.Proxy; 4 | /** 5 | * 测试 6 | * @author Json 7 | */ 8 | public class Test { 9 | public static void main(String[] args) { 10 | MovieStar star = new RealMovieStar(); 11 | //处理器 12 | ProxyMovieStarHandler handler = new ProxyMovieStarHandler(star); 13 | //代理类 14 | MovieStar proxyMovieStar = (MovieStar) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{MovieStar.class}, handler); 15 | //调用代理类的playRoleInMovie,实际调用的是真实角色的playRoleInMovie 16 | proxyMovieStar.playRoleInMovie(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/com/designpattern/state/pattern_realize/ExpediteState.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.state.pattern_realize; 2 | 3 | /** 4 | * 特定状态 -- 加速状态 5 | * @author Json<> 6 | */ 7 | public class ExpediteState implements State { 8 | 9 | @Override 10 | public void move(Hero hero) { 11 | System.out.println("加速状态,英雄加速移动"); 12 | //假设加速持续5秒 13 | try { 14 | Thread.sleep(5000); 15 | } catch (InterruptedException e) { 16 | // TODO Auto-generated catch block 17 | e.printStackTrace(); 18 | } 19 | hero.setState(hero.NORMAL_STATE); 20 | System.out.println("加速状态结束,恢复正常状态"); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /.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.7 4 | org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve 5 | org.eclipse.jdt.core.compiler.compliance=1.7 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.7 12 | -------------------------------------------------------------------------------- /src/com/designpattern/state/pattern_realize/DizzinessState.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.state.pattern_realize; 2 | 3 | /** 4 | * 特定状态 -- 眩晕状态 5 | * @author Json<> 6 | */ 7 | public class DizzinessState implements State { 8 | 9 | @Override 10 | public void move(Hero hero) { 11 | System.out.println("眩晕状态,英雄停止移动"); 12 | //假设眩晕持续1.5秒 13 | try { 14 | Thread.sleep(1500); 15 | } catch (InterruptedException e) { 16 | // TODO Auto-generated catch block 17 | e.printStackTrace(); 18 | } 19 | hero.setState(hero.NORMAL_STATE); 20 | System.out.println("眩晕状态结束,恢复正常状态"); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/CommandQueue/H5Command.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.CommandQueue; 2 | /** 3 | * 具体命令 -- H5工程师执行任务 4 | * @author Json 5 | */ 6 | public class H5Command implements Command{ 7 | //持有相应的接收者对象 8 | private H5Coder h5Coder; 9 | //具体任务 10 | private String task; 11 | /** 12 | * 构造方法 13 | */ 14 | public H5Command(H5Coder h5Coder,String task){ 15 | this.h5Coder = h5Coder; 16 | this.task = task; 17 | } 18 | 19 | @Override 20 | public void execute() { 21 | //通常会转调接收者对象的相应方法,让接收者来真正执行功能 22 | h5Coder.work(this.task); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/com/designpattern/Adapter/DefaultAdapter/Student.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Adapter.DefaultAdapter; 2 | /** 3 | * 定义一个学生 继承了交往PersonAdapter抽象类 4 | * 学生 并没有继承 所有Person的行为,比如现在 还不用work 5 | * @author Json 6 | */ 7 | public class Student extends PersonAdapter{ 8 | private String name; 9 | public Student(String name){ 10 | this.name = name; 11 | } 12 | 13 | public String getName() { 14 | return name; 15 | } 16 | 17 | public void study() { 18 | System.out.println("学习"); 19 | } 20 | 21 | public void eat() { 22 | System.out.println("吃饭"); 23 | } 24 | 25 | public void sleep() { 26 | System.out.println("睡觉"); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/CommandQueue/JavaCommand.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.CommandQueue; 2 | /** 3 | * 具体命令 -- Java工程师执行任务 4 | * @author Json 5 | */ 6 | public class JavaCommand implements Command{ 7 | //持有相应的接收者对象 8 | private JavaCoder javaCoder; 9 | //具体任务 10 | private String task; 11 | /** 12 | * 构造方法 13 | */ 14 | public JavaCommand(JavaCoder javaCoder,String task){ 15 | this.javaCoder = javaCoder; 16 | this.task = task; 17 | } 18 | 19 | @Override 20 | public void execute() { 21 | //通常会转调接收者对象的相应方法,让接收者来真正执行功能 22 | javaCoder.work(this.task); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_1/VeryUrgencyEmailMessage.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_1; 2 | /** 3 | * 使用邮件方式发送【特急】信息 4 | * @author Json 5 | */ 6 | public class VeryUrgencyEmailMessage implements VeryUrgencyMessage { 7 | 8 | @Override 9 | public void send(String message, String users) { 10 | message = "*特急*:" + message; 11 | System.out.println("使用邮件方式,发送信息【"+message+"】To【"+users+"】"); 12 | } 13 | 14 | /** 15 | * 扩展自己的新功能:特急任务,需要催促接收人尽快完成 16 | * @param messageId 消息的编号 17 | * @return 18 | */ 19 | @Override 20 | public void urge(String messageId) { 21 | //发出催促的信息 ,比如:每隔半小时 发送一条催促消息 22 | //TODO 逻辑 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_1/VeryUrgencyMobileMessage.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_1; 2 | /** 3 | * 使用短信方式发送【特急】信息 4 | * @author Json 5 | */ 6 | public class VeryUrgencyMobileMessage implements VeryUrgencyMessage { 7 | 8 | @Override 9 | public void send(String message, String users) { 10 | message = "*特急*:" + message; 11 | System.out.println("使用短信方式,发送信息【"+message+"】To【"+users+"】"); 12 | } 13 | 14 | /** 15 | * 扩展自己的新功能:特急任务,需要催促接收人尽快完成 16 | * @param messageId 消息的编号 17 | * @return 18 | */ 19 | @Override 20 | public void urge(String messageId) { 21 | //发出催促的信息 ,比如:每隔半小时 发送一条催促消息 22 | //TODO 逻辑 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_1/VeryUrgencySystemMessage.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_1; 2 | /** 3 | * 使用站内消息方式发送【特急】信息 4 | * @author Json 5 | */ 6 | public class VeryUrgencySystemMessage implements VeryUrgencyMessage { 7 | 8 | @Override 9 | public void send(String message, String users) { 10 | message = "*特急*:" + message; 11 | System.out.println("使用站内消息方式,发送信息【"+message+"】To【"+users+"】"); 12 | } 13 | 14 | /** 15 | * 扩展自己的新功能:特急任务,需要催促接收人尽快完成 16 | * @param messageId 消息的编号 17 | * @return 18 | */ 19 | @Override 20 | public void urge(String messageId) { 21 | //发出催促的信息 ,比如:每隔半小时 发送一条催促消息 22 | //TODO 逻辑 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/com/designpattern/Adapter/ObjectAdapter/结构: -------------------------------------------------------------------------------- 1 | 对象适配: 2 | 3 | //目标接口,或称为标准接口 4 | public interface Target { 5 | //普通功能 6 | public void request(); 7 | } 8 | 9 | //已存在的、具有特殊功能、但不符合我们既有的标准接口的类 10 | public class Adaptee { 11 | public void specificRequest() { 12 | } 13 | } 14 | 15 | //适配器类,直接关联被适配类,同时实现标准接口 16 | class Adapter implements Target { 17 | // 直接关联被适配类 18 | private Adaptee adaptee; 19 | 20 | // 可以通过构造函数传入具体需要适配的被适配类对象 21 | public Adapter(Adaptee adaptee) { 22 | this.adaptee = adaptee; 23 | } 24 | 25 | public void request() { 26 | // 这里是使用委托的方式完成特殊功能 27 | this.adaptee.specificRequest(); 28 | } 29 | } -------------------------------------------------------------------------------- /src/com/designpattern/Command/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command; 2 | /** 3 | * 客户端角色类 4 | * @author Json 5 | */ 6 | public class Client { 7 | public static void main(String[] args) { 8 | //创建接收者 9 | TV receiver = new TV(); 10 | //创建命令对象,设定它的接收者 11 | Command on_command = new TVOnCommand(receiver); 12 | //创建命令对象,设定它的接收者 13 | Command off_command = new TVOffCommand(receiver); 14 | //命令控制对象Invoker,把命令对象通过构造方法设置进去 15 | RemoteControl invoker = new RemoteControl(on_command,off_command); 16 | //执行方法 -- 打开电视 17 | invoker.turnOn(); 18 | //执行方法 -- 关闭电视 19 | invoker.turnOff(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/com/designpattern/proxy/dynamicproxy/RealMovieStar.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.proxy.dynamicproxy; 2 | /** 3 | * 真实角色:电影明星 4 | * @author Json 5 | */ 6 | public class RealMovieStar implements MovieStar { 7 | @Override 8 | public void discussCooperation() { 9 | System.out.println("真实角色:discussCooperation()"); 10 | } 11 | 12 | @Override 13 | public void signContract() { 14 | System.out.println("真实角色:signContract()"); 15 | } 16 | 17 | @Override 18 | public void playRoleInMovie() { 19 | System.out.println("真实角色:playRoleInMovie()"); 20 | } 21 | 22 | @Override 23 | public void collectMoney() { 24 | System.out.println("真实角色:collectMoney()"); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/com/designpattern/proxy/staticproxy/RealMovieStar.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.proxy.staticproxy; 2 | /** 3 | * 真实角色:电影明星 4 | * @author Json 5 | */ 6 | public class RealMovieStar implements MovieStar { 7 | @Override 8 | public void discussCooperation() { 9 | System.out.println("真实角色:discussCooperation()"); 10 | } 11 | 12 | @Override 13 | public void signContract() { 14 | System.out.println("真实角色:signContract()"); 15 | } 16 | 17 | @Override 18 | public void playRoleInMovie() { 19 | System.out.println("真实角色:playRoleInMovie()"); 20 | } 21 | 22 | @Override 23 | public void collectMoney() { 24 | System.out.println("真实角色:collectMoney()"); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/Undo/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.Undo; 2 | /** 3 | * 测试 4 | * @author Json 5 | */ 6 | public class Client { 7 | public static void main(String[] args) { 8 | String dir = "E:\\command2017"; 9 | 10 | //创建接收者 11 | MakeDir makeDir = new MakeDir(); 12 | //创建具体命令并且指定接收者 13 | Command create_command = new CreateDirCommand(makeDir,dir); 14 | //创建请求者 15 | RequestMakeDir request = new RequestMakeDir(); 16 | //设置命令 17 | request.setCreateCommand(create_command); 18 | /***********创建目录及撤销**************/ 19 | //创建目录 20 | request.executeCreateCommand(); 21 | //撤销 22 | request.undoCreateCommand(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/com/designpattern/Flyweight/simple/ConcreteFlyweight.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Flyweight.simple; 2 | 3 | /** 4 | * 具体的享元对象 5 | * @author Json<> 6 | */ 7 | public class ConcreteFlyweight implements Flyweight{ 8 | /** 9 | * 描述内部状态 10 | */ 11 | private String intrinsicState; 12 | 13 | /** 14 | * 构造方法,传入享元对象的内部状态的数据 15 | * @param state 享元对象的内部状态的数据 16 | */ 17 | public ConcreteFlyweight(String state){ 18 | this.intrinsicState = state; 19 | } 20 | 21 | @Override 22 | public void operation(String extrinsicState) { 23 | //具体的功能处理,可能会用到享元内部、外部的状态 24 | System.out.println("内蕴状态:"+this.intrinsicState+",外蕴状态:"+extrinsicState+""); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/com/designpattern/Interpreter/NotExp.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Interpreter; 2 | 3 | /** 4 | * 非终结符表达式 -- not 5 | * @author Json<> 6 | */ 7 | public class NotExp implements BooleanExp { 8 | private BooleanExp opernot1; 9 | 10 | public NotExp(BooleanExp oper1) { 11 | opernot1 = oper1; 12 | } 13 | 14 | public boolean Evaluate(Context c) { 15 | return !(opernot1.Evaluate(c)); 16 | } 17 | 18 | public BooleanExp Copy() { 19 | return new NotExp(opernot1.Copy()); 20 | } 21 | 22 | public BooleanExp Replace(String var, BooleanExp exp) { 23 | return new NotExp(opernot1.Replace(var, exp)); 24 | } 25 | } -------------------------------------------------------------------------------- /src/com/designpattern/Flyweight/composite/ConcreteFlyweight.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Flyweight.composite; 2 | 3 | /** 4 | * 具体的享元对象 5 | * @author Json<> 6 | */ 7 | public class ConcreteFlyweight implements Flyweight{ 8 | /** 9 | * 描述内部状态 10 | */ 11 | private String intrinsicState; 12 | 13 | /** 14 | * 构造方法,传入享元对象的内部状态的数据 15 | * @param state 享元对象的内部状态的数据 16 | */ 17 | public ConcreteFlyweight(String state){ 18 | this.intrinsicState = state; 19 | } 20 | 21 | @Override 22 | public void operation(String extrinsicState) { 23 | //具体的功能处理,可能会用到享元内部、外部的状态 24 | System.out.println("内蕴状态:"+this.intrinsicState+",外蕴状态:"+extrinsicState+""); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_2/AbstractMessage.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_2; 2 | /** 3 | * 抽象的消息对象 4 | * @author Json 5 | */ 6 | public abstract class AbstractMessage { 7 | /** 8 | * 持有一个实现部分的对象 9 | */ 10 | protected MessageImplementor impl; 11 | 12 | /** 13 | * 构造方法,传入实现部分的对象 14 | * @param impl 实现部分的对象 15 | */ 16 | public AbstractMessage(MessageImplementor impl){ 17 | this.impl = impl; 18 | } 19 | 20 | /** 21 | * 发送消息,转调实现部分的方法 22 | * @param message 消息内容 23 | * @param toUser 接收人 24 | */ 25 | public void sendMessage(String message,String toUser){ 26 | this.impl.send(message, toUser); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/CommandQueue/Manager.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.CommandQueue; 2 | /** 3 | * 请求发送者类Manager针对CommandQueue编程 4 | * @author Json 5 | */ 6 | public class Manager { 7 | private CommandQueue commandQueue; //维持一个CommandQueue对象的引用 8 | 9 | //构造注入 10 | public Manager(CommandQueue commandQueue) { 11 | this. commandQueue = commandQueue; 12 | } 13 | 14 | //设值注入 15 | public void setCommandQueue(CommandQueue commandQueue) { 16 | this.commandQueue = commandQueue; 17 | } 18 | 19 | //调用CommandQueue类的execute()方法 20 | public void call() { 21 | commandQueue.execute(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/com/designpattern/strategy/ActivityEntry.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.strategy; 2 | /** 3 | * 类说明 :活动入口 4 | */ 5 | public class ActivityEntry { 6 | 7 | public void activityEntry(String str){ 8 | AbstractSaleActivity saleActivity = null; 9 | switch(str){ 10 | case "618": 11 | saleActivity = new SaleActivity618(); 12 | saleActivity.saleEvent(); 13 | break; 14 | case "1111": 15 | saleActivity = new SaleActivity1111(); 16 | saleActivity.saleEvent(); 17 | break; 18 | case "1212": 19 | saleActivity = new SaleActivity1212(); 20 | saleActivity.saleEvent(); 21 | break; 22 | default: 23 | System.out.println("无具体活动!");break; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_2/VeryUrgencyMessage.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_2; 2 | /** 3 | * 扩展抽象的消息 -- 特急消息 4 | * @author Json 5 | */ 6 | public class VeryUrgencyMessage extends AbstractMessage{ 7 | 8 | public VeryUrgencyMessage(MessageImplementor impl) { 9 | super(impl); 10 | } 11 | 12 | public void sendMessage(String message, String toUser) { 13 | message = "*特急*:" + message; 14 | super.sendMessage(message, toUser); 15 | } 16 | 17 | /** 18 | * 扩展自己的新功能:特急任务,需要催促接收人尽快完成 19 | * @param messageId 消息的编号 20 | * @return 21 | */ 22 | public void urge(String messageId) { 23 | //发出催促的信息 ,比如:每隔半小时 发送一条催促消息 24 | //TODO 逻辑 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/com/designpattern/iterator/ConcreteIterator.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.iterator; 2 | 3 | import java.util.ArrayList; 4 | /** 5 | * 具体迭代器实现 6 | * @author Json 7 | */ 8 | public class ConcreteIterator implements Iterator { 9 | 10 | private ArrayList list = new ArrayList(); 11 | private int cursor = 0; 12 | 13 | public ConcreteIterator(ArrayList list) { 14 | this.list = list; 15 | } 16 | 17 | @Override 18 | public boolean hasNext() { 19 | if(cursor == list.size()){ 20 | return false; 21 | } 22 | return true; 23 | } 24 | 25 | @Override 26 | public Object next() { 27 | if(this.hasNext()){ 28 | return this.list.get(cursor++); 29 | } 30 | return null; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/RequestLog/Operator.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.RequestLog; 2 | 3 | import java.io.Serializable; 4 | /** 5 | * 请求接收者 -- 由于Operator类的对象是Command的成员对象,它也将随Command对象一起写入文件,因此Operator也需要实现Serializable接口 6 | * @author Json 7 | */ 8 | public class Operator implements Serializable{ 9 | private static final long serialVersionUID = 1L; 10 | 11 | public void insert(String args) { 12 | System.out.println("新增数据:" + args); 13 | } 14 | 15 | public void update(String args) { 16 | System.out.println("修改数据:" + args); 17 | } 18 | 19 | public void delete(String args) { 20 | System.out.println("删除数据:" + args); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/com/designpattern/builder/impl/BrushPenBuilder.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.builder.impl; 2 | 3 | import com.designpattern.builder.BrushPen; 4 | import com.designpattern.builder.Pen; 5 | import com.designpattern.builder.PenBuilder; 6 | 7 | /** 8 | * 建造者(具体) -- 画笔builder 9 | * @author Json 10 | */ 11 | public class BrushPenBuilder implements PenBuilder{ 12 | 13 | Pen pen; 14 | public BrushPenBuilder(){ 15 | pen = new BrushPen(); 16 | } 17 | 18 | @Override 19 | public void buildCartridge() { 20 | pen.setCartridge("画笔笔芯"); 21 | } 22 | 23 | @Override 24 | public void buildShell() { 25 | pen.setShell("画笔外壳"); 26 | } 27 | 28 | @Override 29 | public Pen buildPen() { 30 | return pen; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/com/designpattern/Visitor/expand/Dynamic/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Visitor.expand.Dynamic; 2 | 3 | /** 4 | * 动态分派 5 | * @author Json<> 6 | */ 7 | class Dog { 8 | public void excute(){ 9 | System.out.println("我是dog妈妈"); 10 | } 11 | } 12 | 13 | class DogBaby1 extends Dog { 14 | public void excute(){ 15 | System.out.println("我是dogbaby1"); 16 | } 17 | } 18 | 19 | class DogBaby2 extends Dog { 20 | public void excute(){ 21 | System.out.println("我是dogbaby2"); 22 | } 23 | } 24 | 25 | public class Client { 26 | public static void main(String[] args) { 27 | Dog baby1 = new DogBaby1(); 28 | baby1.excute(); 29 | 30 | Dog baby2 = new DogBaby2(); 31 | baby2.excute(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/com/designpattern/factory/simple/MobileFactory.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.factory.simple; 2 | /** 3 | * 类说明 : 4 | */ 5 | public class MobileFactory { 6 | /** 7 | * 静态工厂方法 8 | * @param mobiletype 9 | * @return 10 | */ 11 | public static Mobile product(String mobiletype){ 12 | Mobile mobile = null; 13 | if ("xiaomi".equals(mobiletype)) { 14 | mobile = new XiaomiMobile(); 15 | System.out.println("生产小米手机."); 16 | } else if ("huawei".equals(mobiletype)) { 17 | mobile = new HuaweiMobile(); 18 | System.out.println("生产华为手机."); 19 | } else { 20 | System.out.println("不能生产该手机类型."); 21 | } 22 | return mobile; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/com/designpattern/Adapter/DefaultAdapter/PersonAdapter.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Adapter.DefaultAdapter; 2 | /** 3 | * 抽象的缺省适配器 全部空实现 4 | * @author Json 5 | */ 6 | public abstract class PersonAdapter implements Person{ 7 | @Override 8 | public String getName() { 9 | // TODO Auto-generated method stub 10 | return null; 11 | } 12 | 13 | @Override 14 | public void work() { 15 | // TODO Auto-generated method stub 16 | } 17 | 18 | @Override 19 | public void study() { 20 | // TODO Auto-generated method stub 21 | } 22 | 23 | @Override 24 | public void eat() { 25 | // TODO Auto-generated method stub 26 | } 27 | 28 | @Override 29 | public void sleep() { 30 | // TODO Auto-generated method stub 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/com/designpattern/builder/impl/BallpointPenBuilder.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.builder.impl; 2 | 3 | import com.designpattern.builder.BallpointPen; 4 | import com.designpattern.builder.Pen; 5 | import com.designpattern.builder.PenBuilder; 6 | 7 | /** 8 | * 建造者(具体) -- 圆珠笔builder 9 | * @author Json 10 | */ 11 | public class BallpointPenBuilder implements PenBuilder{ 12 | 13 | Pen pen; 14 | public BallpointPenBuilder(){ 15 | pen = new BallpointPen(); 16 | } 17 | 18 | @Override 19 | public void buildCartridge() { 20 | pen.setCartridge("圆珠笔笔芯"); 21 | } 22 | 23 | @Override 24 | public void buildShell() { 25 | pen.setShell("圆珠笔外壳"); 26 | } 27 | 28 | @Override 29 | public Pen buildPen() { 30 | return pen; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/com/designpattern/Interpreter/VariableExp.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Interpreter; 2 | 3 | /** 4 | * 终结符表达式 5 | * @author Json<> 6 | */ 7 | public class VariableExp implements BooleanExp { 8 | private String name; 9 | 10 | public VariableExp(String _name) { 11 | name = _name; 12 | } 13 | 14 | public boolean Evaluate(Context c) { 15 | return c.LookUp(name); 16 | } 17 | 18 | public BooleanExp Copy() { 19 | return new VariableExp(name); 20 | } 21 | 22 | public BooleanExp Replace(String var, BooleanExp exp) { 23 | if(var.equals(name)) { 24 | return exp.Copy(); 25 | } else { 26 | return new VariableExp(name); 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /src/com/designpattern/Observer/jdk_realize/ConcreteWechatSubject.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Observer.jdk_realize; 2 | 3 | import java.util.Observable; 4 | 5 | /** 6 | * 具体的目标对象,负责把有关状态存入到相应的观察者对象, 7 | * 并在自己状态发生改变时,通知各个观察者 8 | * 这里模拟 -- 文章类 9 | * @author Json<> 10 | */ 11 | public class ConcreteWechatSubject extends Observable { 12 | /** 13 | * 文章信息 14 | */ 15 | private String article; 16 | 17 | public String getArticle() { 18 | return article; 19 | } 20 | 21 | public void setArticle(String article) { 22 | this.article = article; 23 | System.out.println("发布文章:"+article+""); 24 | //状态为状态改变,通知各个观察者 25 | this.setChanged(); 26 | //通知所有粉丝查看文章 27 | this.notifyObservers(article); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/com/designpattern/Decorator/Test.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Decorator; 2 | /** 3 | * 测试 4 | * @author Json 5 | */ 6 | public class Test { 7 | public static void main(String[] args) { 8 | Coder coder = new SpecificCoder(); 9 | 10 | System.out.println("第一次装饰 ↓↓↓"); 11 | Decorator javacoder = new JavaCoder(coder); 12 | javacoder.writeCode(); 13 | 14 | System.out.println("第二次装饰 ↓↓↓"); 15 | Decorator javaarchitect = new JavaArchitect(javacoder); 16 | javaarchitect.writeCode(); 17 | 18 | 19 | System.out.println("------------------------------------"); 20 | System.out.println("一步装饰多次 ↓↓↓"); 21 | //一步装饰多次 22 | Decorator javaarchitect_1 = new JavaArchitect(new JavaCoder(new SpecificCoder())); 23 | javaarchitect_1.writeCode(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/com/designpattern/Interpreter/BooleanExp.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Interpreter; 2 | 3 | /** 4 | * 抽象表达式 -- BooleanExp 5 | * 定义: 6 | * BooleanExp -->> VariableExp | Constant | OrExp | AndExp | NotExp | '(' BooleanExp ')' 7 | * AndExp -->> BooleanExp 'and' BooleanExp 8 | * OrExp -->> BooleanExp 'or' BooleanExp 9 | * NotExp -->> BooleanExp 'not' BooleanExp 10 | * Constant -->> 'true' | 'false' 11 | * VariableExp -->> 'A' | 'B' | ... | 'Z' 12 | * 13 | * @author Json<> 14 | */ 15 | public interface BooleanExp { 16 | 17 | public abstract boolean Evaluate(Context c); 18 | 19 | public abstract BooleanExp Replace(String var, BooleanExp exp); 20 | 21 | public abstract BooleanExp Copy(); 22 | } -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/CommandQueue/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.CommandQueue; 2 | /** 3 | * 4 | * @author Json 5 | */ 6 | public class Client { 7 | public static void main(String[] args) { 8 | //创建接收者 9 | JavaCoder javaCoder = new JavaCoder(); 10 | H5Coder h5Coder = new H5Coder(); 11 | //创建命令对象 12 | JavaCommand javaCommand = new JavaCommand(javaCoder,"登录模块的后台代码"); 13 | H5Command h5Command = new H5Command(h5Coder,"登录模块的前台代码"); 14 | //创建命令对象队列 15 | CommandQueue commandqueue = new CommandQueue(); 16 | commandqueue.addCommand(javaCommand); 17 | commandqueue.addCommand(h5Command); 18 | //创建请求者,把命令对象设置进去 19 | Manager manager = new Manager(commandqueue); 20 | //执行方法 21 | manager.call(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/com/designpattern/Memento/undoByMemento/ChessCaretaker.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Memento.undoByMemento; 2 | 3 | import java.util.Stack; 4 | 5 | /** 6 | * 象棋备忘录管理者角色 7 | * @author Json<> 8 | */ 9 | public class ChessCaretaker { 10 | private Stack stack; 11 | 12 | public ChessCaretaker() { 13 | stack = new Stack(); 14 | } 15 | 16 | /** 17 | * 存储备忘录对象 18 | */ 19 | public void saveMemento(ChessMemento m) { 20 | stack.push(m); 21 | } 22 | 23 | /** 24 | * 获取备忘录对象 25 | * @return 26 | */ 27 | public ChessMemento retrieveMemento() { 28 | if(stack.isEmpty()){ 29 | System.out.println("不能再悔棋了!"); 30 | return null; 31 | } 32 | return stack.pop(); //移除元素 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/com/designpattern/Memento/MutilCheckpoints/ChessCaretaker.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Memento.MutilCheckpoints; 2 | 3 | import java.util.Stack; 4 | 5 | /** 6 | * 象棋备忘录管理者角色 7 | * @author Json<> 8 | */ 9 | public class ChessCaretaker { 10 | private Stack stack; 11 | 12 | public ChessCaretaker() { 13 | stack = new Stack(); 14 | } 15 | 16 | /** 17 | * 存储备忘录对象 18 | */ 19 | public void saveMemento(ChessMemento m) { 20 | stack.push(m); 21 | } 22 | 23 | /** 24 | * 获取备忘录对象 25 | * @return 26 | */ 27 | public ChessMemento retrieveMemento() { 28 | if(stack.isEmpty()){ 29 | System.out.println("不能再悔棋了!"); 30 | return null; 31 | } 32 | return stack.pop(); //移除元素 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/com/designpattern/state/common_realize/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.state.common_realize; 2 | 3 | /** 4 | * 测试 5 | * @author Json<> 6 | */ 7 | public class Client { 8 | public static void main(String[] args) throws InterruptedException { 9 | Hero hero = new Hero(); 10 | hero.startMove(); 11 | System.out.println("队友给了一个加速技能↓↓↓"); 12 | hero.setState(Hero.EXPEDITE_STATE); 13 | Thread.sleep(10000);//在过10秒,被对方英雄虚弱 14 | System.out.println("被对方英雄虚弱了↓↓↓"); 15 | hero.setState(Hero.DECELERATE_STATE); 16 | Thread.sleep(10000);//在过10秒,被对方英雄眩晕 17 | System.out.println("被对方英雄眩晕了↓↓↓"); 18 | hero.setState(Hero.DIZZINESS_STATE); 19 | Thread.sleep(10000);//在过10秒,游戏结束 20 | hero.stopMove(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/CommandQueue/CommandQueue.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.CommandQueue; 2 | 3 | import java.util.ArrayList; 4 | 5 | /** 6 | * CommandQueue命令队列类 7 | * @author Json 8 | */ 9 | public class CommandQueue { 10 | //定义一个ArrayList来存储命令队列 11 | private ArrayList commands = new ArrayList(); 12 | 13 | public void addCommand(Command command) { 14 | commands.add(command); 15 | } 16 | 17 | public void removeCommand(Command command) { 18 | commands.remove(command); 19 | } 20 | 21 | //循环调用每一个命令对象的execute()方法 22 | public void execute() { 23 | for(Command command : commands) { 24 | command.execute(); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/com/designpattern/Interpreter/结构: -------------------------------------------------------------------------------- 1 | /** 2 | * 抽象表达式 3 | */ 4 | public abstract class AbstractExpression { 5 | /** 6 | * 解释的操作 7 | * @param ctx 上下文对象 8 | */ 9 | public abstract void interpret(Context ctx); 10 | } 11 | 12 | /** 13 | * 终结符表达式 14 | */ 15 | public class TerminalExpression extends AbstractExpression{ 16 | public void interpret(Context ctx) { 17 | //实现与语法规则中的终结符相关联的解释操作 18 | } 19 | } 20 | 21 | /** 22 | * 非终结符表达式 23 | */ 24 | public class NonterminalExpression extends AbstractExpression{ 25 | public void interpret(Context ctx) { 26 | //实现与语法规则中的非终结符相关联的解释操作 27 | } 28 | } 29 | 30 | /** 31 | * 上下文,包含解释器之外的一些全局信息 32 | */ 33 | public class Context { 34 | 35 | } 36 | 37 | /** 38 | * 使用解释器的客户 39 | */ 40 | public class Client { 41 | //主要按照语法规则对特定的句子构建抽象语法树 42 | //然后调用解释操作 43 | } -------------------------------------------------------------------------------- /src/com/designpattern/Interpreter/OrExp.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Interpreter; 2 | 3 | /** 4 | * 非终结符表达式 -- or 5 | * @author Json<> 6 | */ 7 | public class OrExp implements BooleanExp { 8 | private BooleanExp operor1; 9 | private BooleanExp operor2; 10 | 11 | public OrExp(BooleanExp oper1, BooleanExp oper2) { 12 | operor1 = oper1; 13 | operor2 = oper2; 14 | } 15 | 16 | public boolean Evaluate(Context c) { 17 | return operor1.Evaluate(c) || operor2.Evaluate(c); 18 | } 19 | 20 | public BooleanExp Copy() { 21 | return new OrExp(operor1.Copy(), operor2.Copy()); 22 | } 23 | 24 | public BooleanExp Replace(String var, BooleanExp exp) { 25 | return new OrExp(operor1.Replace(var, exp),operor2.Replace(var, exp)); 26 | } 27 | } -------------------------------------------------------------------------------- /src/com/designpattern/proxy/staticproxy/ProxyMovieStar.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.proxy.staticproxy; 2 | /** 3 | * 代理角色:经纪人 4 | * @author Json 5 | */ 6 | public class ProxyMovieStar implements MovieStar { 7 | /** 8 | * 真实对象的引用 9 | */ 10 | private MovieStar star; 11 | public ProxyMovieStar(MovieStar star){ 12 | this.star = star; 13 | } 14 | 15 | @Override 16 | public void discussCooperation() { 17 | System.out.println("代理角色:discussCooperation()"); 18 | } 19 | 20 | @Override 21 | public void signContract() { 22 | System.out.println("代理角色:signContract()"); 23 | } 24 | 25 | @Override 26 | public void playRoleInMovie() { 27 | star.playRoleInMovie(); //这个需要真实角色实现的操作 28 | } 29 | 30 | @Override 31 | public void collectMoney() { 32 | System.out.println("代理角色:collectMoney()"); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/com/designpattern/Mediator/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Mediator; 2 | 3 | /** 4 | * 测试 5 | * @author Json<> 6 | */ 7 | public class Client { 8 | 9 | public static void main(String[] args) { 10 | MessageMediator mediator = new MessageMediator(); 11 | 12 | PeopleA a = new PeopleA(mediator,"A"); 13 | PeopleB b = new PeopleB(mediator,"B"); 14 | PeopleC c = new PeopleC(mediator,"C"); 15 | 16 | mediator.setPeopleA(a); 17 | mediator.setPeopleB(b); 18 | mediator.setPeopleC(c); 19 | 20 | mediator.chat(a, "中午吃啥饭?"); 21 | System.out.println(); 22 | 23 | mediator.chat(b,"我想吃刀削面"); 24 | System.out.println(); 25 | 26 | mediator.chat(c,"我也想吃刀削面"); 27 | System.out.println(); 28 | 29 | mediator.chat(a, "行,那中午一起去吃刀削面吧"); 30 | System.out.println(); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/com/designpattern/Interpreter/AndExp.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Interpreter; 2 | 3 | /** 4 | * 非终结符表达式 -- and 5 | * @author Json<> 6 | */ 7 | public class AndExp implements BooleanExp { 8 | private BooleanExp operand1; 9 | private BooleanExp operand2; 10 | 11 | public AndExp(BooleanExp oper1, BooleanExp oper2) { 12 | operand1 = oper1; 13 | operand2 = oper2; 14 | } 15 | 16 | public boolean Evaluate(Context c) { 17 | return operand1.Evaluate(c) && operand2.Evaluate(c); 18 | } 19 | 20 | public BooleanExp Copy() { 21 | return new AndExp(operand1.Copy(), operand2.Copy()); 22 | } 23 | 24 | public BooleanExp Replace(String var, BooleanExp exp) { 25 | return new AndExp(operand1.Replace(var, exp),operand2.Replace(var, exp)); 26 | } 27 | } -------------------------------------------------------------------------------- /src/com/designpattern/Memento/undoByMemento/ChessMemento.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Memento.undoByMemento; 2 | 3 | /** 4 | * 象棋备忘录角色 5 | * @author Json<> 6 | */ 7 | public class ChessMemento { 8 | //操作的棋子 9 | private String piece; 10 | //所在位置 11 | private String location; 12 | 13 | public ChessMemento() { 14 | 15 | } 16 | 17 | public ChessMemento(String piece,String location) { 18 | this.piece = piece; 19 | this.location = location; 20 | } 21 | 22 | public String getPiece() { 23 | return piece; 24 | } 25 | 26 | public void setPiece(String piece) { 27 | this.piece = piece; 28 | } 29 | 30 | public String getLocation() { 31 | return location; 32 | } 33 | 34 | public void setLocation(String location) { 35 | this.location = location; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/com/designpattern/Memento/MutilCheckpoints/ChessMemento.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Memento.MutilCheckpoints; 2 | 3 | /** 4 | * 象棋备忘录角色 5 | * @author Json<> 6 | */ 7 | public class ChessMemento { 8 | //操作的棋子 9 | private String piece; 10 | //所在位置 11 | private String location; 12 | 13 | public ChessMemento() { 14 | 15 | } 16 | 17 | public ChessMemento(String piece,String location) { 18 | this.piece = piece; 19 | this.location = location; 20 | } 21 | 22 | public String getPiece() { 23 | return piece; 24 | } 25 | 26 | public void setPiece(String piece) { 27 | this.piece = piece; 28 | } 29 | 30 | public String getLocation() { 31 | return location; 32 | } 33 | 34 | public void setLocation(String location) { 35 | this.location = location; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/com/designpattern/Memento/SingleCheckpoints/ChessMemento.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Memento.SingleCheckpoints; 2 | 3 | /** 4 | * 象棋备忘录角色 5 | * @author Json<> 6 | */ 7 | public class ChessMemento { 8 | //操作的棋子 9 | private String piece; 10 | //所在位置 11 | private String location; 12 | 13 | public ChessMemento() { 14 | 15 | } 16 | 17 | public ChessMemento(String piece,String location) { 18 | this.piece = piece; 19 | this.location = location; 20 | } 21 | 22 | public String getPiece() { 23 | return piece; 24 | } 25 | 26 | public void setPiece(String piece) { 27 | this.piece = piece; 28 | } 29 | 30 | public String getLocation() { 31 | return location; 32 | } 33 | 34 | public void setLocation(String location) { 35 | this.location = location; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/com/designpattern/Flyweight/simple/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Flyweight.simple; 2 | 3 | /** 4 | * 测试 5 | * @author Json<> 6 | */ 7 | public class Client { 8 | 9 | public static void main(String[] args) { 10 | FlyweightFactory flyfactory = new FlyweightFactory(); 11 | Flyweight fly1 = flyfactory.factory(Menu.水煮肉片); 12 | fly1.operation("张三点菜"); 13 | 14 | Flyweight fly2 = flyfactory.factory(Menu.酸菜鱼); 15 | fly2.operation("李四点菜"); 16 | 17 | Flyweight fly3 = flyfactory.factory(Menu.酸辣土豆丝); 18 | fly3.operation("王五点菜"); 19 | 20 | Flyweight fly4 = flyfactory.factory(Menu.酸辣土豆丝); 21 | fly4.operation("刘六点菜"); 22 | 23 | Flyweight fly5 = flyfactory.factory(Menu.酸辣土豆丝); 24 | fly5.operation("赵七点菜"); 25 | 26 | System.out.println(flyfactory.getFlyweightSize());; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/com/designpattern/Memento/undoByMemento/TakeBackCommand.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Memento.undoByMemento; 2 | 3 | /** 4 | * 具体命令 -- 悔棋命令 5 | * @author Json<> 6 | */ 7 | public class TakeBackCommand implements Command { 8 | private ChessCaretaker caretaker; 9 | private ChessOriginator originator; 10 | 11 | public TakeBackCommand(ChessOriginator originator,ChessCaretaker caretaker) { 12 | this.originator = originator; 13 | this.caretaker = caretaker; 14 | } 15 | 16 | /** 17 | * 下棋 18 | */ 19 | @Override 20 | public void execute() { 21 | caretaker.saveMemento(originator.createMemento()); //保存备忘录 22 | } 23 | 24 | /** 25 | * 悔棋 26 | */ 27 | @Override 28 | public void undo() { 29 | originator.restoreMemento(caretaker.retrieveMemento());//撤销到上一个备忘录 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/com/designpattern/facade/Test.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.facade; 2 | 3 | import com.designpattern.facade.impl.Light; 4 | import com.designpattern.facade.impl.SmartHome; 5 | import com.designpattern.facade.impl.TV; 6 | 7 | /** 8 | * 类说明 :测试 9 | */ 10 | public class Test { 11 | public static void main(String[] args) { 12 | System.out.println("***************安装智能家居之前*********************"); 13 | //----晚上下班回到家---- 14 | //开灯光 15 | LightI light = new Light(); 16 | light.on(); 17 | //看电视 18 | TVI tv = new TV(); 19 | tv.on(); 20 | //-----睡觉----- 21 | //关灯光 22 | light.off(); 23 | //关电视 24 | tv.off(); 25 | 26 | System.out.println("***************安装智能家居之后*********************"); 27 | 28 | SmartHomeI smarthome = new SmartHome(); 29 | //----晚上下班回到家---- 30 | smarthome.on(); 31 | //-----睡觉----- 32 | smarthome.off(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/MacroCommand/ComputerMacroCommand.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.MacroCommand; 2 | 3 | import java.util.ArrayList; 4 | /** 5 | * 宏命令接口实现 6 | * @author Json 7 | */ 8 | public class ComputerMacroCommand implements MacroCommand { 9 | private ArrayList commands; 10 | //无参构造方法 11 | public ComputerMacroCommand(){ 12 | commands = new ArrayList(); 13 | } 14 | 15 | @Override 16 | public void addCommand(Command command){ 17 | commands.add(command); 18 | } 19 | 20 | @Override 21 | public void removeCommand(Command command){ 22 | commands.remove(command); 23 | } 24 | 25 | @Override 26 | public void execute(){ 27 | for (int i=0; i < commands.size(); i++){ 28 | commands.get(i).execute(); 29 | } 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/com/designpattern/Flyweight/composite/ConcreteCompositeFlyweight.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Flyweight.composite; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | /** 7 | * 复合享元角色 8 | * @author Json<> 9 | */ 10 | public class ConcreteCompositeFlyweight implements Flyweight { 11 | private Map flies = new HashMap(); 12 | 13 | /** 14 | * 增加一个新的单纯享元对象到聚集中 15 | */ 16 | public void add(String key , Flyweight fly){ 17 | flies.put(key,fly); 18 | } 19 | 20 | /** 21 | * 外蕴状态作为参数传入到方法中 22 | */ 23 | @Override 24 | public void operation(String state) { 25 | Flyweight fly = null; 26 | for(Object o : flies.keySet()){ 27 | fly = flies.get(o); 28 | fly.operation(state); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/com/designpattern/state/pattern_realize/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.state.pattern_realize; 2 | 3 | import com.designpattern.state.common_realize.Hero; 4 | 5 | /** 6 | * 测试 7 | * @author Json<> 8 | */ 9 | public class Client { 10 | 11 | public static void main(String[] args) throws InterruptedException { 12 | Hero hero = new Hero(); 13 | hero.startMove(); 14 | System.out.println("队友给了一个加速技能↓↓↓"); 15 | hero.setState(Hero.EXPEDITE_STATE); 16 | Thread.sleep(10000);//在过10秒,被对方英雄虚弱 17 | System.out.println("被对方英雄虚弱了↓↓↓"); 18 | hero.setState(Hero.DECELERATE_STATE); 19 | Thread.sleep(10000);//在过10秒,被对方英雄眩晕 20 | System.out.println("被对方英雄眩晕了↓↓↓"); 21 | hero.setState(Hero.DIZZINESS_STATE); 22 | Thread.sleep(10000);//在过10秒,游戏结束 23 | hero.stopMove(); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/com/designpattern/Composite/Component.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Composite; 2 | 3 | /** 4 | * 抽象构件角色 5 | * @author Json<> 6 | */ 7 | public abstract class Component { 8 | /** 9 | * 向组合对象中加入组件对象 10 | * @param child 被加入组合对象中的组件对象 11 | */ 12 | public void add(Component child) { 13 | throw new UnsupportedOperationException("对象不支持这个功能"); 14 | } 15 | 16 | /** 17 | * 从组合对象中移出某个组件对象 18 | * @param child 被移出的组件对象 19 | */ 20 | public void remove(Component child) { 21 | throw new UnsupportedOperationException("对象不支持这个功能"); 22 | } 23 | 24 | /** 25 | * 返回某个索引对应的组件对象 26 | * @param index 需要获取的组件对象的索引,索引从0开始 27 | * @return 索引对应的组件对象 28 | */ 29 | public Component getChild(int index) { 30 | throw new UnsupportedOperationException("对象不支持这个功能"); 31 | } 32 | 33 | /** 34 | * 输出组件自身的名称 35 | */ 36 | public abstract void outputSelf(String str); 37 | } 38 | -------------------------------------------------------------------------------- /src/com/designpattern/ChainOfResponsibility/DongBaSubbranch.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.ChainOfResponsibility; 2 | 3 | import com.designpattern.utils.LocationUtil; 4 | 5 | /** 6 | * 肯德基 -- 北京东坝分店 7 | * @author Json<> 8 | */ 9 | public class DongBaSubbranch extends KFC { 10 | //最大配送距离 11 | private int maxDeliveryDistance = 500; 12 | 13 | private int x = 800;//分店的横坐标,用于判断距离 14 | private int y = 800;//分店的纵坐标,用于判断距离 15 | 16 | public void handleRequest(int _x,int _y) { 17 | 18 | //在配送范围内,可配送 19 | if(LocationUtil.getDistance(_x, _y, x, y) <= maxDeliveryDistance){ 20 | //如果属于自己处理的职责范围,就在这里处理请求 21 | //具体的处理代码 22 | System.out.println("东坝分店已接单,老司机马上派送"); 23 | }else{ 24 | //如果不属于自己处理的职责范围,那就判断是否还有后继的职责对象 25 | //如果有,就转发请求给后继的职责对象 26 | //如果没有,什么都不做,自然结束 27 | if(this.successor!=null){ 28 | this.successor.handleRequest(_x,_y); 29 | } 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/com/designpattern/ChainOfResponsibility/WangJingSubbranch.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.ChainOfResponsibility; 2 | 3 | import com.designpattern.utils.LocationUtil; 4 | 5 | /** 6 | * 肯德基 -- 北京望京分店 7 | * @author Json<> 8 | */ 9 | public class WangJingSubbranch extends KFC { 10 | //最大配送距离 11 | private int maxDeliveryDistance = 500; 12 | 13 | private int x = 800;//分店的横坐标,用于判断距离 14 | private int y = 600;//分店的纵坐标,用于判断距离 15 | 16 | public void handleRequest(int _x,int _y) { 17 | 18 | //在配送范围内,可配送 19 | if(LocationUtil.getDistance(_x, _y, x, y) <= maxDeliveryDistance){ 20 | //如果属于自己处理的职责范围,就在这里处理请求 21 | //具体的处理代码 22 | System.out.println("望京分店已接单,老司机马上派送"); 23 | }else{ 24 | //如果不属于自己处理的职责范围,那就判断是否还有后继的职责对象 25 | //如果有,就转发请求给后继的职责对象 26 | //如果没有,什么都不做,自然结束 27 | if(this.successor!=null){ 28 | this.successor.handleRequest(_x,_y); 29 | } 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/com/designpattern/ChainOfResponsibility/JiuXianQiaoSubbranch.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.ChainOfResponsibility; 2 | 3 | import com.designpattern.utils.LocationUtil; 4 | 5 | /** 6 | * 肯德基 -- 北京酒仙桥分店 7 | * @author Json<> 8 | */ 9 | public class JiuXianQiaoSubbranch extends KFC{ 10 | //最大配送距离 11 | private int maxDeliveryDistance = 500; 12 | 13 | private int x = 800;//分店的横坐标,用于判断距离 14 | private int y = 200;//分店的纵坐标,用于判断距离 15 | 16 | public void handleRequest(int _x,int _y) { 17 | 18 | //在配送范围内,可配送 19 | if(LocationUtil.getDistance(_x, _y, x, y) <= maxDeliveryDistance){ 20 | //如果属于自己处理的职责范围,就在这里处理请求 21 | //具体的处理代码 22 | System.out.println("酒仙桥分店已接单,老司机马上派送"); 23 | }else{ 24 | //如果不属于自己处理的职责范围,那就判断是否还有后继的职责对象 25 | //如果有,就转发请求给后继的职责对象 26 | //如果没有,什么都不做,自然结束 27 | if(this.successor!=null){ 28 | this.successor.handleRequest(_x,_y); 29 | } 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/com/designpattern/Observer/WechatSubject.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Observer; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * 目标对象,它知道观察它的观察者,并提供注册和删除观察者的接口 8 | * 这里模拟 -- 微信公众号 9 | * @author Json<> 10 | */ 11 | public class WechatSubject { 12 | /** 13 | * 用来保存注册的观察者对象 14 | */ 15 | private List observers = new ArrayList(); 16 | /** 17 | * 注册观察者对象 18 | * @param observer 观察者对象 19 | */ 20 | public void attach(FansObserver observer) { 21 | observers.add(observer); 22 | } 23 | /** 24 | * 删除观察者对象 25 | * @param observer 观察者对象 26 | */ 27 | public void detach(FansObserver observer) { 28 | observers.remove(observer); 29 | } 30 | /** 31 | * 通知所有注册的观察者对象 32 | */ 33 | protected void notify(String article) { 34 | for(FansObserver observer : observers){ 35 | observer.update(article); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/com/designpattern/Mediator/People.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Mediator; 2 | 3 | /** 4 | * 抽象同事类 -- 聊天人员 5 | * @author Json<> 6 | */ 7 | public abstract class People { 8 | //人员昵称 9 | private String name; 10 | //持有一个中介者对象 11 | private Mediator mediator; 12 | 13 | /** 14 | * 构造函数 15 | */ 16 | public People(Mediator mediator,String name){ 17 | this.mediator = mediator; 18 | this.name = name; 19 | } 20 | /** 21 | * 获取中介者对象 22 | */ 23 | public Mediator getMediator() { 24 | return mediator; 25 | } 26 | /** 27 | * 获取昵称 28 | */ 29 | public String getName() { 30 | return name; 31 | } 32 | 33 | /** 34 | * 接收消息 35 | */ 36 | public abstract void receive(String message); 37 | 38 | /** 39 | * 发送消息 40 | */ 41 | public abstract void send(String message); 42 | } 43 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/MultiUndo/CreateDirCommand.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.MultiUndo; 2 | 3 | import java.util.ArrayList; 4 | 5 | /** 6 | * 具体命令 -- 创建目录 7 | * @author Json 8 | */ 9 | public class CreateDirCommand implements Command { 10 | private ArrayList dirNameList; //记录 这里用list实现 11 | private MakeDir makeDir; 12 | public CreateDirCommand(MakeDir makeDir) { 13 | dirNameList = new ArrayList(); 14 | this.makeDir = makeDir; 15 | } 16 | 17 | @Override 18 | public void execute(String dirName) { 19 | makeDir.createDir(dirName); 20 | dirNameList.add(dirName); 21 | } 22 | 23 | @Override 24 | public void undo() { 25 | if(dirNameList.size()>0){ 26 | makeDir.deleteDir(dirNameList.get(dirNameList.size()-1)); 27 | dirNameList.remove(dirNameList.size()-1); 28 | }else{ 29 | System.out.println("没有需要撤销的操作!"); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/com/designpattern/Memento/OfflineStorage/ChessMemento.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Memento.OfflineStorage; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * 象棋备忘录角色 -- 实现序列化 7 | * @author Json<> 8 | */ 9 | public class ChessMemento implements Serializable{ 10 | private static final long serialVersionUID = 1L; 11 | 12 | //操作的棋子 13 | private String piece; 14 | //所在位置 15 | private String location; 16 | 17 | public ChessMemento() { 18 | 19 | } 20 | 21 | public ChessMemento(String piece,String location) { 22 | this.piece = piece; 23 | this.location = location; 24 | } 25 | 26 | public String getPiece() { 27 | return piece; 28 | } 29 | 30 | public void setPiece(String piece) { 31 | this.piece = piece; 32 | } 33 | 34 | public String getLocation() { 35 | return location; 36 | } 37 | 38 | public void setLocation(String location) { 39 | this.location = location; 40 | } 41 | } 42 | 43 | -------------------------------------------------------------------------------- /src/com/designpattern/Flyweight/simple/FlyweightFactory.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Flyweight.simple; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | /** 7 | * 享元工厂 8 | * @author Json<> 9 | */ 10 | public class FlyweightFactory { 11 | /** 12 | * 缓存多个flyweight对象,这里只是示意一下 13 | */ 14 | private Map fsMap = new HashMap(); 15 | 16 | /** 17 | * 获取key对应的享元对象 18 | * @param key 获取享元对象的key,只是示意 19 | * @return key 对应的享元对象 20 | */ 21 | public Flyweight factory(String key) { 22 | //这个方法里面基本的实现步骤如下: 23 | //先从缓存里面查找,是否存在key对应的Flyweight对象 24 | Flyweight f = fsMap.get(key); 25 | 26 | //如果存在,就返回相对应的Flyweight对象 27 | if(f == null){ 28 | //如果不存在 29 | //创建一个新的Flyweight对象 30 | f = new ConcreteFlyweight(key); 31 | //把这个新的Flyweight对象添加到缓存里面 32 | fsMap.put(key,f); 33 | } 34 | return f; 35 | } 36 | 37 | //获取flyweight对象个数 38 | public int getFlyweightSize() { 39 | return fsMap.size(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/com/designpattern/proxy/dynamicproxy/ProxyMovieStarHandler.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.proxy.dynamicproxy; 2 | 3 | import java.lang.reflect.InvocationHandler; 4 | import java.lang.reflect.Method; 5 | 6 | /** 7 | * 代理角色的处理器 8 | * @author Json 9 | */ 10 | public class ProxyMovieStarHandler implements InvocationHandler { 11 | 12 | private MovieStar moviestar; 13 | public ProxyMovieStarHandler(MovieStar moviestar){ 14 | super(); 15 | this.moviestar = moviestar; 16 | } 17 | 18 | /** 19 | * 所有的流程控制都在invoke方法中 20 | * proxy:代理类 21 | * method:正在调用的方法 22 | * args:方法的参数 23 | */ 24 | @Override 25 | public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 26 | Object object = null; 27 | System.out.println("调用之前的处理逻辑"); 28 | if (method.getName().equals("playRoleInMovie")) { 29 | object = method.invoke(moviestar, args);//激活调用的方法 30 | } 31 | System.out.println("调用之后的处理逻辑"); 32 | return object; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/RequestLog/Command.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.RequestLog; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * 抽象命令类,由于需要将命令对象写入文件,因此它实现了Serializable接口 7 | * @author Json 8 | */ 9 | public abstract class Command implements Serializable { 10 | private static final long serialVersionUID = 1L; 11 | 12 | protected String name; //命令名称 13 | protected String args; //命令参数 14 | protected Operator operator; //接收者对象 15 | 16 | public Command(String name) { 17 | this.name = name; 18 | } 19 | 20 | public String getName() { 21 | return this.name; 22 | } 23 | 24 | public void setName(String name) { 25 | this.name = name; 26 | } 27 | 28 | public void setOperator(Operator operator) { 29 | this.operator = operator; 30 | } 31 | 32 | //声明两个抽象的执行方法execute() 33 | public abstract void execute(String args); 34 | public abstract void execute(); 35 | } 36 | -------------------------------------------------------------------------------- /src/com/designpattern/Memento/OfflineStorage/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Memento.OfflineStorage; 2 | 3 | /** 4 | * 测试 5 | * @author Json<> 6 | */ 7 | public class Client { 8 | public static void main(String[] args) { 9 | ChessOriginator originator = new ChessOriginator(); 10 | ChessCaretaker caretaker = new ChessCaretaker(); 11 | 12 | originator.setPiece("马"); 13 | originator.setLocation("位置1"); 14 | System.out.println("移动位置→ "+"棋子:"+originator.getPiece()+"||位置:"+originator.getLocation()); 15 | // 存储内部状态 16 | caretaker.saveMemento(originator.createMemento()); 17 | 18 | // 改变状态 19 | originator.setPiece("马"); 20 | originator.setLocation("位置2"); 21 | System.out.println("移动位置→ "+"棋子:"+originator.getPiece()+"||位置:"+originator.getLocation()); 22 | 23 | // 恢复状态 24 | originator.restoreMemento(caretaker.retrieveMemento()); 25 | System.out.println("我要悔棋(棋子回到上一个状态)→ "+"棋子:"+originator.getPiece()+"||位置:"+originator.getLocation()); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/com/designpattern/Memento/SingleCheckpoints/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Memento.SingleCheckpoints; 2 | 3 | /** 4 | * 测试 5 | * @author Json<> 6 | */ 7 | public class Client { 8 | public static void main(String[] args) { 9 | ChessOriginator originator = new ChessOriginator(); 10 | ChessCaretaker caretaker = new ChessCaretaker(); 11 | 12 | originator.setPiece("马"); 13 | originator.setLocation("位置1"); 14 | System.out.println("移动位置→ "+"棋子:"+originator.getPiece()+"||位置:"+originator.getLocation()); 15 | // 存储内部状态 16 | caretaker.saveMemento(originator.createMemento()); 17 | 18 | // 改变状态 19 | originator.setPiece("马"); 20 | originator.setLocation("位置2"); 21 | System.out.println("移动位置→ "+"棋子:"+originator.getPiece()+"||位置:"+originator.getLocation()); 22 | 23 | // 恢复状态 24 | originator.restoreMemento(caretaker.retrieveMemento()); 25 | System.out.println("我要悔棋(棋子回到上一个状态)→ "+"棋子:"+originator.getPiece()+"||位置:"+originator.getLocation()); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/MultiUndo/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.MultiUndo; 2 | /** 3 | * 测试 4 | * @author Json 5 | */ 6 | public class Client { 7 | public static void main(String[] args) { 8 | //创建接收者 9 | MakeDir makeDir = new MakeDir(); 10 | //创建具体命令并且指定接收者 11 | Command create_command = new CreateDirCommand(makeDir); 12 | //创建请求者 13 | RequestMakeDir request = new RequestMakeDir(); 14 | //设置命令 15 | request.setCreateCommand(create_command); 16 | /***********创建目录及撤销**************/ 17 | //创建目录 18 | request.executeCreateCommand("E:\\command\\2017"); 19 | request.executeCreateCommand("E:\\command\\2018"); 20 | request.executeCreateCommand("E:\\command\\2019"); 21 | request.executeCreateCommand("E:\\command\\2020"); 22 | System.out.println("----------------------撤销--------------------"); 23 | //多次撤销 24 | request.undoCreateCommand(); 25 | request.undoCreateCommand(); 26 | request.undoCreateCommand(); 27 | request.undoCreateCommand(); 28 | request.undoCreateCommand(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/com/designpattern/Visitor/expand/Static/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Visitor.expand.Static; 2 | 3 | /** 4 | * 静态分派 5 | * @author Json<> 6 | */ 7 | class Dog { 8 | 9 | } 10 | 11 | class DogBaby1 extends Dog{ 12 | 13 | } 14 | 15 | class DogBaby2 extends Dog{ 16 | 17 | } 18 | 19 | class Execute { 20 | public void excute(Dog dog){ 21 | System.out.println("我是dog妈妈"); 22 | } 23 | 24 | public void excute(DogBaby1 baby1){ 25 | System.out.println("我是dogbaby1"); 26 | } 27 | 28 | public void excute(DogBaby2 baby2){ 29 | System.out.println("我是dogbaby2"); 30 | } 31 | } 32 | 33 | public class Client { 34 | public static void main(String[] args) { 35 | Dog dog = new Dog(); 36 | Dog baby1 = new DogBaby1(); 37 | Dog baby2 = new DogBaby2(); 38 | 39 | Execute exe = new Execute(); 40 | exe.excute(dog); 41 | exe.excute(baby1); 42 | exe.excute(baby2); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_1/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_1; 2 | 3 | /** 4 | * 测试 5 | * @author Json 6 | */ 7 | public class Client { 8 | 9 | public static void main(String[] args) { 10 | Message s; 11 | 12 | //创建普通消息 13 | s = new CommonEmailMessage(); 14 | s.send("本月需完成任务如下:...", "Json_Wang"); 15 | //创建一个加急消息对象 16 | s = new UrgencyEmailMessage(); 17 | s.send("本周需完成任务如下:...", "Json_Wang"); 18 | //创建一个特急消息对象 19 | s = new VeryUrgencyEmailMessage(); 20 | s.send("尽快修复致命bug,今天客户端无法登陆的问题!", "Json_Wang"); 21 | 22 | System.out.println("---------------------------------"); 23 | 24 | //创建普通消息 25 | s = new CommonMobileMessage(); 26 | s.send("本月需完成任务如下:...", "Json_Wang"); 27 | //创建一个加急消息对象 28 | s = new UrgencyMobileMessage(); 29 | s.send("本周需完成任务如下:...", "Json_Wang"); 30 | //创建一个特急消息对象 31 | s = new VeryUrgencyMobileMessage(); 32 | s.send("尽快修复致命bug,今天客户端无法登陆的问题!", "Json_Wang"); 33 | 34 | //站内消息实现省略... 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/com/designpattern/Composite/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Composite; 2 | 3 | /** 4 | * 测试 5 | * @author Json<> 6 | */ 7 | public class Client { 8 | public static void main(String[] args) { 9 | //定义所有的组合对象 10 | Composite root = new Composite("吊炸天股份有限公司"); 11 | Composite c1 = new Composite("北京分公司"); 12 | Composite c2 = new Composite("上海分公司"); 13 | //定义所有的叶子对象 14 | Leaf leaf1_1 = new Leaf("研发部"); 15 | Leaf leaf1_2 = new Leaf("市场部"); 16 | Leaf leaf1_3 = new Leaf("省略..."); 17 | 18 | Leaf leaf2_1 = new Leaf("市场部"); 19 | Leaf leaf2_2 = new Leaf("销售部"); 20 | Leaf leaf2_3 = new Leaf("省略..."); 21 | 22 | //按照树的结构来组合组合对象和叶子对象 23 | root.add(c1); 24 | c1.add(leaf1_1); 25 | c1.add(leaf1_2); 26 | c1.add(leaf1_3); 27 | 28 | root.add(c2); 29 | c2.add(leaf2_1); 30 | c2.add(leaf2_2); 31 | c2.add(leaf2_3); 32 | 33 | //调用根对象的输出功能来输出整棵树 34 | root.outputSelf(""); 35 | 36 | System.out.println("--------删除节点(上海分公司撤销了)↓↓↓----------"); 37 | root.remove(c2); 38 | root.outputSelf(""); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/com/designpattern/utils/DateFormatUtil.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.utils; 2 | 3 | import java.text.ParseException; 4 | import java.text.SimpleDateFormat; 5 | import java.util.Calendar; 6 | import java.util.Date; 7 | import java.util.Locale; 8 | 9 | public class DateFormatUtil { 10 | public static final String YYYYMMDD = "yyyy-MM-dd"; 11 | public static final String YYYYMMDDHHMMSS = "yyyy-MM-dd HH:mm:ss"; 12 | 13 | public static String dateToString(String format,Date date){ 14 | String str = "--"; 15 | if(date != null){ 16 | SimpleDateFormat formats = new SimpleDateFormat(format,Locale.CHINESE); 17 | str = formats.format(date); 18 | formats = null; 19 | } 20 | return str; 21 | } 22 | 23 | public static Date stringToDate(String format,String str){ 24 | SimpleDateFormat formats = new SimpleDateFormat(format); 25 | Date date = null; 26 | try { 27 | date = formats.parse(str); 28 | } catch (ParseException e) { 29 | // TODO Auto-generated catch block 30 | e.printStackTrace(); 31 | } 32 | formats = null; 33 | return date; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/com/designpattern/Prototype/标准原型结构: -------------------------------------------------------------------------------- 1 | /** 2 | * 先来看看原型接口的定义 : 声明一个克隆自身的接口 3 | */ 4 | public interface Prototype { 5 | /** 6 | * 克隆自身的方法 7 | * @return 一个从自身克隆出来的对象 8 | */ 9 | public Prototype clone(); 10 | } 11 | 12 | /** 13 | * 具体的原型实现对象 : 克隆的具体实现对象 14 | * 为了跟上面原型模式的结构示意图保持一致,因此这两个具体的原型实现对象,都没有定义属性。事实上,在实际使用原型模式的应用中,原型对象多是有属性的,克隆原型的时候也是需要克隆原型对象的属性的,特此说明一下。 15 | */ 16 | public class ConcretePrototype implements Prototype { 17 | public Prototype clone() { 18 | //最简单的克隆,新建一个自身对象,由于没有属性,就不去复制值了 19 | Prototype prototype = new ConcretePrototype(); 20 | return prototype; 21 | } 22 | } 23 | 24 | /** 25 | * 使用原型的客户端 26 | */ 27 | public class Client { 28 | /** 29 | * 持有需要使用的原型接口对象 30 | */ 31 | private Prototype prototype; 32 | 33 | /** 34 | * 构造方法,传入需要使用的原型接口对象 35 | * @param prototype 需要使用的原型接口对象 36 | */ 37 | public Client(Prototype prototype){ 38 | this.prototype = prototype; 39 | } 40 | 41 | /** 42 | * 示意方法,执行某个功能操作 43 | */ 44 | public void operation(){ 45 | //会需要创建原型接口的对象 46 | Prototype newPrototype = prototype.clone(); 47 | } 48 | } -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/MacroCommand/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.MacroCommand; 2 | 3 | /** 4 | * 测试 5 | * @author Json 6 | */ 7 | public class Client { 8 | public static void main(String[] args) { 9 | //创建接收者 10 | Computer computer = new Computer(); 11 | //创建命令对象,设定它的接收者 12 | Command bios_command = new BIOSStartCommand(computer); 13 | //创建命令对象,设定它的接收者 14 | Command mbr_command = new MBRStartCommand(computer); 15 | //创建命令对象,设定它的接收者 16 | Command hdd_command = new HDDStartCommand(computer); 17 | //创建命令对象,设定它的接收者 18 | Command os_command = new OSStartCommand(computer); 19 | //命令控制对象Invoker,把命令对象通过构造方法设置进去 20 | MacroCommand invoker = new ComputerMacroCommand(); 21 | invoker.addCommand(bios_command); 22 | invoker.addCommand(mbr_command); 23 | invoker.addCommand(hdd_command); 24 | invoker.addCommand(os_command); 25 | 26 | System.out.println("我要是用电脑,于是按下开机按钮..."); 27 | 28 | invoker.execute(); 29 | 30 | System.out.println("现在可以使用电脑了!!!"); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/Undo/MakeDir.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.Undo; 2 | 3 | import java.io.File; 4 | 5 | /** 6 | * 命令接受者 7 | * 包含两个命令:创建目录、删除目录 8 | * @author Json 9 | */ 10 | public class MakeDir { 11 | //创建目录 12 | public void createDir(String name){ 13 | File dir = new File(name); 14 | if (dir.exists()) { 15 | System.out.println("创建目录 " + name + " 失败,目标目录已经存在"); 16 | }else{ 17 | //创建目录 18 | if (dir.mkdirs()) { 19 | System.out.println("创建目录 " + name + " 成功"); 20 | } else { 21 | System.out.println("创建目录 " + name + " 失败"); 22 | } 23 | } 24 | } 25 | //删除目录 26 | public void deleteDir(String name){ 27 | File dir = new File(name); 28 | if(dir.exists()) { 29 | if(dir.delete()){ 30 | System.out.println("删除目录 " + name + " 成功"); 31 | }else{ 32 | System.out.println("删除目录 " + name + " 失败"); 33 | } 34 | }else{ 35 | System.out.println("删除目录 " + name + " 失败,目标目录不存在"); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/com/designpattern/Mediator/MessageMediator.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Mediator; 2 | 3 | /** 4 | * 具体中介者类 5 | * @author Json<> 6 | */ 7 | public class MessageMediator implements Mediator { 8 | //持有并维护人员A 9 | private PeopleA A; 10 | //持有并维护人员B 11 | private PeopleB B; 12 | //持有并维护人员C 13 | private PeopleC C; 14 | 15 | public void setPeopleA(PeopleA A) { 16 | this.A = A; 17 | } 18 | 19 | public void setPeopleB(PeopleB B) { 20 | this.B = B; 21 | } 22 | 23 | public void setPeopleC(PeopleC C) { 24 | this.C = C; 25 | } 26 | 27 | /** 28 | * 发送消息 29 | */ 30 | @Override 31 | public void chat(People p,String message) { 32 | if (p instanceof PeopleA) { 33 | A.send(message); 34 | B.receive(message); 35 | C.receive(message); 36 | } else if (p instanceof PeopleB) { 37 | B.send(message); 38 | A.receive(message); 39 | C.receive(message); 40 | } else if (p instanceof PeopleC) { 41 | C.send(message); 42 | A.receive(message); 43 | B.receive(message); 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/MultiUndo/MakeDir.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.MultiUndo; 2 | 3 | import java.io.File; 4 | 5 | /** 6 | * 命令接受者 7 | * 包含两个命令:创建目录、删除目录 8 | * @author Json 9 | */ 10 | public class MakeDir { 11 | //创建目录 12 | public void createDir(String name){ 13 | File dir = new File(name); 14 | if (dir.exists()) { 15 | System.out.println("创建目录 " + name + " 失败,目标目录已经存在"); 16 | }else{ 17 | //创建目录 18 | if (dir.mkdirs()) { 19 | System.out.println("创建目录 " + name + " 成功"); 20 | } else { 21 | System.out.println("创建目录 " + name + " 失败"); 22 | } 23 | } 24 | } 25 | //删除目录 26 | public void deleteDir(String name){ 27 | File dir = new File(name); 28 | if(dir.exists()) { 29 | if(dir.delete()){ 30 | System.out.println("删除目录 " + name + " 成功"); 31 | }else{ 32 | System.out.println("删除目录 " + name + " 失败"); 33 | } 34 | }else{ 35 | System.out.println("删除目录 " + name + " 失败,目标目录不存在"); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/com/designpattern/bridge/scene_example/scene_example.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.scene_example; 2 | 3 | import java.sql.Connection; 4 | import java.sql.DriverManager; 5 | import java.sql.PreparedStatement; 6 | import java.sql.ResultSet; 7 | import java.sql.SQLException; 8 | 9 | /** 10 | * JDBC示例讲解 桥接模式 11 | * @author Json 12 | */ 13 | public class scene_example { 14 | 15 | public static void main(String[] args) throws SQLException, ClassNotFoundException { 16 | String sql = "具体要操作的sql语句"; 17 | 18 | // 1:装载驱动 19 | Class.forName("驱动的名字"); 20 | 21 | // 2:创建连接 22 | Connection conn = DriverManager.getConnection("连接数据库服务的URL", "用户名","密码"); 23 | 24 | // 3:创建statement或者是preparedStatement 25 | PreparedStatement pstmt = conn.prepareStatement(sql); 26 | 27 | // 4:执行sql,如果是查询,再获取ResultSet 28 | ResultSet rs = pstmt.executeQuery(sql); 29 | 30 | // 5:循环从ResultSet中把值取出来,封装到数据对象中去 31 | while (rs.next()) { 32 | // 取值示意,按名称取值 33 | String id = rs.getString("id"); 34 | } 35 | 36 | //6:关闭 37 | rs.close(); 38 | pstmt.close(); 39 | conn.close(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/RequestLog/SqlExecuteTool.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.RequestLog; 2 | 3 | import java.util.ArrayList; 4 | 5 | import com.designpattern.utils.FileUtil; 6 | /** 7 | * 请求发送者 8 | * @author Json 9 | */ 10 | public class SqlExecuteTool { 11 | //定义一个集合来存储每一次操作时的命令对象 12 | private ArrayList commands = new ArrayList(); 13 | private Command command; 14 | 15 | //注入具体命令对象 16 | public void setCommand(Command command) { 17 | this.command = command; 18 | } 19 | 20 | //执行配置文件修改命令,同时将命令对象添加到命令集合中 21 | public void call(String args) { 22 | command.execute(args); 23 | commands.add(command); 24 | } 25 | 26 | //记录请求日志,生成日志文件,将命令集合写入日志文件 27 | public void save() { 28 | FileUtil.writeCommands(commands); 29 | } 30 | 31 | //从日志文件中提取命令集合,并循环调用每一个命令对象的execute()方法来实现配置文件的重新设置 32 | public void recover() { 33 | ArrayList list = FileUtil.readCommands(); 34 | for (Object obj : list) { 35 | ((Command)obj).execute(); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/com/designpattern/Interpreter/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Interpreter; 2 | 3 | /** 4 | * 客户端测试 5 | * @author Json<> 6 | */ 7 | public class Client { 8 | public static void main(String[] args) { 9 | Context context = new Context(); 10 | 11 | VariableExp x = new VariableExp("X"); 12 | VariableExp y = new VariableExp("Y"); 13 | VariableExp z = new VariableExp("Z"); 14 | 15 | context.Assign("X", true); 16 | context.Assign("Y", false); 17 | context.Assign("Z", true); 18 | 19 | //测试表达式 :(z and x) and (y and (not x)) 20 | BooleanExp expression = new AndExp(new AndExp(z, x),new AndExp(y, new NotExp(x))); 21 | boolean result = expression.Evaluate(context); 22 | System.out.println("(z and x) and (y and (not x))表达式结果:" + result); 23 | 24 | //测试表达式 :(z and x) or (y and (not x)) 25 | BooleanExp expression1 = new OrExp(new AndExp(z, x),new AndExp(y, new NotExp(x))); 26 | boolean result1 = expression1.Evaluate(context); 27 | System.out.println("(z and x) or (y and (not x))表达式结果:" + result1); 28 | } 29 | } -------------------------------------------------------------------------------- /src/com/designpattern/Memento/undoByMemento/ChessOriginator.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Memento.undoByMemento; 2 | 3 | /** 4 | * 象棋原发器对象 5 | * @author Json<> 6 | */ 7 | public class ChessOriginator { 8 | //操作的棋子 9 | private String piece; 10 | //所在位置 11 | private String location; 12 | 13 | public ChessOriginator() { 14 | 15 | } 16 | 17 | public ChessOriginator(String piece,String location) { 18 | this.piece = piece; 19 | this.location = location; 20 | } 21 | 22 | public String getPiece() { 23 | return piece; 24 | } 25 | 26 | public void setPiece(String piece) { 27 | this.piece = piece; 28 | } 29 | 30 | public String getLocation() { 31 | return location; 32 | } 33 | 34 | public void setLocation(String location) { 35 | this.location = location; 36 | } 37 | 38 | //保存状态 39 | public ChessMemento createMemento() { 40 | return new ChessMemento(this.piece,this.location); 41 | } 42 | 43 | //恢复状态 44 | public void restoreMemento(ChessMemento memento) { 45 | this.piece = memento.getPiece(); 46 | this.location = memento.getLocation(); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/com/designpattern/Memento/MutilCheckpoints/ChessOriginator.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Memento.MutilCheckpoints; 2 | 3 | /** 4 | * 象棋原发器对象 5 | * @author Json<> 6 | */ 7 | public class ChessOriginator { 8 | //操作的棋子 9 | private String piece; 10 | //所在位置 11 | private String location; 12 | 13 | public ChessOriginator() { 14 | 15 | } 16 | 17 | public ChessOriginator(String piece,String location) { 18 | this.piece = piece; 19 | this.location = location; 20 | } 21 | 22 | public String getPiece() { 23 | return piece; 24 | } 25 | 26 | public void setPiece(String piece) { 27 | this.piece = piece; 28 | } 29 | 30 | public String getLocation() { 31 | return location; 32 | } 33 | 34 | public void setLocation(String location) { 35 | this.location = location; 36 | } 37 | 38 | //保存状态 39 | public ChessMemento createMemento() { 40 | return new ChessMemento(this.piece,this.location); 41 | } 42 | 43 | //恢复状态 44 | public void restoreMemento(ChessMemento memento) { 45 | this.piece = memento.getPiece(); 46 | this.location = memento.getLocation(); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/com/designpattern/Memento/OfflineStorage/ChessOriginator.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Memento.OfflineStorage; 2 | 3 | /** 4 | * 象棋原发器对象 5 | * @author Json<> 6 | */ 7 | public class ChessOriginator{ 8 | 9 | //操作的棋子 10 | private String piece; 11 | //所在位置 12 | private String location; 13 | 14 | public ChessOriginator() { 15 | 16 | } 17 | 18 | public ChessOriginator(String piece,String location) { 19 | this.piece = piece; 20 | this.location = location; 21 | } 22 | 23 | public String getPiece() { 24 | return piece; 25 | } 26 | 27 | public void setPiece(String piece) { 28 | this.piece = piece; 29 | } 30 | 31 | public String getLocation() { 32 | return location; 33 | } 34 | 35 | public void setLocation(String location) { 36 | this.location = location; 37 | } 38 | 39 | //保存状态 40 | public ChessMemento createMemento() { 41 | return new ChessMemento(this.piece,this.location); 42 | } 43 | 44 | //恢复状态 45 | public void restoreMemento(ChessMemento memento) { 46 | this.piece = memento.getPiece(); 47 | this.location = memento.getLocation(); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/com/designpattern/Memento/SingleCheckpoints/ChessOriginator.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Memento.SingleCheckpoints; 2 | 3 | /** 4 | * 象棋原发器对象 5 | * @author Json<> 6 | */ 7 | public class ChessOriginator { 8 | //操作的棋子 9 | private String piece; 10 | //所在位置 11 | private String location; 12 | 13 | public ChessOriginator() { 14 | 15 | } 16 | 17 | public ChessOriginator(String piece,String location) { 18 | this.piece = piece; 19 | this.location = location; 20 | } 21 | 22 | public String getPiece() { 23 | return piece; 24 | } 25 | 26 | public void setPiece(String piece) { 27 | this.piece = piece; 28 | } 29 | 30 | public String getLocation() { 31 | return location; 32 | } 33 | 34 | public void setLocation(String location) { 35 | this.location = location; 36 | } 37 | 38 | //保存状态 39 | public ChessMemento createMemento() { 40 | return new ChessMemento(this.piece,this.location); 41 | } 42 | 43 | //恢复状态 44 | public void restoreMemento(ChessMemento memento) { 45 | this.piece = memento.getPiece(); 46 | this.location = memento.getLocation(); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/com/designpattern/iterator/jdk_use_iterator/IteratorTest.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.iterator.jdk_use_iterator; 2 | 3 | import java.util.ArrayList; 4 | import java.util.HashMap; 5 | import java.util.Iterator; 6 | import java.util.List; 7 | import java.util.Map; 8 | /** 9 | * 测试JDK自带的迭代器 10 | * @author Json 11 | */ 12 | public class IteratorTest { 13 | public static void main(String[] args) { 14 | List list = new ArrayList(); 15 | for(int i = 0;i < 10;i++){ 16 | list.add("list_"+i); 17 | } 18 | Iterator iterList = list.iterator();//List接口实现了Iterable接口 19 | while(iterList.hasNext()){ 20 | String str = (String)iterList.next(); 21 | System.out.print(str+"、"); 22 | } 23 | 24 | System.out.println(""); 25 | 26 | Map map = new HashMap(); 27 | for(int i = 0;i < 10;i++){ 28 | map.put(i,"map_"+i); 29 | } 30 | Iterator iterMap = map.entrySet().iterator(); 31 | while(iterMap.hasNext()){ 32 | Map.Entry strMap = (Map.Entry)iterMap.next(); 33 | System.out.print(strMap.getValue()+"、"); 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/com/designpattern/state/结构: -------------------------------------------------------------------------------- 1 | /** 2 | * 封装与Context的一个特定状态相关的行为 3 | */ 4 | public interface State { 5 | /** 6 | * 状态对应的处理 7 | * @param sampleParameter 示例参数,说明可以传入参数,具体传入 8 | * 什么样的参数,传入几个参数,由具体应用来具体分析 9 | */ 10 | public void handle(String sampleParameter); 11 | } 12 | 13 | /** 14 | * 实现一个与Context的一个特定状态相关的行为 15 | */ 16 | public class ConcreteStateA implements State { 17 | public void handle(String sampleParameter) { 18 | //实现具体的处理 19 | } 20 | } 21 | /** 22 | * 实现一个与Context的一个特定状态相关的行为 23 | */ 24 | public class ConcreteStateB implements State { 25 | public void handle(String sampleParameter) { 26 | //实现具体的处理 27 | } 28 | } 29 | 30 | /** 31 | * 定义客户感兴趣的接口,通常会维护一个State类型的对象实例 32 | */ 33 | public class Context { 34 | /** 35 | * 持有一个State类型的对象实例 36 | */ 37 | private State state; 38 | /** 39 | * 设置实现State的对象的实例 40 | * @param state 实现State的对象的实例 41 | */ 42 | public void setState(State state) { 43 | this.state = state; 44 | } 45 | /** 46 | * 用户感兴趣的接口方法 47 | * @param sampleParameter 示意参数 48 | */ 49 | public void request(String sampleParameter) { 50 | //在处理中,会转调state来处理 51 | state.handle(sampleParameter); 52 | } 53 | } -------------------------------------------------------------------------------- /src/com/designpattern/bridge/solution_2/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.bridge.solution_2; 2 | /** 3 | * 测试 4 | * @author Json 5 | */ 6 | public class Client { 7 | public static void main(String[] args) { 8 | //创建具体的实现对象 9 | MessageImplementor impl = new EmailMessage(); 10 | //创建一个普通消息对象 11 | AbstractMessage m = new CommonMessage(impl); 12 | m.sendMessage("本月需完成任务如下:...", "Json_Wang"); 13 | //创建一个加急消息对象 14 | m = new UrgencyMessage(impl); 15 | m.sendMessage("本周需完成任务如下:...", "Json_Wang"); 16 | //创建一个特急消息对象 17 | m = new VeryUrgencyMessage(impl); 18 | m.sendMessage("尽快修复致命bug,今天客户端无法登陆的问题!", "Json_Wang"); 19 | 20 | System.out.println("--------------------------------------"); 21 | 22 | //把实现方式切换成手机短消息,然后再实现一遍 23 | impl = new MobileMessage(); 24 | m = new CommonMessage(impl); 25 | m.sendMessage("本月需完成任务如下:...", "Json_Wang"); 26 | m = new UrgencyMessage(impl); 27 | m.sendMessage("本周需完成任务如下:...", "Json_Wang"); 28 | m = new VeryUrgencyMessage(impl); 29 | m.sendMessage("尽快修复致命bug,今天客户端无法登陆的问题!", "Json_Wang"); 30 | 31 | //站内消息实现省略... 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/com/designpattern/Flyweight/composite/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Flyweight.composite; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * 测试 8 | * @author Json<> 9 | */ 10 | public class Client { 11 | public static void main(String[] args) { 12 | List compositeState = new ArrayList(); 13 | compositeState.add(Menu.水煮肉片); 14 | compositeState.add(Menu.酸辣土豆丝); 15 | compositeState.add(Menu.米饭); 16 | FlyweightFactory flyFactory = new FlyweightFactory(); 17 | Flyweight compositeFly1 = flyFactory.factory(compositeState); 18 | compositeFly1.operation("张三点菜"); 19 | 20 | System.out.println(); 21 | 22 | List compositeState2 = new ArrayList(); 23 | compositeState2.add(Menu.鱼香茄条); 24 | compositeState2.add(Menu.鱼香肉丝); 25 | compositeState2.add(Menu.米饭); 26 | Flyweight compositeFly2 = flyFactory.factory(compositeState2); 27 | compositeFly2.operation("李四点菜"); 28 | 29 | System.out.println(); 30 | System.out.println("复合享元模式是否可以共享对象:" + (compositeFly1 == compositeFly2)); 31 | 32 | System.out.println(flyFactory.getFlyWeightSize()); 33 | 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/com/designpattern/Visitor/expand/doubleDispatch/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Visitor.expand.doubleDispatch; 2 | 3 | /** 4 | * 双重分派 5 | * @author Json<> 6 | */ 7 | class Dog { 8 | public void accept(Execute exe){ 9 | exe.excute(this); 10 | } 11 | } 12 | 13 | class DogBaby1 extends Dog{ 14 | public void accept(Execute exe){ 15 | exe.excute(this); 16 | } 17 | } 18 | 19 | class DogBaby2 extends Dog{ 20 | public void accept(Execute exe){ 21 | exe.excute(this); 22 | } 23 | } 24 | 25 | class Execute { 26 | public void excute(Dog dog){ 27 | System.out.println("我是dog妈妈"); 28 | } 29 | 30 | public void excute(DogBaby1 baby1){ 31 | System.out.println("我是dogbaby1"); 32 | } 33 | 34 | public void excute(DogBaby2 baby2){ 35 | System.out.println("我是dogbaby2"); 36 | } 37 | } 38 | public class Client { 39 | public static void main(String[] args) { 40 | Dog dog = new Dog(); 41 | Dog baby1 = new DogBaby1(); 42 | Dog baby2 = new DogBaby2(); 43 | 44 | Execute exe = new Execute(); 45 | dog.accept(exe); 46 | baby1.accept(exe); 47 | baby2.accept(exe); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/com/designpattern/Flyweight/composite/FlyweightFactory.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Flyweight.composite; 2 | 3 | import java.util.HashMap; 4 | import java.util.List; 5 | import java.util.Map; 6 | 7 | /** 8 | * 享元工厂 9 | * @author Json<> 10 | */ 11 | public class FlyweightFactory { 12 | 13 | private Map flies = new HashMap(); 14 | 15 | /** 16 | * 复合享元工厂方法 17 | */ 18 | public Flyweight factory(List compositeState){ 19 | ConcreteCompositeFlyweight compositeFly = new ConcreteCompositeFlyweight(); 20 | for(String state : compositeState){ 21 | compositeFly.add(state,this.factory(state)); 22 | } 23 | return compositeFly; 24 | } 25 | 26 | /** 27 | * 单纯享元工厂方法 28 | */ 29 | public Flyweight factory(String state){ 30 | //先从缓存中查找对象 31 | Flyweight fly = flies.get(state); 32 | if(fly == null){ 33 | //如果对象不存在则创建一个新的Flyweight对象 34 | fly = new ConcreteFlyweight(state); 35 | //把这个新的Flyweight对象添加到缓存中 36 | flies.put(state, fly); 37 | } 38 | return fly; 39 | } 40 | 41 | // 得到存对象的集合的长度 42 | public int getFlyWeightSize() { 43 | return flies.size(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/com/designpattern/Decorator/结构: -------------------------------------------------------------------------------- 1 | 抽象构件角色 2 | public interface Component { 3 | 4 | public void sampleOperation(); 5 | 6 | } 7 | 8 | 具体构件角色 9 | public class ConcreteComponent implements Component { 10 | 11 | @Override 12 | public void sampleOperation() { 13 | // 写相关的业务代码 14 | } 15 | 16 | } 17 | 18 | 装饰角色 19 | public class Decorator implements Component{ 20 | private Component component; 21 | 22 | public Decorator(Component component){ 23 | this.component = component; 24 | } 25 | 26 | @Override 27 | public void sampleOperation() { 28 | // 委派给构件 29 | component.sampleOperation(); 30 | } 31 | 32 | } 33 | 34 | 具体装饰角色 35 | public class ConcreteDecoratorA extends Decorator { 36 | 37 | public ConcreteDecoratorA(Component component) { 38 | super(component); 39 | } 40 | 41 | @Override 42 | public void sampleOperation() { 43 |       super.sampleOperation(); 44 | // 写相关的业务代码 45 | } 46 | } 47 | 48 | 具体装饰角色 49 | public class ConcreteDecoratorB extends Decorator { 50 | 51 | public ConcreteDecoratorB(Component component) { 52 | super(component); 53 | } 54 | 55 | @Override 56 | public void sampleOperation() { 57 |      super.sampleOperation(); 58 | // 写相关的业务代码 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/com/designpattern/Command/extend/RequestLog/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Command.extend.RequestLog; 2 | /** 3 | * 测试 4 | * @author Json 5 | */ 6 | public class Client { 7 | public static void main(String[] args) { 8 | SqlExecuteTool tool = new SqlExecuteTool(); //定义请求发送者 9 | Operator operator = new Operator(); //定义请求接收者 10 | 11 | Command command; 12 | 13 | //执行了很多次SQL 14 | command = new InsertCommand("增加"); 15 | command.setOperator(operator); 16 | tool.setCommand(command); 17 | tool.call("insert xxx"); 18 | 19 | command = new InsertCommand("增加"); 20 | command.setOperator(operator); 21 | tool.setCommand(command); 22 | tool.call("insert xxx"); 23 | 24 | command = new UpdateCommand("修改"); 25 | command.setOperator(operator); 26 | tool.setCommand(command); 27 | tool.call("update xxx"); 28 | 29 | command = new DeleteCommand("删除"); 30 | command.setOperator(operator); 31 | tool.setCommand(command); 32 | tool.call("delete xxx"); 33 | 34 | System.out.println("-------------------------------------"); 35 | System.out.println("保存执行的sql"); 36 | tool.save(); 37 | System.out.println("-------------------------------------"); 38 | System.out.println("恢复执行的sql"); 39 | System.out.println("-------------------------------------"); 40 | tool.recover(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/com/designpattern/singleton/SingleTest.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.singleton; 2 | 3 | /** 4 | * 网站计数器 5 | */ 6 | class WebCounter { 7 | private int count = 0; 8 | 9 | public int getCount() { 10 | return count; 11 | } 12 | public void setCount(int count) { 13 | this.count = count; 14 | } 15 | } 16 | 17 | /** 18 | * 用户访问 19 | */ 20 | class Visitor{ 21 | public WebCounter webCounter; 22 | public Visitor(WebCounter mwebCounter){ 23 | webCounter = mwebCounter; 24 | } 25 | //访问 26 | public void visit(){ 27 | webCounter.setCount(webCounter.getCount()+1);; 28 | } 29 | } 30 | /** 31 | * 模拟用户访问网站 32 | */ 33 | public class SingleTest{ 34 | public static void main(String[] args){ 35 | WebCounter webCounter1 = new WebCounter(); 36 | WebCounter webCounter2 = new WebCounter(); 37 | Visitor visitor1 = new Visitor(webCounter1); 38 | Visitor visitor2 = new Visitor(webCounter2); 39 | 40 | System.out.println("是不是同一个网站?"); 41 | if(webCounter1.equals(webCounter2)){ 42 | System.out.println("是"); 43 | }else { 44 | System.out.println("不是"); 45 | } 46 | //visitor1访问该网站 47 | visitor1.visit(); 48 | System.out.println("访问量:" + webCounter1.getCount()); 49 | //visitor2访问该网站 50 | visitor2.visit(); 51 | System.out.println("访问量:" + webCounter2.getCount()); 52 | } 53 | } -------------------------------------------------------------------------------- /src/com/designpattern/bridge/结构: -------------------------------------------------------------------------------- 1 | /** 2 | * 定义实现部分的接口,可以与抽象部分接口的方法不一样 3 | */ 4 | public interface Implementor { 5 | /** 6 | * 示例方法,实现抽象部分需要的某些具体功能 7 | */ 8 | public void operationImpl(); 9 | } 10 | 11 | /** 12 | * 定义抽象部分的接口 13 | */ 14 | public abstract class Abstraction { 15 | /** 16 | * 持有一个实现部分的对象 17 | */ 18 | protected Implementor impl; 19 | /** 20 | * 构造方法,传入实现部分的对象 21 | * @param impl 实现部分的对象 22 | */ 23 | public Abstraction(Implementor impl){ 24 | this.impl = impl; 25 | } 26 | /** 27 | * 示例操作,实现一定的功能,可能需要转调实现部分的具体实现方法 28 | */ 29 | public void operation() { 30 | impl.operationImpl(); 31 | } 32 | } 33 | 34 | /** 35 | * 真正的具体实现对象 36 | */ 37 | public class ConcreteImplementorA implements Implementor { 38 | public void operationImpl() { 39 | //真正的实现 40 | } 41 | } 42 | 43 | /** 44 | * 真正的具体实现对象 45 | */ 46 | public class ConcreteImplementorB implements Implementor { 47 | public void operationImpl() { 48 | //真正的实现 49 | } 50 | } 51 | 52 | /** 53 | * 扩充由Abstraction定义的接口功能 54 | */ 55 | public class RefinedAbstraction extends Abstraction { 56 | public RefinedAbstraction(Implementor impl) { 57 | super(impl); 58 | } 59 | /** 60 | * 示例操作,实现一定的功能 61 | */ 62 | public void otherOperation(){ 63 | //实现一定的功能,可能会使用具体实现部分的实现方法, 64 | //但是本方法更大的可能是使用Abstraction中定义的方法, 65 | //通过组合使用Abstraction中定义的方法来完成更多的功能 66 | } 67 | } -------------------------------------------------------------------------------- /src/com/designpattern/Command/结构: -------------------------------------------------------------------------------- 1 | 抽象命令角色类 2 | public interface Command { 3 | /** 4 | * 执行方法 5 | */ 6 | void execute(); 7 | } 8 | 9 | 具体命令角色类 10 | public class ConcreteCommand implements Command { 11 | //持有相应的接收者对象 12 | private Receiver receiver = null; 13 | /** 14 | * 构造方法 15 | */ 16 | public ConcreteCommand(Receiver receiver){ 17 | this.receiver = receiver; 18 | } 19 | @Override 20 | public void execute() { 21 | //通常会转调接收者对象的相应方法,让接收者来真正执行功能 22 | receiver.action(); 23 | } 24 | } 25 | 26 | 接收者角色类 27 | public class Receiver { 28 | /** 29 | * 真正执行命令相应的操作 30 | */ 31 | public void action(){ 32 | System.out.println("执行操作"); 33 | } 34 | } 35 | 36 | 请求者角色类 37 | public class Invoker { 38 | /** 39 | * 持有命令对象 40 | */ 41 | private Command command = null; 42 | /** 43 | * 构造方法 44 | */ 45 | public Invoker(Command command){ 46 | this.command = command; 47 | } 48 | /** 49 | * 行动方法 50 | */ 51 | public void action(){ 52 | command.execute(); 53 | } 54 | } 55 | 56 | 客户端角色类 57 | public class Client { 58 | public static void main(String[] args) { 59 | //创建接收者 60 | Receiver receiver = new Receiver(); 61 | //创建命令对象,设定它的接收者 62 | Command command = new ConcreteCommand(receiver); 63 | //创建请求者,把命令对象设置进去 64 | Invoker invoker = new Invoker(command); 65 | //执行方法 66 | invoker.action(); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/com/designpattern/Flyweight/单纯享元模式结构: -------------------------------------------------------------------------------- 1 | /*** 2 | * 享元接口,通过这个接口享元可以接受并作用于外蕴状态 3 | */ 4 | public interface Flyweight { 5 | /** 6 | * 示例操作,传入外蕴状态 7 | * @param extrinsicState 示例参数,外蕴状态 8 | */ 9 | public void operation(String extrinsicState); 10 | } 11 | 12 | /** 13 | * 享元对象,封装flyweight的内蕴状态 14 | */ 15 | public class ConcreteFlyweight implements Flyweight{ 16 | /** 17 | * 示例,描述内蕴状态 18 | */ 19 | private String intrinsicState; 20 | 21 | /** 22 | * 构造方法,传入享元对象的内蕴状态 23 | * @param state 享元对象的内蕴状态 24 | */ 25 | public ConcreteFlyweight(String state){ 26 | this.intrinsicState = state; 27 | } 28 | 29 | /** 30 | * 外蕴状态作为参数传入方法中,改变方法的行为, 31 | * 但是并不改变对象的内蕴状态。 32 | */ 33 | public void operation(String extrinsicState) { 34 | //具体的功能处理,可能会用到享元内蕴、外蕴状态 35 | } 36 | } 37 | 38 | /** 39 | * 享元工厂 40 | * 在享元模式中,客户端不能直接创建共享的享元对象实例,必须通过享元工厂来创建 41 | */ 42 | public class FlyweightFactory { 43 | /** 44 | * 缓存多个flyweight对象,这里只是示意一下 45 | */ 46 | private Map fsMap = new HashMap(); 47 | 48 | /** 49 | * 获取key对应的享元对象 50 | * @param key 获取享元对象的key,只是示意 51 | * @return key 对应的享元对象 52 | */ 53 | public Flyweight factory(String key) { 54 | //这个方法里面基本的实现步骤如下: 55 | //1:先从缓存里面查找,是否存在key对应的Flyweight对象 56 | Flyweight f = fsMap.get(key); 57 | 58 | //如果存在,就返回相对应的Flyweight对象 59 | if(f == null){//如果不存在 60 | //创建一个新的Flyweight对象 61 | f = new ConcreteFlyweight(key); 62 | //把这个新的Flyweight对象添加到缓存里面 63 | fsMap.put(key,f); 64 | } 65 | return f; 66 | } 67 | } -------------------------------------------------------------------------------- /src/com/designpattern/Memento/自述模式结构: -------------------------------------------------------------------------------- 1 | **自述历史作为一个备忘录模式的特殊实现形式非常简单易懂** 2 | 3 | /** 4 | * 备忘录窄接口 5 | */ 6 | public interface MementoIF { 7 | 8 | } 9 | 10 | /** 11 | *发起人角色自己兼任负责人角色 12 | */ 13 | public class Originator { 14 | private String state; 15 | 16 | public String getState(){ 17 | return state; 18 | } 19 | 20 | public void setState(String state){ 21 | this.state = state; 22 | } 23 | 24 | public Memento createMemento(){ 25 | return new Memento(this); 26 | } 27 | 28 | public void restoreMemento(MementoIF memento){ 29 | Memento m = (Memento)memento; 30 | setState(m.state); 31 | } 32 | 33 | private class Memento implements MementoIF{ 34 | private String state; 35 | 36 | private Memento(Originator o){ 37 | this.state = o.state; 38 | } 39 | 40 | private String getState() { 41 | return state; 42 | } 43 | 44 | } 45 | } 46 | 47 | //调用示例 48 | public class Client { 49 | public static void main(String[] args) { 50 | Originator o = new Originator(); 51 | // 修改状态 52 | o.setState("状态1"); 53 | System.out.println("当前状态:"+o.getState()); 54 | 55 | // 创建备忘录 56 | MementoIF memento = o.createMemento(); 57 | // 修改状态 58 | o.setState("状态2"); 59 | System.out.println("当前状态:"+o.getState()); 60 | 61 | // 按照备忘录恢复对象的状态 62 | o.restoreMemento(memento); 63 | System.out.println("当前状态:"+o.getState()); 64 | } 65 | } -------------------------------------------------------------------------------- /src/com/designpattern/Composite/Composite.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Composite; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * 容器构件 8 | * @author Json<> 9 | */ 10 | public class Composite extends Component { 11 | /** 12 | * 用来存储组合对象中包含的子组件对象 13 | */ 14 | private List childComponents = null; 15 | 16 | /** 17 | * 组合对象的名字 18 | */ 19 | private String name = ""; 20 | 21 | /** 22 | * 构造方法,传入组合对象的名字 23 | * @param name 组合对象的名字 24 | */ 25 | public Composite(String name){ 26 | this.name = name; 27 | } 28 | 29 | /** 30 | * 向组合对象中加入组件对象 31 | * @param child 被加入组合对象中的组件对象 32 | */ 33 | public void add(Component child) { 34 | //延迟初始化 35 | if (childComponents == null) { 36 | childComponents = new ArrayList(); 37 | } 38 | childComponents.add(child); 39 | } 40 | 41 | /** 42 | * 从组合对象中移出某个组件对象 43 | * @param child 被移出的组件对象 44 | */ 45 | public void remove(Component child) { 46 | if (childComponents != null) { 47 | childComponents.remove(child); 48 | } 49 | } 50 | 51 | /** 52 | * 输出组合对象自身的结构 53 | * @param str 前缀,主要是按照层级拼接的空格,实现向后缩进 54 | */ 55 | @Override 56 | public void outputSelf(String str) { 57 | //先把自己输出去 58 | System.out.println(str+"+ "+this.name); 59 | //如果还包含有子组件,那么就输出这些子组件对象 60 | if(this.childComponents != null){ 61 | //添加若干空格,表示向后缩进若干空格 62 | str+=" "; 63 | //输出当前对象的子对象了 64 | for(Component c : childComponents){ 65 | //递归输出每个子对象 66 | c.outputSelf(str); 67 | } 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/com/designpattern/state/pattern_realize/Hero.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.state.pattern_realize; 2 | 3 | /** 4 | * 上下文:模拟英雄类 5 | * @author Json<> 6 | */ 7 | public class Hero { 8 | /** 9 | * 正常状态 10 | */ 11 | public static final State NORMAL_STATE = new NormalState(); 12 | /** 13 | * 加速状态 14 | */ 15 | public static final State EXPEDITE_STATE = new ExpediteState(); 16 | /** 17 | * 减速状态 18 | */ 19 | public static final State DECELERATE_STATE = new DecelerateState(); 20 | /** 21 | * 眩晕状态 22 | */ 23 | public static final State DIZZINESS_STATE = new DizzinessState(); 24 | 25 | //保存英雄当前状态,默认是正常状态 26 | private State state = NORMAL_STATE; 27 | 28 | //英雄移动线程 29 | private Thread moveThread; 30 | 31 | //设置状态 32 | public void setState(State state) { 33 | this.state = state; 34 | } 35 | 36 | //开始移动 37 | public void startMove() { 38 | if (isMoving()) { 39 | return; 40 | } 41 | final Hero hero = this; 42 | moveThread = new Thread(new Runnable() { 43 | public void run() { 44 | while (!moveThread.isInterrupted()) { 45 | state.move(hero); 46 | } 47 | } 48 | }); 49 | System.out.println("英雄开始移动."); 50 | moveThread.start(); 51 | } 52 | 53 | //停止移动 54 | public void stopMove() { 55 | if (isMoving()) 56 | moveThread.interrupt(); 57 | System.out.println("英雄停止移动."); 58 | } 59 | 60 | //判断英雄是否在移动 61 | private boolean isMoving(){ 62 | return moveThread != null && !moveThread.isInterrupted(); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/com/designpattern/iterator/jdk_use_iterator/IteratorTest1.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.iterator.jdk_use_iterator; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collection; 5 | import java.util.Iterator; 6 | /** 7 | * 8 | * @author Json 9 | */ 10 | public class IteratorTest1 { 11 | 12 | public static void main(String[] args) { 13 | Collection list = new ArrayList(); 14 | list.add("张三"); 15 | list.add("李四"); 16 | list.add("王五"); 17 | list.add("赵六"); 18 | 19 | //removeItem1(list); 20 | //removeItem2(list); 21 | removeItem3(list); 22 | } 23 | 24 | /** 25 | * 错误用法1 26 | */ 27 | public static void removeItem1(Collection list){ 28 | Iterator iterator_1 = list.iterator(); 29 | while (iterator_1.hasNext()) { 30 | String str = iterator_1.next(); 31 | if("张三".equals(str)){ 32 | list.remove(str); 33 | } 34 | } 35 | System.out.println(list); 36 | } 37 | 38 | /** 39 | * 错误用法2 40 | */ 41 | public static void removeItem2(Collection list){ 42 | for (String str : list) { 43 | if("张三".equals(str)){ 44 | list.remove(str); 45 | } 46 | } 47 | System.out.println(list); 48 | } 49 | 50 | /** 51 | * 正确用法 52 | */ 53 | public static void removeItem3(Collection list){ 54 | Iterator iterator_3 = list.iterator(); 55 | while (iterator_3.hasNext()) { 56 | String str = iterator_3.next(); 57 | if("张三".equals(str)){ 58 | iterator_3.remove(); 59 | } 60 | } 61 | System.out.println(list); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/com/designpattern/Prototype/shallowcopy/Plan.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Prototype.shallowcopy; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Date; 5 | import java.util.List; 6 | 7 | /** 8 | * 计划 9 | * @author Json<> 10 | */ 11 | public class Plan implements Cloneable { 12 | //计划名称 13 | private String name; 14 | //任务级别 15 | private int level; 16 | //开始时间 17 | private Date startdate; 18 | //截止时间 19 | private Date enddate; 20 | //执行人员 21 | private List executors = new ArrayList(); 22 | 23 | @Override 24 | public Plan clone(){ 25 | try { 26 | return (Plan) super.clone(); 27 | } catch (CloneNotSupportedException e) { 28 | e.printStackTrace(); 29 | } 30 | return null; 31 | } 32 | 33 | public String getName() { 34 | return name; 35 | } 36 | 37 | public void setName(String name) { 38 | this.name = name; 39 | } 40 | 41 | public Date getStartdate() { 42 | return startdate; 43 | } 44 | 45 | public void setStartdate(Date startdate) { 46 | this.startdate = startdate; 47 | } 48 | 49 | public Date getEnddate() { 50 | return enddate; 51 | } 52 | 53 | public void setEnddate(Date enddate) { 54 | this.enddate = enddate; 55 | } 56 | 57 | public List getExecutors() { 58 | return executors; 59 | } 60 | 61 | public void setExecutors(List executors) { 62 | this.executors = executors; 63 | } 64 | 65 | public int getLevel() { 66 | return level; 67 | } 68 | 69 | public void setLevel(int level) { 70 | this.level = level; 71 | } 72 | 73 | @Override 74 | public String toString() { 75 | return "[name=" + name + ", level=" + level + ", startdate=" + startdate + ", enddate=" + enddate 76 | + ", executors=" + executors + "]"; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/com/designpattern/Memento/OfflineStorage/ChessCaretaker.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Memento.OfflineStorage; 2 | 3 | import java.io.BufferedInputStream; 4 | import java.io.BufferedOutputStream; 5 | import java.io.FileInputStream; 6 | import java.io.FileOutputStream; 7 | import java.io.IOException; 8 | import java.io.ObjectInputStream; 9 | import java.io.ObjectOutputStream; 10 | 11 | /** 12 | * 象棋备忘录管理者角色 13 | * @author Json<> 14 | */ 15 | public class ChessCaretaker{ 16 | /** 17 | * 保存备忘录对象 18 | * @param memento 被保存的备忘录对象 19 | */ 20 | public void saveMemento(ChessMemento memento){ 21 | //写到文件中 22 | ObjectOutputStream out = null; 23 | try{ 24 | out = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("E:\\ChessMemento"))); 25 | out.writeObject(memento); 26 | }catch(Exception err){ 27 | err.printStackTrace(); 28 | }finally{ 29 | try { 30 | out.close(); 31 | } catch (IOException e) { 32 | e.printStackTrace(); 33 | } 34 | } 35 | } 36 | /** 37 | * 获取被保存的备忘录对象 38 | * @return 被保存的备忘录对象 39 | */ 40 | public ChessMemento retrieveMemento(){ 41 | ChessMemento memento = null; 42 | //从文件中获取备忘录数据 43 | ObjectInputStream in = null; 44 | try{ 45 | in = new ObjectInputStream(new BufferedInputStream(new FileInputStream("E:\\ChessMemento"))); 46 | memento = (ChessMemento)in.readObject(); 47 | }catch(Exception err){ 48 | err.printStackTrace(); 49 | }finally{ 50 | try { 51 | in.close(); 52 | } catch (IOException e) { 53 | e.printStackTrace(); 54 | } 55 | } 56 | return memento; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/com/designpattern/utils/FileUtil.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.utils; 2 | 3 | import java.io.BufferedInputStream; 4 | import java.io.BufferedOutputStream; 5 | import java.io.FileInputStream; 6 | import java.io.FileOutputStream; 7 | import java.io.ObjectInputStream; 8 | import java.io.ObjectOutputStream; 9 | import java.util.ArrayList; 10 | /** 11 | * 工具类:文件操作类 12 | * @author Json 13 | */ 14 | public class FileUtil { 15 | //将命令集合写入日志文件 16 | public static void writeCommands(ArrayList commands) { 17 | try { 18 | FileOutputStream file = new FileOutputStream("E:\\operate.log"); 19 | //创建对象输出流用于将对象写入到文件中 20 | ObjectOutputStream objout = new ObjectOutputStream(new BufferedOutputStream(file)); 21 | //将对象写入文件 22 | objout.writeObject(commands); 23 | objout.close(); 24 | }catch(Exception e) { 25 | System.out.println("命令保存失败!"); 26 | e.printStackTrace(); 27 | } 28 | } 29 | 30 | //从日志文件中提取命令集合 31 | public static ArrayList readCommands() { 32 | try { 33 | FileInputStream file = new FileInputStream("E:\\operate.log"); 34 | //创建对象输入流用于从文件中读取对象 35 | ObjectInputStream objin = new ObjectInputStream(new BufferedInputStream(file)); 36 | //将文件中的对象读出并转换为ArrayList类型 37 | ArrayList commands = (ArrayList)objin.readObject(); 38 | objin.close(); 39 | return commands; 40 | }catch(Exception e) { 41 | System.out.println("命令读取失败!"); 42 | e.printStackTrace(); 43 | return null; 44 | } 45 | } 46 | 47 | public static void main(String[] args) { 48 | ArrayList list = new ArrayList(); 49 | list.add("1"); 50 | list.add("2"); 51 | list.add("3"); 52 | writeCommands(list); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/com/designpattern/Mediator/结构: -------------------------------------------------------------------------------- 1 | //抽象中介者类 2 | public interface Mediator { 3 | /** 4 | * 同事对象在自身改变的时候来通知中介者的方法 5 | * 让中介者去负责相应的与其他同事对象的交互 6 | */ 7 | public void changed(Colleague c); 8 | } 9 | 10 | //抽象同事类 11 | public abstract class Colleague { 12 | //持有一个中介者对象 13 | private Mediator mediator; 14 | /** 15 | * 构造函数 16 | */ 17 | public Colleague(Mediator mediator){ 18 | this.mediator = mediator; 19 | } 20 | /** 21 | * 获取当前同事类对应的中介者对象 22 | */ 23 | public Mediator getMediator() { 24 | return mediator; 25 | } 26 | } 27 | 28 | //具体中介者类 29 | public class ConcreteMediator implements Mediator { 30 | //持有并维护同事A 31 | private ConcreteColleagueA colleagueA; 32 | //持有并维护同事B 33 | private ConcreteColleagueB colleagueB; 34 | 35 | public void setColleagueA(ConcreteColleagueA colleagueA) { 36 | this.colleagueA = colleagueA; 37 | } 38 | 39 | public void setColleagueB(ConcreteColleagueB colleagueB) { 40 | this.colleagueB = colleagueB; 41 | } 42 | 43 | @Override 44 | public void changed(Colleague c) { 45 | /** 46 | * 某一个同事类发生了变化,通常需要与其他同事交互 47 | * 具体协调相应的同事对象来实现协作行为 48 | */ 49 | } 50 | } 51 | 52 | //具体同事类 53 | public class ConcreteColleagueA extends Colleague { 54 | 55 | public ConcreteColleagueA(Mediator mediator) { 56 | super(mediator); 57 | } 58 | /** 59 | * 示意方法,执行某些操作 60 | */ 61 | public void operation(){ 62 | //在需要跟其他同事通信的时候,通知中介者对象 63 | getMediator().changed(this); 64 | } 65 | } 66 | public class ConcreteColleagueB extends Colleague { 67 | 68 | public ConcreteColleagueB(Mediator mediator) { 69 | super(mediator); 70 | } 71 | /** 72 | * 示意方法,执行某些操作 73 | */ 74 | public void operation(){ 75 | //在需要跟其他同事通信的时候,通知中介者对象 76 | getMediator().changed(this); 77 | } 78 | } -------------------------------------------------------------------------------- /src/com/designpattern/Memento/undoByMemento/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Memento.undoByMemento; 2 | 3 | /** 4 | * 测试 5 | * @author Json<> 6 | */ 7 | public class Client { 8 | public static void main(String[] args) { 9 | //创建接收者 10 | ChessOriginator originator = new ChessOriginator(); 11 | ChessCaretaker caretaker = new ChessCaretaker(); 12 | //创建命令对象,设定它的接收者 13 | Command command = new TakeBackCommand(originator,caretaker); 14 | //创建请求者 15 | People people = new People(command); 16 | 17 | 18 | originator.setPiece("马"); 19 | originator.setLocation("原始位置"); 20 | System.out.println("原始位置→ "+"棋子:"+originator.getPiece()+"||位置:"+originator.getLocation()); 21 | 22 | people.executeCreateCommand(); 23 | originator.setPiece("马"); 24 | originator.setLocation("位置1"); 25 | System.out.println("移动位置→ "+"棋子:"+originator.getPiece()+"||位置:"+originator.getLocation()); 26 | 27 | people.executeCreateCommand(); 28 | // 改变状态 29 | originator.setPiece("马"); 30 | originator.setLocation("位置2"); 31 | System.out.println("移动位置→ "+"棋子:"+originator.getPiece()+"||位置:"+originator.getLocation()); 32 | 33 | people.executeCreateCommand(); 34 | // 改变状态 35 | originator.setPiece("马"); 36 | originator.setLocation("位置3"); 37 | System.out.println("移动位置→ "+"棋子:"+originator.getPiece()+"||位置:"+originator.getLocation()); 38 | 39 | people.executeCreateCommand(); 40 | // 改变状态 41 | originator.setPiece("马"); 42 | originator.setLocation("位置4"); 43 | System.out.println("移动位置→ "+"棋子:"+originator.getPiece()+"||位置:"+originator.getLocation()); 44 | 45 | System.out.println("--------------------------------------"); 46 | 47 | people.undoCreateCommand(); 48 | System.out.println("毁一步棋→ "+"棋子:"+originator.getPiece()+"||位置:"+originator.getLocation()); 49 | 50 | //大哥我再毁一步棋 51 | people.undoCreateCommand(); 52 | System.out.println("再毁一步棋→ "+"棋子:"+originator.getPiece()+"||位置:"+originator.getLocation()); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/com/designpattern/ChainOfResponsibility/结构: -------------------------------------------------------------------------------- 1 | /** 2 | * 抽象职责类 3 | */ 4 | public abstract class Handler { 5 | /** 6 | * 持有后继的职责对象 7 | */ 8 | protected Handler successor; 9 | /** 10 | * 设置后继的职责对象 11 | * @param successor 后继的职责对象 12 | */ 13 | public void setSuccessor(Handler successor) { 14 | this.successor = successor; 15 | } 16 | /** 17 | * 示意处理请求的方法,虽然这个示意方法是没有传入参数, 18 | * 但实际是可以传入参数的,根据具体需要来选择是否传递参数 19 | */ 20 | public abstract void handleRequest(); 21 | } 22 | 23 | /** 24 | * 具体的职责对象,用来处理请求 25 | */ 26 | public class ConcreteHandlerA extends Handler { 27 | public void handleRequest() { 28 | //根据某些条件来判断是否属于自己处理的职责范围 29 | //判断条件比如:从外部传入的参数,或者这里主动去获取的外部数据, 30 | //如从数据库中获取等,下面这句话只是个示意 31 | boolean someCondition = false; 32 | 33 | if(someCondition){ 34 | //如果属于自己处理的职责范围,就在这里处理请求 35 | //具体的处理代码 36 | System.out.println("ConcreteHandlerA handle request"); 37 | }else{ 38 | //如果不属于自己处理的职责范围,那就判断是否还有后继的职责对象 39 | //如果有,就转发请求给后继的职责对象 40 | //如果没有,什么都不做,自然结束 41 | if(this.successor!=null){ 42 | this.successor.handleRequest(); 43 | } 44 | } 45 | } 46 | } 47 | 48 | /** 49 | * 具体的职责对象,用来处理请求 50 | */ 51 | public class ConcreteHandlerB extends Handler { 52 | public void handleRequest() { 53 | //根据某些条件来判断是否属于自己处理的职责范围 54 | //判断条件比如:从外部传入的参数,或者这里主动去获取的外部数据, 55 | //如从数据库中获取等,下面这句话只是个示意 56 | boolean someCondition = false; 57 | 58 | if(someCondition){ 59 | //如果属于自己处理的职责范围,就在这里处理请求 60 | //具体的处理代码 61 | System.out.println("ConcreteHandlerB handle request"); 62 | }else{ 63 | //如果不属于自己处理的职责范围,那就判断是否还有后继的职责对象 64 | //如果有,就转发请求给后继的职责对象 65 | //如果没有,什么都不做,自然结束 66 | if(this.successor!=null){ 67 | this.successor.handleRequest(); 68 | } 69 | } 70 | } 71 | } 72 | 73 | /** 74 | * 职责链的客户端,这里只是个示意 75 | */ 76 | public class Client { 77 | public static void main(String[] args) { 78 | //先要组装职责链 79 | Handler h1 = new ConcreteHandlerA(); 80 | Handler h2 = new ConcreteHandlerB(); 81 | 82 | h1.setSuccessor(h2); 83 | //然后提交请求 84 | h1.handleRequest(); 85 | } 86 | } -------------------------------------------------------------------------------- /src/com/designpattern/Memento/MutilCheckpoints/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Memento.MutilCheckpoints; 2 | 3 | /** 4 | * 测试 5 | * @author Json<> 6 | */ 7 | public class Client { 8 | public static void main(String[] args) { 9 | ChessOriginator originator = new ChessOriginator(); 10 | ChessCaretaker caretaker = new ChessCaretaker(); 11 | 12 | originator.setPiece("马"); 13 | originator.setLocation("原始位置"); 14 | System.out.println("原始位置→ "+"棋子:"+originator.getPiece()+"||位置:"+originator.getLocation()); 15 | 16 | // 存储内部状态 17 | caretaker.saveMemento(originator.createMemento()); 18 | originator.setPiece("马"); 19 | originator.setLocation("位置1"); 20 | System.out.println("移动位置→ "+"棋子:"+originator.getPiece()+"||位置:"+originator.getLocation()); 21 | 22 | // 存储内部状态 23 | caretaker.saveMemento(originator.createMemento()); 24 | // 改变状态 25 | originator.setPiece("马"); 26 | originator.setLocation("位置2"); 27 | System.out.println("移动位置→ "+"棋子:"+originator.getPiece()+"||位置:"+originator.getLocation()); 28 | 29 | // 存储内部状态 30 | caretaker.saveMemento(originator.createMemento()); 31 | // 改变状态 32 | originator.setPiece("马"); 33 | originator.setLocation("位置3"); 34 | System.out.println("移动位置→ "+"棋子:"+originator.getPiece()+"||位置:"+originator.getLocation()); 35 | 36 | // 存储内部状态 37 | caretaker.saveMemento(originator.createMemento()); 38 | // 改变状态 39 | originator.setPiece("马"); 40 | originator.setLocation("位置4"); 41 | System.out.println("移动位置→ "+"棋子:"+originator.getPiece()+"||位置:"+originator.getLocation()); 42 | 43 | System.out.println("--------------------------------------"); 44 | 45 | // 恢复状态 46 | originator.restoreMemento(caretaker.retrieveMemento()); 47 | System.out.println("毁一步棋→ "+"棋子:"+originator.getPiece()+"||位置:"+originator.getLocation()); 48 | 49 | //大哥我再毁一步棋 50 | originator.restoreMemento(caretaker.retrieveMemento()); 51 | System.out.println("再毁一步棋→ "+"棋子:"+originator.getPiece()+"||位置:"+originator.getLocation()); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/com/designpattern/Prototype/deepcopy/Plan.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Prototype.deepcopy; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Date; 5 | import java.util.List; 6 | 7 | /** 8 | * 计划 9 | * @author Json<> 10 | */ 11 | public class Plan implements Cloneable { 12 | //计划名称 13 | private String name; 14 | //任务级别 15 | private int level; 16 | //开始时间 17 | private Date startdate; 18 | //截止时间 19 | private Date enddate; 20 | //执行人员 21 | private List executors = new ArrayList(); 22 | 23 | @Override 24 | public Plan clone(){ 25 | try { 26 | Plan plan = (Plan) super.clone(); 27 | //引用类型的属性,需要处理 28 | if(this.getExecutors() != null){ 29 | List _executors = new ArrayList(); 30 | for(String s : this.getExecutors()){ 31 | _executors.add(s); 32 | } 33 | plan.setExecutors(_executors); 34 | } 35 | 36 | return plan; 37 | } catch (CloneNotSupportedException e) { 38 | e.printStackTrace(); 39 | } 40 | return null; 41 | } 42 | 43 | public String getName() { 44 | return name; 45 | } 46 | 47 | public void setName(String name) { 48 | this.name = name; 49 | } 50 | 51 | public Date getStartdate() { 52 | return startdate; 53 | } 54 | 55 | public void setStartdate(Date startdate) { 56 | this.startdate = startdate; 57 | } 58 | 59 | public Date getEnddate() { 60 | return enddate; 61 | } 62 | 63 | public void setEnddate(Date enddate) { 64 | this.enddate = enddate; 65 | } 66 | 67 | public List getExecutors() { 68 | return executors; 69 | } 70 | 71 | public void setExecutors(List executors) { 72 | this.executors = executors; 73 | } 74 | 75 | public int getLevel() { 76 | return level; 77 | } 78 | 79 | public void setLevel(int level) { 80 | this.level = level; 81 | } 82 | 83 | @Override 84 | public String toString() { 85 | return "[name=" + name + ", level=" + level + ", startdate=" + startdate + ", enddate=" + enddate 86 | + ", executors=" + executors + "]"; 87 | } 88 | 89 | } 90 | -------------------------------------------------------------------------------- /src/com/designpattern/Memento/白箱实现(利用宽接口)结构: -------------------------------------------------------------------------------- 1 | 说明: 2 | 备忘录角色对任何对象都提供一个(宽)接口,备忘录角色的内部所存储的状态就对所有对象公开。即白箱实现。 3 | 白箱实现发起人和负责人提供相同接口,使得负责人可以访问备忘录全部内容,并不安全。 4 | 白箱实现对备忘录内容的保护靠的是程序员的自律,实现也很简单。 5 | 6 | /** 7 | * 备忘录 8 | */ 9 | public class Memento { 10 | private String state; 11 | 12 | public Memento(String state){ 13 | this.state = state; 14 | } 15 | 16 | public String getState(){ 17 | return this.state; 18 | } 19 | 20 | public void setState(String state){ 21 | this.state = state; 22 | } 23 | } 24 | 25 | /** 26 | * 原发器对象 27 | */ 28 | public class Originator { 29 | /** 30 | * 需要存储的状态,也有不需要存储的状态 31 | */ 32 | private String state; 33 | 34 | public String getState() { 35 | return this.state; 36 | } 37 | 38 | public void setState(String state) { 39 | this.state = state; 40 | } 41 | 42 | //创建备忘录对象 43 | public Memento createMemento() { 44 | return new Memento(state); 45 | } 46 | 47 | //从备忘录中恢复状态 48 | public void restoreMemento(Memento memento) { 49 | this.state = memento.getState(); 50 | } 51 | } 52 | 53 | /** 54 | * 备忘录管理者 55 | */ 56 | public class Caretaker { 57 | /** 58 | * 备忘录对象 59 | */ 60 | private Memento memento; 61 | 62 | //获取备忘录 63 | public Memento retrieveMemento() { 64 | return this.memento; 65 | } 66 | 67 | //存储备忘录对象 68 | public void saveMemento(Memento memento) { 69 | this.memento = memento; 70 | } 71 | } 72 | 73 | /** 74 | * 客户端调用示例 75 | */ 76 | public class Client { 77 | public static void main(String[] args) { 78 | Originator originator = new Originator(); 79 | Caretaker caretaker = new Caretaker(); 80 | 81 | originator.setState("状态1"); 82 | System.out.println("当前状态:"+originator.getState()); 83 | // 存储内部状态 84 | caretaker.saveMemento(originator.createMemento()); 85 | 86 | // 改变状态 87 | originator.setState("状态2"); 88 | System.out.println("当前状态:"+originator.getState()); 89 | // 恢复状态 90 | originator.restoreMemento(caretaker.retrieveMemento()); 91 | 92 | System.out.println("恢复后状态:"+originator.getState()); 93 | } 94 | } -------------------------------------------------------------------------------- /src/com/designpattern/Observer/push 结构: -------------------------------------------------------------------------------- 1 | /** 2 | * 目标对象,它知道观察它的观察者,并提供注册和删除观察者的接口 3 | */ 4 | class Subject { 5 | /** 6 | * 用来保存注册的观察者对象 7 | */ 8 | private List observers = new ArrayList(); 9 | /** 10 | * 注册观察者对象 11 | * @param observer 观察者对象 12 | */ 13 | public void attach(Observer observer) { 14 | observers.add(observer); 15 | } 16 | /** 17 | * 删除观察者对象 18 | * @param observer 观察者对象 19 | */ 20 | public void detach(Observer observer) { 21 | observers.remove(observer); 22 | } 23 | /** 24 | * 通知所有注册的观察者对象 25 | */ 26 | protected void notifyObservers(String newState) { 27 | for(Observer observer : observers){ 28 | observer.update(newState); 29 | } 30 | } 31 | } 32 | 33 | /** 34 | * 具体的目标对象,负责把有关状态存入到相应的观察者对象, 35 | * 并在自己状态发生改变时,通知各个观察者 36 | */ 37 | class ConcreteSubject extends Subject { 38 | /** 39 | * 示意,目标对象的状态 40 | */ 41 | private String subjectState; 42 | 43 | public String getSubjectState() { 44 | return subjectState; 45 | } 46 | 47 | public void change(String subjectState) { 48 | this.subjectState = subjectState; 49 | //状态发生改变,通知各个观察者 50 | this.notifyObservers(subjectState); 51 | } 52 | } 53 | 54 | /** 55 | * 观察者接口,定义一个更新的接口给那些在目标发生改变的时候被通知的对象 56 | */ 57 | interface Observer { 58 | /** 59 | * 更新的接口 60 | * @param subject 传入目标对象,好获取相应的目标对象的状态 61 | */ 62 | public void update(String newState); 63 | } 64 | 65 | /** 66 | * 具体观察者对象,实现更新的方法,使自身的状态和目标的状态保持一致 67 | */ 68 | class ConcreteObserver implements Observer { 69 | /** 70 | * 示意,观者者的状态 71 | */ 72 | private String observerState; 73 | 74 | @Override 75 | public void update(String newState) { 76 | //具体的更新实现 77 | //这里可能需要更新观察者的状态,使其与目标的状态保持一致 78 | observerState = newState; 79 | } 80 | } 81 | 82 | /** 83 | * 客户端调用 84 | */ 85 | public class Client { 86 | public static void main(String[] args) { 87 | //创建主题对象 88 | ConcreteSubject subject = new ConcreteSubject(); 89 | //创建观察者对象 90 | Observer observer = new ConcreteObserver(); 91 | //将观察者对象登记到主题对象上 92 | subject.attach(observer); 93 | //改变主题对象的状态 94 | subject.change("new state"); 95 | } 96 | } -------------------------------------------------------------------------------- /src/com/designpattern/Observer/pull 结构: -------------------------------------------------------------------------------- 1 | /** 2 | * 目标对象,它知道观察它的观察者,并提供注册和删除观察者的接口 3 | */ 4 | class Subject { 5 | /** 6 | * 用来保存注册的观察者对象 7 | */ 8 | private List observers = new ArrayList(); 9 | /** 10 | * 注册观察者对象 11 | * @param observer 观察者对象 12 | */ 13 | public void attach(Observer observer) { 14 | observers.add(observer); 15 | } 16 | /** 17 | * 删除观察者对象 18 | * @param observer 观察者对象 19 | */ 20 | public void detach(Observer observer) { 21 | observers.remove(observer); 22 | } 23 | /** 24 | * 通知所有注册的观察者对象 25 | */ 26 | public void notifyObservers(){ 27 | for(Observer observer : observers){ 28 | observer.update(this); 29 | } 30 | } 31 | } 32 | 33 | /** 34 | * 具体的目标对象,负责把有关状态存入到相应的观察者对象, 35 | * 并在自己状态发生改变时,通知各个观察者 36 | */ 37 | class ConcreteSubject extends Subject { 38 | /** 39 | * 示意,目标对象的状态 40 | */ 41 | private String subjectState; 42 | 43 | public String getSubjectState() { 44 | return subjectState; 45 | } 46 | 47 | public void change(String subjectState) { 48 | this.subjectState = subjectState; 49 | //状态发生改变,通知各个观察者 50 | this.notifyObservers(); 51 | } 52 | } 53 | 54 | /** 55 | * 观察者接口,定义一个更新的接口给那些在目标发生改变的时候被通知的对象 56 | */ 57 | interface Observer { 58 | /** 59 | * 更新的接口 60 | * @param subject 传入目标对象,好获取相应的目标对象的状态 61 | */ 62 | public void update(Subject subject); 63 | } 64 | 65 | /** 66 | * 具体观察者对象,实现更新的方法,使自身的状态和目标的状态保持一致 67 | */ 68 | class ConcreteObserver implements Observer { 69 | /** 70 | * 示意,观者者的状态 71 | */ 72 | private String observerState; 73 | 74 | @Override 75 | public void update(Subject subject) { 76 | //具体的更新实现 77 | //这里可能需要更新观察者的状态,使其与目标的状态保持一致 78 | observerState = ((ConcreteSubject)subject).getSubjectState(); 79 | } 80 | } 81 | 82 | /** 83 | * 客户端调用 84 | */ 85 | public class Client { 86 | public static void main(String[] args) { 87 | //创建主题对象 88 | ConcreteSubject subject = new ConcreteSubject(); 89 | //创建观察者对象 90 | Observer observer = new ConcreteObserver(); 91 | //将观察者对象登记到主题对象上 92 | subject.attach(observer); 93 | //改变主题对象的状态 94 | subject.change("new state"); 95 | } 96 | } -------------------------------------------------------------------------------- /src/com/designpattern/Composite/结构: -------------------------------------------------------------------------------- 1 | /** 2 | * 抽象构件角色: 抽象的组件对象,为组合中的对象声明接口,实现接口的缺省行为 3 | */ 4 | public abstract class Component { 5 | /** 6 | * 向组合对象中加入组件对象 7 | * @param child 被加入组合对象中的组件对象 8 | */ 9 | public void add(Component child) { 10 | // 缺省的实现,抛出例外,因为叶子对象没有这个功能, 11 | //或者子组件没有实现这个功能 12 | throw new UnsupportedOperationException("对象不支持这个功能"); 13 | } 14 | 15 | /** 16 | * 从组合对象中移出某个组件对象 17 | * @param child 被移出的组件对象 18 | */ 19 | public void remove(Component child) { 20 | // 缺省的实现,抛出例外,因为叶子对象没有这个功能, 21 | //或者子组件没有实现这个功能 22 | throw new UnsupportedOperationException("对象不支持这个功能"); 23 | } 24 | 25 | /** 26 | * 返回某个索引对应的组件对象 27 | * @param index 需要获取的组件对象的索引,索引从0开始 28 | * @return 索引对应的组件对象 29 | */ 30 | public Component getChild(int index) { 31 | // 缺省的实现,抛出例外,因为叶子对象没有这个功能, 32 | //或者子组件没有实现这个功能 33 | throw new UnsupportedOperationException("对象不支持这个功能"); 34 | } 35 | 36 | /** 37 | * 示意方法,子组件对象可能有的功能方法 38 | */ 39 | public abstract void operation(); 40 | } 41 | 42 | /** 43 | * 容器构件:组合对象,通常需要存储子对象,定义有子部件的部件行为,并实现在Component里面定义的与子部件有关的操作 44 | */ 45 | public class Composite extends Component { 46 | /** 47 | * 用来存储组合对象中包含的子组件对象 48 | */ 49 | private List childComponents = null; 50 | 51 | public void add(Component child) { 52 | //延迟初始化 53 | if (childComponents == null) { 54 | childComponents = new ArrayList(); 55 | } 56 | childComponents.add(child); 57 | } 58 | 59 | public void remove(Component child) { 60 | if (childComponents != null) { 61 | childComponents.remove(child); 62 | } 63 | } 64 | 65 | public Component getChild(int index) { 66 | if (childComponents != null){ 67 | if(index>=0 && index flies = new HashMap(); 43 | 44 | /** 45 | * 增加一个新的单纯享元对象到聚集中 46 | */ 47 | public void add(String key , Flyweight fly){ 48 | flies.put(key,fly); 49 | } 50 | 51 | /** 52 | * 外蕴状态作为参数传入到方法中 53 | */ 54 | @Override 55 | public void operation(String state) { 56 | Flyweight fly = null; 57 | for(Object o : flies.keySet()){ 58 | fly = flies.get(o); 59 | fly.operation(state); 60 | } 61 | } 62 | } 63 | 64 | /** 65 | * 享元工厂 66 | * 在享元模式中,客户端不能直接创建共享的享元对象实例,必须通过享元工厂来创建 67 | */ 68 | public class FlyweightFactory { 69 | 70 | private Map flies = new HashMap(); 71 | 72 | /** 73 | * 复合享元工厂方法 74 | */ 75 | public Flyweight factory(List compositeState){ 76 | ConcreteCompositeFlyweight compositeFly = new ConcreteCompositeFlyweight(); 77 | for(String state : compositeState){ 78 | compositeFly.add(state,this.factory(state)); 79 | } 80 | return compositeFly; 81 | } 82 | 83 | /** 84 | * 单纯享元工厂方法 85 | */ 86 | public Flyweight factory(String state){ 87 | //先从缓存中查找对象 88 | Flyweight fly = flies.get(state); 89 | if(fly == null){ 90 | //如果对象不存在则创建一个新的Flyweight对象 91 | fly = new ConcreteFlyweight(state); 92 | //把这个新的Flyweight对象添加到缓存中 93 | flies.put(state, fly); 94 | } 95 | return fly; 96 | } 97 | } -------------------------------------------------------------------------------- /src/com/designpattern/Prototype/deepcopy/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Prototype.deepcopy; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import com.designpattern.utils.DateFormatUtil; 7 | 8 | /** 9 | * 测试 10 | * @author Json<> 11 | */ 12 | public class Client { 13 | public static void main(String[] args) { 14 | List executors = new ArrayList(); 15 | executors.add("张三"); 16 | executors.add("李四"); 17 | 18 | Plan plan = new Plan(); 19 | plan.setName("重构前端登录界面"); 20 | plan.setLevel(1); 21 | plan.setStartdate(DateFormatUtil.stringToDate(DateFormatUtil.YYYYMMDD,"2017-08-07")); 22 | plan.setEnddate(DateFormatUtil.stringToDate(DateFormatUtil.YYYYMMDD,"2017-08-09")); 23 | plan.setExecutors(executors); 24 | 25 | Plan plan2 = plan.clone(); 26 | plan2.setName("后端接口改造"); 27 | plan2.setLevel(2); 28 | plan2.setStartdate(DateFormatUtil.stringToDate(DateFormatUtil.YYYYMMDD,"2017-08-10")); 29 | plan2.setEnddate(DateFormatUtil.stringToDate(DateFormatUtil.YYYYMMDD,"2017-08-12")); 30 | 31 | System.out.println("地址是否一样?"+(plan == plan2)); 32 | System.out.println("plan.getName() == plan2.getName() "+(plan.getName() == plan2.getName())); 33 | System.out.println("plan.getLevel() == plan2.getLevel() "+(plan.getLevel() == plan2.getLevel())); 34 | System.out.println("plan.getStartdate() == plan2.getStartdate() "+(plan.getStartdate() == plan2.getStartdate())); 35 | System.out.println("plan.getEnddate() == plan2.getEnddate() "+(plan.getEnddate() == plan2.getEnddate())); 36 | System.out.println("plan.getExecutors() == plan2.getExecutors() "+(plan.getExecutors() == plan2.getExecutors())); 37 | System.out.println("plan:"+plan.toString()); 38 | System.out.println("plan2:"+plan2.toString()); 39 | 40 | //plan任务比较重,在给plan添加一个人 41 | executors.add("王五"); 42 | plan.setExecutors(executors); 43 | 44 | System.out.println(); 45 | System.out.println("地址是否一样?"+(plan == plan2)); 46 | System.out.println("plan.getName() == plan2.getName() "+(plan.getName() == plan2.getName())); 47 | System.out.println("plan.getLevel() == plan2.getLevel() "+(plan.getLevel() == plan2.getLevel())); 48 | System.out.println("plan.getStartdate() == plan2.getStartdate() "+(plan.getStartdate() == plan2.getStartdate())); 49 | System.out.println("plan.getEnddate() == plan2.getEnddate() "+(plan.getEnddate() == plan2.getEnddate())); 50 | System.out.println("plan.getExecutors() == plan2.getExecutors() "+(plan.getExecutors() == plan2.getExecutors())); 51 | System.out.println("plan:"+plan.toString()); 52 | System.out.println("plan2:"+plan2.toString()); 53 | } 54 | } -------------------------------------------------------------------------------- /src/com/designpattern/Prototype/shallowcopy/Client.java: -------------------------------------------------------------------------------- 1 | package com.designpattern.Prototype.shallowcopy; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import com.designpattern.utils.DateFormatUtil; 7 | 8 | /** 9 | * 测试 10 | * @author Json<> 11 | */ 12 | public class Client { 13 | public static void main(String[] args) { 14 | List executors = new ArrayList(); 15 | executors.add("张三"); 16 | executors.add("李四"); 17 | 18 | Plan plan = new Plan(); 19 | plan.setName("重构前端登录界面"); 20 | plan.setLevel(1); 21 | plan.setStartdate(DateFormatUtil.stringToDate(DateFormatUtil.YYYYMMDD,"2017-08-07")); 22 | plan.setEnddate(DateFormatUtil.stringToDate(DateFormatUtil.YYYYMMDD,"2017-08-09")); 23 | plan.setExecutors(executors); 24 | 25 | Plan plan2 = plan.clone(); 26 | plan2.setName("后端接口改造"); 27 | plan2.setLevel(2); 28 | plan2.setStartdate(DateFormatUtil.stringToDate(DateFormatUtil.YYYYMMDD,"2017-08-10")); 29 | plan2.setEnddate(DateFormatUtil.stringToDate(DateFormatUtil.YYYYMMDD,"2017-08-12")); 30 | 31 | System.out.println("地址是否一样?"+(plan == plan2)); 32 | System.out.println("plan.getName() == plan2.getName() "+(plan.getName() == plan2.getName())); 33 | System.out.println("plan.getLevel() == plan2.getLevel() "+(plan.getLevel() == plan2.getLevel())); 34 | System.out.println("plan.getStartdate() == plan2.getStartdate() "+(plan.getStartdate() == plan2.getStartdate())); 35 | System.out.println("plan.getEnddate() == plan2.getEnddate() "+(plan.getEnddate() == plan2.getEnddate())); 36 | System.out.println("plan.getExecutors() == plan2.getExecutors() "+(plan.getExecutors() == plan2.getExecutors())); 37 | System.out.println("plan:"+plan.toString()); 38 | System.out.println("plan2:"+plan2.toString()); 39 | 40 | //plan任务比较重,在给plan添加一个人 41 | executors.add("王五"); 42 | plan.setExecutors(executors); 43 | 44 | System.out.println(); 45 | System.out.println("地址是否一样?"+(plan == plan2)); 46 | System.out.println("plan.getName() == plan2.getName() "+(plan.getName() == plan2.getName())); 47 | System.out.println("plan.getLevel() == plan2.getLevel() "+(plan.getLevel() == plan2.getLevel())); 48 | System.out.println("plan.getStartdate() == plan2.getStartdate() "+(plan.getStartdate() == plan2.getStartdate())); 49 | System.out.println("plan.getEnddate() == plan2.getEnddate() "+(plan.getEnddate() == plan2.getEnddate())); 50 | System.out.println("plan.getExecutors() == plan2.getExecutors() "+(plan.getExecutors() == plan2.getExecutors())); 51 | System.out.println("plan:"+plan.toString()); 52 | System.out.println("plan2:"+plan2.toString()); 53 | } 54 | } 55 | --------------------------------------------------------------------------------