diff --git a/adapter/src/main/java/com/iluwatar/App.java b/adapter/src/main/java/com/iluwatar/App.java index 54bd3c17fff2..b96a6be8c320 100644 --- a/adapter/src/main/java/com/iluwatar/App.java +++ b/adapter/src/main/java/com/iluwatar/App.java @@ -10,6 +10,13 @@ * The Adapter (GnomeEngineer) converts the interface of the target class * (GoblinGlider) into a suitable one expected by the client * (GnomeEngineeringManager). + * + * 适配器模式是为了实现两个不兼容的接口的兼容的模式。因此,当使用适配器的时候或许就是接口设计不合理的原因。。 + * 这个原因有很多,比如双方在这几功能模块的时候互相之间并没有合作,或者自己的设计思想没有照顾到以后的变化。也或者是 + * 双方就不属于统一体系架构下的东西。 + * 另外适配器也可以实现功能的多样化,在设计模块的时候无需过度考虑兼容性问题,使用适配器可以很好的解决设计与应用的问题。 + * 一个适配器同时拥有一方的接口,同时也是另一方接口的实现类。 + * * */ public class App { diff --git a/builder/src/main/java/com/iluwatar/App.java b/builder/src/main/java/com/iluwatar/App.java index 59348de6e84d..b0140ccf68d3 100644 --- a/builder/src/main/java/com/iluwatar/App.java +++ b/builder/src/main/java/com/iluwatar/App.java @@ -13,6 +13,13 @@ * constructor. After that additional configuration for the Hero object can be * done using the fluent HeroBuilder interface. When configuration is ready the * build method is called to receive the final Hero object. + * + * 构建者模式是一种对象初始化过程复杂的封装。如果一种对象的初始化参数过多,参数的变化也比较多可以考虑构建者模式。 + * 很典型的应用场景就是如果你的类有很多个参数,或者你的类的构造方法很多,可以使用它。 + * 这个设计模式的结构比较简单,静态内部类作为构建者类,然后被构建者的构造方法只需要一个构建者参数。 + * 然后初始化的过程从构建者对象中获取。因此,被构建者的构造方法无需公开。 + * 构建者类是被构建者对外开放的接口。因此,这个接口的设计尽量的人性化,简单易懂。最后使用一个build来构造出目标对象。 + * * */ public class App { diff --git a/builder/src/main/java/com/iluwatar/Hero.java b/builder/src/main/java/com/iluwatar/Hero.java index 8fb00667b612..6cc3233d305d 100644 --- a/builder/src/main/java/com/iluwatar/Hero.java +++ b/builder/src/main/java/com/iluwatar/Hero.java @@ -1,129 +1,125 @@ package com.iluwatar; /** - * * The class with many parameters. - * */ public class Hero { - private final Profession profession; - private final String name; - private final HairType hairType; - private final HairColor hairColor; - private final Armor armor; - private final Weapon weapon; - - public Profession getProfession() { - return profession; - } - - public String getName() { - return name; - } - - public HairType getHairType() { - return hairType; - } - - public HairColor getHairColor() { - return hairColor; - } - - public Armor getArmor() { - return armor; - } - - public Weapon getWeapon() { - return weapon; - } - - @Override - public String toString() { - - StringBuilder sb = new StringBuilder(); - sb.append("This is a "); - sb.append(profession); - sb.append(" named "); - sb.append(name); - if (hairColor != null || hairType != null) { - sb.append(" with "); - if (hairColor != null) { - sb.append(hairColor); - sb.append(" "); - } - if (hairType != null) { - sb.append(hairType); - sb.append(" "); - } - sb.append(hairType != HairType.BALD ? "hair" : "head"); - } - if (armor != null) { - sb.append(" wearing "); - sb.append(armor); - } - if (weapon != null) { - sb.append(" and wielding a "); - sb.append(weapon); - } - sb.append("."); - return sb.toString(); - } - - private Hero(HeroBuilder builder) { - this.profession = builder.profession; - this.name = builder.name; - this.hairColor = builder.hairColor; - this.hairType = builder.hairType; - this.weapon = builder.weapon; - this.armor = builder.armor; - } - - /** - * - * The builder class. - * - */ - public static class HeroBuilder { - - private final Profession profession; - private final String name; - private HairType hairType; - private HairColor hairColor; - private Armor armor; - private Weapon weapon; - - public HeroBuilder(Profession profession, String name) { - if (profession == null || name == null) { - throw new IllegalArgumentException( - "profession and name can not be null"); - } - this.profession = profession; - this.name = name; - } - - public HeroBuilder withHairType(HairType hairType) { - this.hairType = hairType; - return this; - } - - public HeroBuilder withHairColor(HairColor hairColor) { - this.hairColor = hairColor; - return this; - } - - public HeroBuilder withArmor(Armor armor) { - this.armor = armor; - return this; - } - - public HeroBuilder withWeapon(Weapon weapon) { - this.weapon = weapon; - return this; - } - - public Hero build() { - return new Hero(this); - } - } + private final Profession profession; + private final String name; + private final HairType hairType; + private final HairColor hairColor; + private final Armor armor; + private final Weapon weapon; + + public Profession getProfession() { + return profession; + } + + public String getName() { + return name; + } + + public HairType getHairType() { + return hairType; + } + + public HairColor getHairColor() { + return hairColor; + } + + public Armor getArmor() { + return armor; + } + + public Weapon getWeapon() { + return weapon; + } + + @Override + public String toString() { + + StringBuilder sb = new StringBuilder(); + sb.append("This is a "); + sb.append(profession); + sb.append(" named "); + sb.append(name); + if (hairColor != null || hairType != null) { + sb.append(" with "); + if (hairColor != null) { + sb.append(hairColor); + sb.append(" "); + } + if (hairType != null) { + sb.append(hairType); + sb.append(" "); + } + sb.append(hairType != HairType.BALD ? "hair" : "head"); + } + if (armor != null) { + sb.append(" wearing "); + sb.append(armor); + } + if (weapon != null) { + sb.append(" and wielding a "); + sb.append(weapon); + } + sb.append("."); + return sb.toString(); + } + + private Hero(HeroBuilder builder) { + this.profession = builder.profession; + this.name = builder.name; + this.hairColor = builder.hairColor; + this.hairType = builder.hairType; + this.weapon = builder.weapon; + this.armor = builder.armor; + } + + /** + * The builder class. + */ + public static class HeroBuilder { + + private final Profession profession; + private final String name; + private HairType hairType; + private HairColor hairColor; + private Armor armor; + private Weapon weapon; + + public HeroBuilder(Profession profession, String name) { + if (profession == null || name == null) { + throw new IllegalArgumentException( + "profession and name can not be null"); + } + this.profession = profession; + this.name = name; + } + + public HeroBuilder withHairType(HairType hairType) { + this.hairType = hairType; + return this; + } + + public HeroBuilder withHairColor(HairColor hairColor) { + this.hairColor = hairColor; + return this; + } + + public HeroBuilder withArmor(Armor armor) { + this.armor = armor; + return this; + } + + public HeroBuilder withWeapon(Weapon weapon) { + this.weapon = weapon; + return this; + } + + public Hero build() { + return new Hero(this); + } + } } diff --git a/callback/src/main/java/com/iluwatar/App.java b/callback/src/main/java/com/iluwatar/App.java index 2d79d8edf6c7..5bec308194bf 100644 --- a/callback/src/main/java/com/iluwatar/App.java +++ b/callback/src/main/java/com/iluwatar/App.java @@ -3,17 +3,18 @@ /** * Callback pattern is more native for functional languages where function is treated as first-class citizen. * Prior to Java8 can be simulated using simple (alike command) interfaces. + * 回调设计模式是一种过程式程序语言的设计。 + * 任务执行完成之后, */ public class App { - public static void main(String[] args) { - Task task = new SimpleTask(); - Callback callback = new Callback() { - @Override - public void call() { - System.out.println("I'm done now."); - } - }; - task.executeWith(callback); - } + public static void main(String[] args) { + Task task = new SimpleTask(); + task.executeWith(new Callback() { + @Override + public void call() { + System.out.println("I'm done now."); + } + }); + } } diff --git a/chain/src/main/java/com/iluwatar/App.java b/chain/src/main/java/com/iluwatar/App.java index 480ddc169f0b..3cacb504168d 100644 --- a/chain/src/main/java/com/iluwatar/App.java +++ b/chain/src/main/java/com/iluwatar/App.java @@ -1,22 +1,49 @@ package com.iluwatar; /** - * * Chain of Responsibility organizes request handlers (RequestHandler) into a * chain where each handler has a chance to act on the request on its turn. In * this example the king (OrcKing) makes requests and the military orcs * (OrcCommander, OrcOfficer, OrcSoldier) form the handler chain. - * + * 职责链模式重点在于职责,其组织结构是链式结构,使用者构建职责链条。 + * 原始的模式其实一长条的if else判断或者是switch case语句。本模式其实是将if else繁杂的判断分离出来形成单个的判断。 + * 模式的构成主要是一个抽象的职责类。这个类包含一个下级链条的引用及本级处理请求的方法。在这个方法里判断 + * 是否自己处理,或者留给下一级来处理。 + * 客户端使用的时候来创建链条结构。 + *

+ * 可以用做一个过滤器,不过话说一长条的if else本来就是一个过滤器。 */ public class App { - public static void main(String[] args) { + public static void main(String[] args) { - OrcKing king = new OrcKing(); - king.makeRequest(new Request(RequestType.DEFEND_CASTLE, "defend castle")); - king.makeRequest(new Request(RequestType.TORTURE_PRISONER, - "torture prisoner")); - king.makeRequest(new Request(RequestType.COLLECT_TAX, "collect tax")); + OrcKing king = new OrcKing(); + king.makeRequest(RequestType.DEFEND_CASTLE); + king.makeRequest(RequestType.TORTURE_PRISONER); + king.makeRequest(RequestType.COLLECT_TAX); - } + + } + + public static void switchPattern(RequestType type) { + switch (type) { + case DEFEND_CASTLE: + //直接处理不交给下一级 + break; + case TORTURE_PRISONER: + break; + case COLLECT_TAX: + break; + } + } + + public static void simplePattern(RequestType type) { + if (type == RequestType.DEFEND_CASTLE) { + + } else if (type == RequestType.TORTURE_PRISONER) { + + } else if (type == RequestType.COLLECT_TAX) { + + } + } } diff --git a/chain/src/main/java/com/iluwatar/OrcCommander.java b/chain/src/main/java/com/iluwatar/OrcCommander.java index 1f3b6169b95e..a252878a04be 100644 --- a/chain/src/main/java/com/iluwatar/OrcCommander.java +++ b/chain/src/main/java/com/iluwatar/OrcCommander.java @@ -2,21 +2,23 @@ public class OrcCommander extends RequestHandler { - public OrcCommander(RequestHandler handler) { - super(handler); - } + public OrcCommander(RequestHandler handler) { + super(handler); + } - @Override - public void handleRequest(Request req) { - if (req.getRequestType().equals(RequestType.DEFEND_CASTLE)) { - printHandling(req); - } else { - super.handleRequest(req); - } - } + @Override + public void handleRequest(Request req) { + //在这里处理上一级下发下来的请求,如果符合自己的责任则处理 + if (req.getRequestType().equals(RequestType.DEFEND_CASTLE)) { + printHandling(req); + } else { + //如果不符合,则留给下一级处理 + super.handleRequest(req); + } + } - @Override - public String toString() { - return "Orc commander"; - } + @Override + public String toString() { + return "Orc commander"; + } } diff --git a/chain/src/main/java/com/iluwatar/OrcKing.java b/chain/src/main/java/com/iluwatar/OrcKing.java index 0d3f38ba23cc..94f73cefaa61 100644 --- a/chain/src/main/java/com/iluwatar/OrcKing.java +++ b/chain/src/main/java/com/iluwatar/OrcKing.java @@ -1,24 +1,23 @@ package com.iluwatar; /** - * * Makes requests that are handled by the chain. - * */ public class OrcKing { - RequestHandler chain; + RequestHandler chain; - public OrcKing() { - buildChain(); - } + public OrcKing() { + buildChain(); + } - private void buildChain() { - chain = new OrcCommander(new OrcOfficer(new OrcSoldier(null))); - } + private void buildChain() { + //创建职责链结构,从左到右依次处理请求。最后一级的下一级别是空的。 + chain = new OrcCommander(new OrcOfficer(new OrcSoldier(null))); + } - public void makeRequest(Request req) { - chain.handleRequest(req); - } + public void makeRequest(RequestType req) { + chain.handleRequest(req); + } } diff --git a/chain/src/main/java/com/iluwatar/OrcOfficer.java b/chain/src/main/java/com/iluwatar/OrcOfficer.java index 9a9030eca1b0..fd715fc17a3f 100644 --- a/chain/src/main/java/com/iluwatar/OrcOfficer.java +++ b/chain/src/main/java/com/iluwatar/OrcOfficer.java @@ -2,22 +2,22 @@ public class OrcOfficer extends RequestHandler { - public OrcOfficer(RequestHandler handler) { - super(handler); - } + public OrcOfficer(RequestHandler handler) { + super(handler); + } - @Override - public void handleRequest(Request req) { - if (req.getRequestType().equals(RequestType.TORTURE_PRISONER)) { - printHandling(req); - } else { - super.handleRequest(req); - } - } + @Override + public void handleRequest(RequestType req) { + if (req == RequestType.TORTURE_PRISONER) { + printHandling(req); + } else { + super.handleRequest(req); + } + } - @Override - public String toString() { - return "Orc officer"; - } + @Override + public String toString() { + return "Orc officer"; + } } diff --git a/chain/src/main/java/com/iluwatar/OrcSoldier.java b/chain/src/main/java/com/iluwatar/OrcSoldier.java index 0e5a5a603477..f84fe1b5c3ce 100644 --- a/chain/src/main/java/com/iluwatar/OrcSoldier.java +++ b/chain/src/main/java/com/iluwatar/OrcSoldier.java @@ -2,21 +2,21 @@ public class OrcSoldier extends RequestHandler { - public OrcSoldier(RequestHandler handler) { - super(handler); - } + public OrcSoldier(RequestHandler handler) { + super(handler); + } - @Override - public void handleRequest(Request req) { - if (req.getRequestType().equals(RequestType.COLLECT_TAX)) { - printHandling(req); - } else { - super.handleRequest(req); - } - } + @Override + public void handleRequest(RequestType req) { + if (req == RequestType.COLLECT_TAX) { + printHandling(req); + } else { + super.handleRequest(req); + } + } - @Override - public String toString() { - return "Orc soldier"; - } + @Override + public String toString() { + return "Orc soldier"; + } } diff --git a/chain/src/main/java/com/iluwatar/Request.java b/chain/src/main/java/com/iluwatar/Request.java index 00cd239723d1..c82949abe9ac 100644 --- a/chain/src/main/java/com/iluwatar/Request.java +++ b/chain/src/main/java/com/iluwatar/Request.java @@ -2,32 +2,22 @@ public class Request { - private String requestDescription; - private RequestType requestType; + private RequestType requestType; - public Request(RequestType requestType, String requestDescription) { - this.setRequestType(requestType); - this.setRequestDescription(requestDescription); - } + public Request(RequestType requestType) { + this.setRequestType(requestType); + } - public String getRequestDescription() { - return requestDescription; - } + public RequestType getRequestType() { + return requestType; + } - public void setRequestDescription(String requestDescription) { - this.requestDescription = requestDescription; - } + public void setRequestType(RequestType requestType) { + this.requestType = requestType; + } - public RequestType getRequestType() { - return requestType; - } - - public void setRequestType(RequestType requestType) { - this.requestType = requestType; - } - - @Override - public String toString() { - return getRequestDescription(); - } + @Override + public String toString() { + return requestType.toString(); + } } diff --git a/chain/src/main/java/com/iluwatar/RequestHandler.java b/chain/src/main/java/com/iluwatar/RequestHandler.java index 19dc33fcec8f..ca5b9d9a96d8 100644 --- a/chain/src/main/java/com/iluwatar/RequestHandler.java +++ b/chain/src/main/java/com/iluwatar/RequestHandler.java @@ -2,22 +2,30 @@ public abstract class RequestHandler { - private RequestHandler next; + /** + * 下一级的引用 + */ + private RequestHandler next; - public RequestHandler(RequestHandler next) { - this.next = next; - } + public RequestHandler(RequestHandler next) { + this.next = next; + } - public void handleRequest(Request req) { - if (next != null) { - next.handleRequest(req); - } - } + /** + * 处理请求的默认方法,默认本级不处理,由下一级处理。 + * + * @param req + */ + public void handleRequest(RequestType req) { + if (next != null) { + next.handleRequest(req); + } + } - protected void printHandling(Request req) { - System.out.println(this + " handling request \"" + req + "\""); - } + protected void printHandling(RequestType req) { + System.out.println(this + " handling request \"" + req.toString() + "\""); + } - @Override - public abstract String toString(); + @Override + public abstract String toString(); } diff --git a/chain/src/main/java/com/iluwatar/RequestType.java b/chain/src/main/java/com/iluwatar/RequestType.java index 02176a088857..bd3d39758004 100644 --- a/chain/src/main/java/com/iluwatar/RequestType.java +++ b/chain/src/main/java/com/iluwatar/RequestType.java @@ -2,6 +2,15 @@ public enum RequestType { - DEFEND_CASTLE, TORTURE_PRISONER, COLLECT_TAX + DEFEND_CASTLE("defend castle"), TORTURE_PRISONER("torture prisoner"), COLLECT_TAX("collect tax"); + String name; + RequestType(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } } diff --git a/command/src/main/java/com/iluwatar/App.java b/command/src/main/java/com/iluwatar/App.java index 382ce32ce643..ccd9c8c00c17 100644 --- a/command/src/main/java/com/iluwatar/App.java +++ b/command/src/main/java/com/iluwatar/App.java @@ -5,7 +5,8 @@ * In Command pattern actions are objects that can be executed and undone. * * In this example the commands are the spells cast by the wizard on the goblin. - * + * 在命令模式中,行为是一类可以被执行和撤销的对象。变化的方向是行为,而执行人是不变的。 + * 在应用中,如果变化的部分都是动词可以考虑使用命令设计模式。将变化的动作封装为对象动态调用是命令设计模式的精髓。 */ public class App { diff --git a/null-object/src/main/java/com/iluwatar/App.java b/null-object/src/main/java/com/iluwatar/App.java index 4bba5af29f22..f2b2e57d8be1 100644 --- a/null-object/src/main/java/com/iluwatar/App.java +++ b/null-object/src/main/java/com/iluwatar/App.java @@ -1,32 +1,39 @@ package com.iluwatar; /** - * * Null Object pattern replaces null values with neutral objects. * Many times this simplifies algorithms since no extra null checks * are needed. - * + *

* In this example we build a binary tree where the nodes are either * normal or Null Objects. No null values are used in the tree making * the traversal easy. * + * 空设计模式主要是应对频繁的非空判断。 + * 他的做法是将Null也视为一个对象,只不过这个对象的每个方法都是空的,方法的返回值也都是默认的。 + * 这样在被调用的时候就不需要做非空判断,如果这个对象是空对象,则会执行空方法而不是报空指针。 + * 一下的例子演示了在遍历一棵树的时候,由于需要不断的判断左右是否为空,因此将空也作为一个节点。 + * 这样就避免了在遍历的时候判空。 */ -public class App -{ - public static void main( String[] args ) { - - Node root = new NodeImpl("1", - new NodeImpl("11", - new NodeImpl("111", - new NullNode(), - new NullNode()), - new NullNode()), - new NodeImpl("12", - new NullNode(), - new NodeImpl("122", - new NullNode(), - new NullNode()))); +public class App { + public static void main(String[] args) { +/** + * 1 + * 11 12 + * 111 122 + */ + Node root = new NodeImpl("1", + new NodeImpl("11", + new NodeImpl("111", + new NullNode(), + new NullNode()), + new NullNode()), + new NodeImpl("12", + new NullNode(), + new NodeImpl("122", + new NullNode(), + new NullNode()))); - root.walk(); + root.walk(); } } diff --git a/null-object/src/main/java/com/iluwatar/Node.java b/null-object/src/main/java/com/iluwatar/Node.java index 1bb94927f110..7e69d77dfddf 100644 --- a/null-object/src/main/java/com/iluwatar/Node.java +++ b/null-object/src/main/java/com/iluwatar/Node.java @@ -1,15 +1,17 @@ package com.iluwatar; /** - * * Interface for binary tree node. - * */ public interface Node { - String getName(); - int getTreeSize(); - Node getLeft(); - Node getRight(); - void walk(); + String getName(); + + int getTreeSize(); + + Node getLeft(); + + Node getRight(); + + void walk(); } diff --git a/null-object/src/main/java/com/iluwatar/NodeImpl.java b/null-object/src/main/java/com/iluwatar/NodeImpl.java index dbd5a7eca988..5a4e359b4841 100644 --- a/null-object/src/main/java/com/iluwatar/NodeImpl.java +++ b/null-object/src/main/java/com/iluwatar/NodeImpl.java @@ -1,50 +1,48 @@ package com.iluwatar; /** - * * Implementation for binary tree's normal nodes. - * */ public class NodeImpl implements Node { - private final String name; - private final Node left; - private final Node right; - - public NodeImpl(String name, Node left, Node right) { - this.name = name; - this.left = left; - this.right = right; - } - - @Override - public int getTreeSize() { - return 1 + left.getTreeSize() + right.getTreeSize(); - } - - @Override - public Node getLeft() { - return left; - } - - @Override - public Node getRight() { - return right; - } - - @Override - public String getName() { - return name; - } - - @Override - public void walk() { - System.out.println(name); - if (left.getTreeSize() > 0) { - left.walk(); - } - if (right.getTreeSize() > 0) { - right.walk(); - } - } + private final String name; + private final Node left; + private final Node right; + + public NodeImpl(String name, Node left, Node right) { + this.name = name; + this.left = left; + this.right = right; + } + + @Override + public int getTreeSize() { + return 1 + left.getTreeSize() + right.getTreeSize(); + } + + @Override + public Node getLeft() { + return left; + } + + @Override + public Node getRight() { + return right; + } + + @Override + public String getName() { + return name; + } + + @Override + public void walk() { + System.out.println(name); + if (left.getTreeSize() > 0) { + left.walk(); + } + if (right.getTreeSize() > 0) { + right.walk(); + } + } }