diff --git a/models/designPattern/AbstractFactory.Json b/models/designPattern/AbstractFactory.Json new file mode 100644 index 0000000..6007b64 --- /dev/null +++ b/models/designPattern/AbstractFactory.Json @@ -0,0 +1,10 @@ +{ + "relations": [], + "transfer": { + "src": "ConcreteCastle", + "dst": "App", + "data": { "type": "String", "name": "description" }, + "style": "PULL", + "multiplicity": "1:1" + } +} \ No newline at end of file diff --git a/models/designPattern/Adapter.Json b/models/designPattern/Adapter.Json new file mode 100644 index 0000000..9cb8afd --- /dev/null +++ b/models/designPattern/Adapter.Json @@ -0,0 +1,10 @@ +{ + "relations": [], + "transfer": { + "src": "FishingBoat", + "dst": "Captain", + "data": { "type": "String", "name": "data" }, + "style": "PULL", + "multiplicity": "1:1" + } +} \ No newline at end of file diff --git a/models/designPattern/Bridge.Json b/models/designPattern/Bridge.Json new file mode 100644 index 0000000..bfab65f --- /dev/null +++ b/models/designPattern/Bridge.Json @@ -0,0 +1,10 @@ +{ + "relations": [], + "transfer": { + "src": "ConcreteEnchantment", + "dst": "ConcreteWeapon", + "data": { "type": "String", "name": "data" }, + "style": "PULL", + "multiplicity": "1:1" + } +} \ No newline at end of file diff --git a/models/designPattern/Builder.Json b/models/designPattern/Builder.Json new file mode 100644 index 0000000..11f180d --- /dev/null +++ b/models/designPattern/Builder.Json @@ -0,0 +1,10 @@ +{ + "relations": [], + "transfer": { + "src": "Builder", + "dst": "Main", + "data": { "type": "String", "name": "data" }, + "style": "PULL", + "multiplicity": "1:1" + } +} \ No newline at end of file diff --git a/models/designPattern/Command.Json b/models/designPattern/Command.Json new file mode 100644 index 0000000..f0641c9 --- /dev/null +++ b/models/designPattern/Command.Json @@ -0,0 +1,10 @@ +{ + "relations": [], + "transfer": { + "src": "Wizard.{Stack}", + "dst": "Goblin.Size", + "data": { "type": "String", "name": "data" }, + "style": "PUSH", + "multiplicity": "1:1" + } +} \ No newline at end of file diff --git a/models/designPattern/Decorator.Json b/models/designPattern/Decorator.Json new file mode 100644 index 0000000..76fd619 --- /dev/null +++ b/models/designPattern/Decorator.Json @@ -0,0 +1,10 @@ +{ + "relations": [], + "transfer": { + "src": "SimpleTroll", + "dst": "Client", + "data": { "type": "String", "name": "data" }, + "style": "PULL", + "multiplicity": "1:1" + } +} \ No newline at end of file diff --git a/models/designPattern/Iterator.Json b/models/designPattern/Iterator.Json new file mode 100644 index 0000000..5997071 --- /dev/null +++ b/models/designPattern/Iterator.Json @@ -0,0 +1,10 @@ +{ + "relations": [], + "transfer": { + "src": "TreasureChest", + "dst": "Client", + "data": { "type": "String", "name": "data" }, + "style": "PULL", + "multiplicity": "1:1" + } +} \ No newline at end of file diff --git a/models/designPattern/Proxy.Json b/models/designPattern/Proxy.Json new file mode 100644 index 0000000..5b9af0b --- /dev/null +++ b/models/designPattern/Proxy.Json @@ -0,0 +1,10 @@ +{ + "relations": [], + "transfer": { + "src": "Client", + "dst": "IvoryTower", + "data": { "type": "Wizard", "name": "wizard" }, + "style": "PUSH", + "multiplicity": "1:1" + } +} \ No newline at end of file diff --git a/models/designPattern/State.Json b/models/designPattern/State.Json new file mode 100644 index 0000000..31c38c1 --- /dev/null +++ b/models/designPattern/State.Json @@ -0,0 +1,10 @@ +{ + "relations": [], + "transfer": { + "src": "main", + "dst": "ConcreteState", + "data": { "type": "String", "name": "data" }, + "style": "PUSH", + "multiplicity": "1:1" + } +} \ No newline at end of file diff --git a/models/designPattern/Strategy.Json b/models/designPattern/Strategy.Json new file mode 100644 index 0000000..9d70b0a --- /dev/null +++ b/models/designPattern/Strategy.Json @@ -0,0 +1,10 @@ +{ + "relations": [], + "transfer": { + "src": "main.dragonSlayer", + "dst": "main.{ConcreteStrategy}", + "data": { "type": "String", "name": "data" }, + "style": "PUSH", + "multiplicity": "1:1" + } +} \ No newline at end of file diff --git a/models/designPattern/Visitor@Editing.Json b/models/designPattern/Visitor@Editing.Json new file mode 100644 index 0000000..88ccd09 --- /dev/null +++ b/models/designPattern/Visitor@Editing.Json @@ -0,0 +1,10 @@ +{ + "relations": [], + "transfer": { + "src": "", + "dst": "", + "data": { "type": "String", "name": "visitor" }, + "style": "PULL", + "multiplicity": "1:1" + } +} \ No newline at end of file diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 10d74b3..f97ac6f 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -2,6 +2,7 @@ import java.util.List; import designPatternExtensions.*; +import designPatternExtensions.designPattern.Adapter; import generators.ASTGenerator; import models.objectOrientedTransfer.*; @@ -35,9 +36,7 @@ DependencyInversion di = new DependencyInversion(company, new InterfaceNode(company, "ICompany"), customer); design.addDependencyInversion(di); - - System.out.println(ASTGenerator.generate(Prototype.create())); -// System.out.println(ASTGenerator.generate(design)); + System.out.println(ASTGenerator.generate(design)); } catch (IllegalRelationException e) { e.printStackTrace(); } diff --git a/src/main/java/designPatternExtensions/AbstractFactory.java b/src/main/java/designPatternExtensions/AbstractFactory.java deleted file mode 100644 index 1ed3ef5..0000000 --- a/src/main/java/designPatternExtensions/AbstractFactory.java +++ /dev/null @@ -1,33 +0,0 @@ -package designPatternExtensions; -import models.objectOrientedTransfer.*; -import java.util.ArrayList; - -//メモ -//https://github.com/iluwatar/java-design-patterns/tree/master/abstract-factory - -public class AbstractFactory { - - public static DataTransferDesign create() throws IllegalRelationException { - ObjectNode elfCastle = new ObjectNode("ElfCastle"); - ObjectNode app = new ObjectNode("App"); - ObjectNode data = new ObjectNode("String"); - - Relation transferRelation = new Relation(elfCastle, app, MultiplicityValue.OneToOne); - DataTransferContext context = new DataTransferContext( - new ArrayList<>(), transferRelation, data, "description", PushPullValue.PULL - ); - - DataTransferDesign design = new DataTransferDesign(context); - - ObjectNode elfKingdomFactory = new ObjectNode("ElfKingdomFactory"); - MediatorInsertion mi = new MediatorInsertion(app, elfCastle, elfKingdomFactory); - design.addMediatorInsertion(mi); - - DependencyInversion di = new DependencyInversion( - elfKingdomFactory, new InterfaceNode(elfKingdomFactory, "KingdomFactory"), app - ); - design.addDependencyInversion(di); - - return design; - } -} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/Adapter.java b/src/main/java/designPatternExtensions/Adapter.java deleted file mode 100644 index 85110ed..0000000 --- a/src/main/java/designPatternExtensions/Adapter.java +++ /dev/null @@ -1,26 +0,0 @@ -package designPatternExtensions; - -import models.objectOrientedTransfer.*; - -public class Adapter { - - public static DataTransferDesign create() throws IllegalRelationException { - ObjectNode fishingBoat = new ObjectNode("FishingBoat"); - ObjectNode captain = new ObjectNode("Captain"); - ObjectNode data = new ObjectNode("String"); - - Relation transferRelation = new Relation(fishingBoat, captain, MultiplicityValue.OneToOne); - DataTransferContext context = new DataTransferContext(new java.util.ArrayList<>(), transferRelation, data, "data", PushPullValue.PULL); - - DataTransferDesign design = new DataTransferDesign(context); - - ObjectNode adapter = new ObjectNode("FishingBoatAdapter"); - MediatorInsertion mi = new MediatorInsertion(captain, fishingBoat, adapter); - design.addMediatorInsertion(mi); - - DependencyInversion di = new DependencyInversion(adapter, new InterfaceNode(adapter, "RowingBoat"), captain); - design.addDependencyInversion(di); - - return design; - } -} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/Bridge.java b/src/main/java/designPatternExtensions/Bridge.java deleted file mode 100644 index 16ec812..0000000 --- a/src/main/java/designPatternExtensions/Bridge.java +++ /dev/null @@ -1,31 +0,0 @@ -package designPatternExtensions; - -import models.objectOrientedTransfer.*; - -import java.util.ArrayList; - -//メモ -//https://github.com/iluwatar/java-design-patterns/tree/master/bridge - -public class Bridge { - - public static DataTransferDesign create() throws IllegalRelationException { - ObjectNode sword = new ObjectNode("Sword"); - ObjectNode soulEatingEnchantment = new ObjectNode("SoulEatingEnchantment"); - ObjectNode data = new ObjectNode("String"); - - Relation transferRelation = new Relation(sword, soulEatingEnchantment, MultiplicityValue.OneToOne); - DataTransferContext context = new DataTransferContext( - new ArrayList<>(), transferRelation, data, "data", PushPullValue.PUSH); - - DataTransferDesign design = new DataTransferDesign(context); - - DependencyInversion di1 = new DependencyInversion(sword, new InterfaceNode(sword, "Weapon")); - design.addDependencyInversion(di1); - - DependencyInversion di2 = new DependencyInversion(soulEatingEnchantment, new InterfaceNode(soulEatingEnchantment, "Enchantment"), sword); - design.addDependencyInversion(di2); - - return design; - } -} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/Builder.java b/src/main/java/designPatternExtensions/Builder.java deleted file mode 100644 index 21ba392..0000000 --- a/src/main/java/designPatternExtensions/Builder.java +++ /dev/null @@ -1,24 +0,0 @@ -package designPatternExtensions; - -import models.objectOrientedTransfer.*; - -import java.util.ArrayList; - -//メモ -//https://github.com/iluwatar/java-design-patterns/tree/master/builder -//メソッドチェーンがない - -public class Builder { - public static DataTransferDesign create() throws IllegalRelationException { - ObjectNode client = new ObjectNode("Client"); - ObjectNode builder = new ObjectNode("Builder"); - ObjectNode data = new ObjectNode("HairColor"); - - Relation transferRelation = new Relation(client, builder, MultiplicityValue.OneToOne); - DataTransferContext context = new DataTransferContext( - new ArrayList<>(), transferRelation, data, "hairColor", PushPullValue.PUSH - ); - - return new DataTransferDesign(context); - } -} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/Command.java b/src/main/java/designPatternExtensions/Command.java deleted file mode 100644 index 420fed3..0000000 --- a/src/main/java/designPatternExtensions/Command.java +++ /dev/null @@ -1,40 +0,0 @@ -package designPatternExtensions; - -import models.objectOrientedTransfer.*; -import java.util.ArrayList; -import java.util.List; - -//メモ -//https://github.com/iluwatar/java-design-patterns/tree/master/command - -public class Command { - - public static DataTransferDesign create() throws IllegalRelationException { - List srcEdges = new ArrayList<>(); - List dstEdges = new ArrayList<>(); - ObjectNode main = new ObjectNode("Main"); - ObjectNode wizard = new ObjectNode("Wizard"); - ObjectNode spell = new ObjectNode("ChangeSizeSpell"); - ObjectNode data = new ObjectNode("Goblin"); - - srcEdges.add(new ReferenceEdge(main, wizard, "wizard")); - dstEdges.add(new ReferenceEdge(main, spell, "spell", "Integer")); - - List relations = new ArrayList<>(); - relations.add(new Relation(main, dstEdges, MultiplicityValue.OneToOne)); - Relation transferRelation = new Relation(srcEdges, dstEdges, MultiplicityValue.OneToOne); - - DataTransferContext context = new DataTransferContext( - relations, transferRelation, data, "goblin", PushPullValue.PUSH - ); - - DataTransferDesign design = new DataTransferDesign(context); - - DependencyInversion di = new DependencyInversion( - spell, new InterfaceNode(spell, "Runnable"), wizard - ); - design.addDependencyInversion(di); - - return design; - } -} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/Decorator.java b/src/main/java/designPatternExtensions/Decorator.java deleted file mode 100644 index 0bf3920..0000000 --- a/src/main/java/designPatternExtensions/Decorator.java +++ /dev/null @@ -1,34 +0,0 @@ -package designPatternExtensions; - -import models.objectOrientedTransfer.*; - -//https://github.com/iluwatar/java-design-patterns/tree/master/decorator -// - -public class Decorator { - public static DataTransferDesign create() throws IllegalRelationException { - ObjectNode simpleTroll = new ObjectNode("SimpleTroll"); - ObjectNode client = new ObjectNode("Client"); - ObjectNode data = new ObjectNode("Int"); - - Relation transferRelation = new Relation(simpleTroll, client, MultiplicityValue.OneToOne); - DataTransferContext context = new DataTransferContext( - new java.util.ArrayList<>(), transferRelation, data, "attackPower", PushPullValue.PULL - ); - - DataTransferDesign design = new DataTransferDesign(context); - - ObjectNode clubbedTroll = new ObjectNode("ClubbedTroll"); - MediatorInsertion mi = new MediatorInsertion(client, simpleTroll, clubbedTroll); - design.addMediatorInsertion(mi); - - InterfaceNode troll = new InterfaceNode(clubbedTroll, "Troll"); - DependencyInversion di1 = new DependencyInversion(clubbedTroll, troll, client); - design.addDependencyInversion(di1); - - DependencyInversion di2 = new DependencyInversion(simpleTroll, troll); - design.addDependencyInversion(di2); - - return design; - } -} diff --git a/src/main/java/designPatternExtensions/DependencyInversion.java b/src/main/java/designPatternExtensions/DependencyInversion.java index e59a1d5..e007a9d 100644 --- a/src/main/java/designPatternExtensions/DependencyInversion.java +++ b/src/main/java/designPatternExtensions/DependencyInversion.java @@ -7,12 +7,14 @@ private InterfaceNode interfaceNode; private ObjectNode targetSrc; + // Reverse all dependencies to the destination ObjectNode public DependencyInversion(ObjectNode dst, InterfaceNode interfaceNode) { this.dst = dst; this.interfaceNode = interfaceNode; this.targetSrc = null; } + // Reverse the dependency for a single ObjectNode public DependencyInversion(ObjectNode dst, InterfaceNode interfaceNode, ObjectNode targetSrc) { this.dst = dst; this.interfaceNode = interfaceNode; diff --git a/src/main/java/designPatternExtensions/DesignPatternMemo b/src/main/java/designPatternExtensions/DesignPatternMemo deleted file mode 100644 index ee3fae6..0000000 --- a/src/main/java/designPatternExtensions/DesignPatternMemo +++ /dev/null @@ -1,25 +0,0 @@ -AbstractFactory 〇? -Builder ? -FactoryMethod -Prototype ? -Singleton ? - -Adapter 〇 完璧に再現できている -Bridge 〇? -Composite -Decorator 〇? -Facade -Flyweight -Proxy 〇? - -ChainOfResponsibility -Command ? -Interpreter -Iterator ? -Mediator -Memento △ 複数のデータ転送をまとめて扱えるようにしないとできない -Observer × OneToManyが必要 -State ? -Strategy 〇 同じ役割の実装クラスを複数用意できないが無視する -TemplateMethod ? -Visitor × 制御の委譲をできるようにする必要がある & OneToManyが必要 \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/Iterator.java b/src/main/java/designPatternExtensions/Iterator.java deleted file mode 100644 index 916c864..0000000 --- a/src/main/java/designPatternExtensions/Iterator.java +++ /dev/null @@ -1,36 +0,0 @@ -package designPatternExtensions; -import models.objectOrientedTransfer.*; - -import java.util.ArrayList; -//メモ -//中身の構造を隠したまま、順番にデータを取り出す -//アイテムのタイプをifで回さなくても -//https://github.com/iluwatar/java-design-patterns/tree/master/iterator - - -public class Iterator { - - public static DataTransferDesign create() throws IllegalRelationException { - ObjectNode treasureChest = new ObjectNode("TreasureChest"); - ObjectNode client = new ObjectNode("Client"); - ObjectNode item = new ObjectNode("Item"); - - Relation transferRelation = new Relation(treasureChest, client, MultiplicityValue.OneToOne); - DataTransferContext context = new DataTransferContext( - new ArrayList<>(), transferRelation, item, "item", PushPullValue.PULL - ); - - DataTransferDesign design = new DataTransferDesign(context); - - ObjectNode iterator = new ObjectNode("TreasureChestItemIterator"); - MediatorInsertion mi = new MediatorInsertion(client, treasureChest, iterator); - design.addMediatorInsertion(mi); - - DependencyInversion di = new DependencyInversion( - iterator, new InterfaceNode(iterator, "Iterator"), client - ); - design.addDependencyInversion(di); - - return design; - } -} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/Memento.java b/src/main/java/designPatternExtensions/Memento.java deleted file mode 100644 index 6700507..0000000 --- a/src/main/java/designPatternExtensions/Memento.java +++ /dev/null @@ -1,33 +0,0 @@ -package designPatternExtensions; - -import models.objectOrientedTransfer.*; - -import java.util.ArrayList; - -//https://github.com/iluwatar/java-design-patterns/tree/master/memento -//複数のデータ転送をまとめて扱えるようにしないとできない → 一方向でもできればいったんOK - -public class Memento { - public static DataTransferDesign create() throws IllegalRelationException { - ObjectNode star = new ObjectNode("Star"); - ObjectNode states = new ObjectNode("States"); - ObjectNode starMementoInternal = new ObjectNode("StarMementoInternal"); - - Relation transferRelation = new Relation(star, states, MultiplicityValue.OneToOne); - DataTransferContext context = new DataTransferContext( - new ArrayList<>(), transferRelation, starMementoInternal, "memento", PushPullValue.PULL - ); - - DataTransferDesign design = new DataTransferDesign(context); - - MediatorInsertion client = new MediatorInsertion(star, states, new ObjectNode("Client")); - design.addMediatorInsertion(client); - - DependencyInversion di = new DependencyInversion( - starMementoInternal, new InterfaceNode(starMementoInternal, "StarMemento"), states - ); - design.addDependencyInversion(di); - - return design; - } -} diff --git a/src/main/java/designPatternExtensions/ModelLoader.java b/src/main/java/designPatternExtensions/ModelLoader.java new file mode 100644 index 0000000..3a77a42 --- /dev/null +++ b/src/main/java/designPatternExtensions/ModelLoader.java @@ -0,0 +1,31 @@ +package parser; + +import models.objectOrientedTransfer.DataTransferContext; +import models.objectOrientedTransfer.DataTransferDesign; +import models.objectOrientedTransfer.IllegalRelationException; +import parser.exceptions.ExpectedArrayValue; +import parser.exceptions.ExpectedJsonValue; +import parser.exceptions.ExpectedStringValue; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; + +public class ModelLoader { + + public static DataTransferDesign load(String path) { + File file = new File(path); + try { + Parser parser = new Parser(new BufferedReader(new FileReader(file))); + Value jsonValue = parser.getValue(); + DataTransferContext context = new DataTransferContext(jsonValue); + return new DataTransferDesign(context); + + } catch (java.io.FileNotFoundException | ExpectedArrayValue + | ExpectedStringValue | ExpectedJsonValue e) { + throw new RuntimeException("Failed to load model: " + path, e); + } catch (IllegalRelationException e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/Observer.java b/src/main/java/designPatternExtensions/Observer.java deleted file mode 100644 index 6d8ceed..0000000 --- a/src/main/java/designPatternExtensions/Observer.java +++ /dev/null @@ -1,56 +0,0 @@ -package designPatternExtensions; -import models.objectOrientedTransfer.*; -import java.util.ArrayList; -import java.util.List; - -//https://github.com/iluwatar/java-design-patterns/tree/master/observer -//依存性の逆転構造は再現できているが、OneToManyが使えないから再現できない? -// SubjectがObserverを記憶し(ManyToOne?PULL?)→DesignCraftが最初に登録してるものとする -// Clientから更新されたときに、Observerに通知する(OneToMany?PUSH?)→これが正解 -// - -public class Observer { - public static DataTransferDesign create() throws IllegalRelationException { - ObjectNode weather = new ObjectNode("Weather"); - ObjectNode orcs = new ObjectNode("Orcs"); - ObjectNode hobbits = new ObjectNode("Hobbits"); - ObjectNode data = new ObjectNode("WeatherType"); - - Relation transferRelation = new Relation(weather, orcs, MultiplicityValue.OneToOne); - DataTransferContext context = new DataTransferContext( - new ArrayList<>(), transferRelation, data, "currentWeather", PushPullValue.PUSH - ); - - DataTransferDesign design = new DataTransferDesign(context); - - DependencyInversion di1 = new DependencyInversion(orcs, new InterfaceNode(orcs, "WeatherObserver"), weather); - DependencyInversion di2 = new DependencyInversion(hobbits, new InterfaceNode(hobbits, "WeatherObserver"), weather); - design.addDependencyInversion(di1); - design.addDependencyInversion(di2); - - return design; - } -} - -//public class Observer { -// public static DataTransferDesign create() throws IllegalRelationException { -// ObjectNode weather = new ObjectNode("Weather"); -// ObjectNode orcs = new ObjectNode("Orcs"); -// ObjectNode hobbits = new ObjectNode("Hobbits"); -// ObjectNode data = new ObjectNode("WeatherType"); -// -// Relation transferRelation = new Relation(weather, orcs, MultiplicityValue.OneToOne); -// DataTransferContext context = new DataTransferContext( -// new ArrayList<>(), transferRelation, data, "currentWeather", PushPullValue.PUSH -// ); -// -// DataTransferDesign design = new DataTransferDesign(context); -// -// DependencyInversion di1 = new DependencyInversion(orcs, new InterfaceNode(orcs, "WeatherObserver"), weather); -// DependencyInversion di2 = new DependencyInversion(hobbits, new InterfaceNode(hobbits, "WeatherObserver"), weather); -// design.addDependencyInversion(di1); -// design.addDependencyInversion(di2); -// -// return design; -// } -//} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/Prototype.java b/src/main/java/designPatternExtensions/Prototype.java deleted file mode 100644 index e3ac7c9..0000000 --- a/src/main/java/designPatternExtensions/Prototype.java +++ /dev/null @@ -1,30 +0,0 @@ -package designPatternExtensions; - -import models.objectOrientedTransfer.*; - -import java.util.ArrayList; - -//メモ -//https://github.com/iluwatar/java-design-patterns/tree/master/prototype - -public class Prototype { - public static DataTransferDesign create() throws IllegalRelationException { - ObjectNode heroFactoryImpl = new ObjectNode("HeroFactoryImpl"); - ObjectNode client = new ObjectNode("Client"); - ObjectNode beast = new ObjectNode("Beast"); - - Relation transferRelation = new Relation(heroFactoryImpl, client, MultiplicityValue.OneToOne); - DataTransferContext context = new DataTransferContext( - new ArrayList<>(), transferRelation, beast, "beast", PushPullValue.PULL - ); - - DataTransferDesign design = new DataTransferDesign(context); - - DependencyInversion di = new DependencyInversion( - heroFactoryImpl, new InterfaceNode(heroFactoryImpl, "HeroFactory"), client - ); - design.addDependencyInversion(di); - - return design; - } -} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/Proxy.java b/src/main/java/designPatternExtensions/Proxy.java deleted file mode 100644 index 8dc3243..0000000 --- a/src/main/java/designPatternExtensions/Proxy.java +++ /dev/null @@ -1,34 +0,0 @@ -package designPatternExtensions; - -import models.objectOrientedTransfer.*; - -//https://github.com/iluwatar/java-design-patterns/tree/master/proxy -//WizardTowerProxyで行っている人数制御がない - -public class Proxy { - - public static DataTransferDesign create() throws IllegalRelationException { - ObjectNode ivoryTower = new ObjectNode("IvoryTower"); - ObjectNode client = new ObjectNode("Client"); - ObjectNode data = new ObjectNode("Wizard"); - - Relation transferRelation = new Relation(client, ivoryTower, MultiplicityValue.OneToOne); - DataTransferContext context = new DataTransferContext( - new java.util.ArrayList<>(), transferRelation, data, "wizard", PushPullValue.PUSH - ); - - DataTransferDesign design = new DataTransferDesign(context); - - ObjectNode proxy = new ObjectNode("WizardTowerProxy"); - MediatorInsertion mi = new MediatorInsertion(client, ivoryTower, proxy); - design.addMediatorInsertion(mi); - - InterfaceNode wizardTower = new InterfaceNode(proxy, "WizardTower"); - DependencyInversion di = new DependencyInversion(proxy, wizardTower, client); - design.addDependencyInversion(di); - DependencyInversion di2 = new DependencyInversion(ivoryTower, wizardTower); - design.addDependencyInversion(di2); - - return design; - } -} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/Singleton.java b/src/main/java/designPatternExtensions/Singleton.java deleted file mode 100644 index 83b43a9..0000000 --- a/src/main/java/designPatternExtensions/Singleton.java +++ /dev/null @@ -1,23 +0,0 @@ -package designPatternExtensions; - -import models.objectOrientedTransfer.*; - -import java.util.ArrayList; - -//メモ -//https://github.com/iluwatar/java-design-patterns/tree/master/singleton - -public class Singleton { - public static DataTransferDesign create() throws IllegalRelationException { - ObjectNode client = new ObjectNode("Client"); - ObjectNode enumIvoryTower = new ObjectNode("EnumIvoryTower"); - ObjectNode data = new ObjectNode("data"); - - Relation transferRelation = new Relation(enumIvoryTower, client, MultiplicityValue.OneToOne); - DataTransferContext context = new DataTransferContext( - new ArrayList<>(), transferRelation, data, "data", PushPullValue.PULL - ); - - return new DataTransferDesign(context); - } -} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/State.java b/src/main/java/designPatternExtensions/State.java deleted file mode 100644 index b1290a6..0000000 --- a/src/main/java/designPatternExtensions/State.java +++ /dev/null @@ -1,37 +0,0 @@ -package designPatternExtensions; - -import models.objectOrientedTransfer.*; - -import java.util.ArrayList; -import java.util.List; - -//メモ -//https://github.com/iluwatar/java-design-patterns/tree/master/state - -public class State { - - public static DataTransferDesign create() throws IllegalRelationException { - List srcEdges = new ArrayList<>(); - List dstEdges = new ArrayList<>(); - ObjectNode main = new ObjectNode("Main"); - ObjectNode mammoth = new ObjectNode("Mammoth"); - ObjectNode state = new ObjectNode("PeacefulState"); - ObjectNode data = new ObjectNode("data"); - srcEdges.add(new ReferenceEdge(main, mammoth, "mammoth")); - dstEdges.add(new ReferenceEdge(main, state, "state", "Integer")); - - List relations = new ArrayList<>(); - relations.add(new Relation(main, dstEdges, MultiplicityValue.OneToOne)); - Relation transferRelation = new Relation(srcEdges, dstEdges, MultiplicityValue.OneToOne); - - DataTransferContext context = new DataTransferContext( - relations, transferRelation, data, "data", PushPullValue.PUSH); - - DataTransferDesign design = new DataTransferDesign(context); - - DependencyInversion di = new DependencyInversion(state, new InterfaceNode(state, "State"), mammoth); - design.addDependencyInversion(di); - - return design; - } -} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/Strategy.java b/src/main/java/designPatternExtensions/Strategy.java deleted file mode 100644 index b58a238..0000000 --- a/src/main/java/designPatternExtensions/Strategy.java +++ /dev/null @@ -1,36 +0,0 @@ -package designPatternExtensions; - -import models.objectOrientedTransfer.*; - -import java.util.ArrayList; -import java.util.List; - -//https://github.com/iluwatar/java-design-patterns/tree/master/strategy -//同じ役割の実装クラスを複数用意できない(メソッドが空になる?) - -public class Strategy { - - public static DataTransferDesign create() throws IllegalRelationException { - List srcEdges = new ArrayList<>(); - List dstEdges = new ArrayList<>(); - ObjectNode main = new ObjectNode("Main"); - ObjectNode dragonSlayer = new ObjectNode("DragonSlayer"); - ObjectNode meleeStrategy = new ObjectNode("MeleeStrategy"); - ObjectNode data = new ObjectNode("BattleExecute"); - srcEdges.add(new ReferenceEdge(main, dragonSlayer, "dragonSlayer")); - dstEdges.add(new ReferenceEdge(main, meleeStrategy, "meleeStrategy", "Integer")); - List relations = new ArrayList<>(); - relations.add(new Relation(main, dstEdges, MultiplicityValue.OneToOne)); - Relation transferRelation = new Relation(srcEdges, dstEdges, MultiplicityValue.OneToOne); - DataTransferContext context = new DataTransferContext(relations, transferRelation, data, "battleExecute", PushPullValue.PUSH); - DataTransferDesign design = new DataTransferDesign(context); - - DependencyInversion di = new DependencyInversion( - meleeStrategy, new InterfaceNode(meleeStrategy, "DragonSlayingStrategy"), dragonSlayer - ); - design.addDependencyInversion(di); - - return design; - } - -} diff --git a/src/main/java/designPatternExtensions/TemplateMethod.java b/src/main/java/designPatternExtensions/TemplateMethod.java deleted file mode 100644 index 941d974..0000000 --- a/src/main/java/designPatternExtensions/TemplateMethod.java +++ /dev/null @@ -1,41 +0,0 @@ -package designPatternExtensions; - -import models.objectOrientedTransfer.*; - -import java.util.ArrayList; -import java.util.List; - -//メモ -//https://github.com/iluwatar/java-design-patterns/tree/master/template-method - -public class TemplateMethod { - - public static DataTransferDesign create() throws IllegalRelationException { - List srcEdges = new ArrayList<>(); - List dstEdges = new ArrayList<>(); - ObjectNode main = new ObjectNode("Main"); - ObjectNode halflingThief = new ObjectNode("HalflingThief"); - ObjectNode subtleMethod = new ObjectNode("SubtleMethod"); - ObjectNode data = new ObjectNode("data"); - - srcEdges.add(new ReferenceEdge(main, halflingThief, "halflingThief")); - dstEdges.add(new ReferenceEdge(main, subtleMethod, "method", "Integer")); - - List relations = new ArrayList<>(); - relations.add(new Relation(main, dstEdges, MultiplicityValue.OneToOne)); - Relation transferRelation = new Relation(srcEdges, dstEdges, MultiplicityValue.OneToOne); - - DataTransferContext context = new DataTransferContext( - relations, transferRelation, data, "data", PushPullValue.PUSH - ); - - DataTransferDesign design = new DataTransferDesign(context); - - DependencyInversion di = new DependencyInversion( - subtleMethod, new InterfaceNode(subtleMethod, "StealingMethod"), halflingThief - ); - design.addDependencyInversion(di); - - return design; - } -} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/Visitor.java b/src/main/java/designPatternExtensions/Visitor.java deleted file mode 100644 index 58a2e97..0000000 --- a/src/main/java/designPatternExtensions/Visitor.java +++ /dev/null @@ -1,46 +0,0 @@ -package designPatternExtensions; - -//メモ -//https://github.com/iluwatar/java-design-patterns/tree/master/visitor -//Commander->Sergent(Children) 1:多の転送ができないため不可能 -//制御の委譲をできるようにする必要がある(自分の作業) - -import models.objectOrientedTransfer.*; - -import java.util.ArrayList; -import java.util.List; - -public class Visitor { - - public static DataTransferDesign create() throws IllegalRelationException { - List srcEdges = new ArrayList<>(); - List dstEdges = new ArrayList<>(); - ObjectNode commander = new ObjectNode("Commander"); - ObjectNode sergent = new ObjectNode("Sergent"); - ObjectNode soldier = new ObjectNode("Soldier"); - ObjectNode client = new ObjectNode("Client"); - ObjectNode main = new ObjectNode("Main"); - ObjectNode visitor = new ObjectNode("SoldierVisitor"); - - ReferenceEdge srcEdge = new ReferenceEdge(commander, sergent, "children", "Integer"); - srcEdges.add(srcEdge); - srcEdge = new ReferenceEdge(sergent, soldier, "children", "Integer"); - srcEdges.add(srcEdge); - ReferenceEdge dstEdge = new ReferenceEdge(main, client, "client"); - dstEdges.add(dstEdge); - - Relation transferRelation = new Relation(srcEdges, dstEdges, MultiplicityValue.OneToOne); - DataTransferContext context = new DataTransferContext( - new ArrayList<>(), transferRelation, visitor, "visitor", PushPullValue.PULL - ); - - DataTransferDesign design = new DataTransferDesign(context); - - DependencyInversion di = new DependencyInversion( - visitor, new InterfaceNode(visitor, "UnitVisitor"), commander - ); - design.addDependencyInversion(di); - - return design; - } -} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/AbstractFactory.java b/src/main/java/designPatternExtensions/designPattern/AbstractFactory.java new file mode 100644 index 0000000..d5bafc0 --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/AbstractFactory.java @@ -0,0 +1,31 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.*; +import models.objectOrientedTransfer.*; +import parser.ModelLoader; + +//https://github.com/iluwatar/java-design-patterns/tree/master/abstract-factory +//App -> ConcreteKingdomFactory -> ConcreteCastle + +public class AbstractFactory implements DesignPattern { + + public DataTransferDesign create() throws IllegalRelationException { + DataTransferDesign design = ModelLoader.load("models/designPattern/AbstractFactory.Json"); + ObjectNode concreteCastle = design.getTransferContext().getSrcFirstResource(); + ObjectNode app = design.getTransferContext().getDstFirstResource(); + + ObjectNode concreteKingdomFactory = new ObjectNode("ConcreteKingdomFactory"); + MediatorInsertion mi = new MediatorInsertion(app, concreteCastle, concreteKingdomFactory); + design.addMediatorInsertion(mi); + + DependencyInversion di1 = new DependencyInversion( + concreteKingdomFactory, new InterfaceNode(concreteKingdomFactory, "KingdomFactory")); + design.addDependencyInversion(di1); + + DependencyInversion di2 = new DependencyInversion( + concreteCastle, new InterfaceNode(concreteCastle, "Castle")); + design.addDependencyInversion(di2); + + return design; + } +} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Adapter.java b/src/main/java/designPatternExtensions/designPattern/Adapter.java new file mode 100644 index 0000000..cb0802e --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Adapter.java @@ -0,0 +1,26 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; +import designPatternExtensions.MediatorInsertion; +import models.objectOrientedTransfer.*; +import parser.ModelLoader; + +public class Adapter implements DesignPattern { + + public DataTransferDesign create() throws IllegalRelationException { + DataTransferDesign design = ModelLoader.load("models/designPattern/Adapter.Json"); + ObjectNode fishingBoat = design.getTransferContext().getSrcFirstResource(); + ObjectNode captain = design.getTransferContext().getDstFirstResource(); + + ObjectNode adapter = new ObjectNode("FishingBoatAdapter"); + MediatorInsertion mi = new MediatorInsertion(captain, fishingBoat, adapter); + design.addMediatorInsertion(mi); + + DependencyInversion di = new DependencyInversion( + adapter, new InterfaceNode(adapter, "RowingBoat")); + design.addDependencyInversion(di); + + return design; + } +} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Bridge.java b/src/main/java/designPatternExtensions/designPattern/Bridge.java new file mode 100644 index 0000000..466f2fb --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Bridge.java @@ -0,0 +1,28 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; +import models.objectOrientedTransfer.*; +import parser.ModelLoader; + +import java.util.ArrayList; + +//メモ +//https://github.com/iluwatar/java-design-patterns/tree/master/bridge + +public class Bridge implements DesignPattern { + + public DataTransferDesign create() throws IllegalRelationException { + DataTransferDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); + ObjectNode concreteEnchant = design.getTransferContext().getSrcFirstResource(); + ObjectNode concreteWeapon = design.getTransferContext().getDstFirstResource(); + + DependencyInversion di1 = new DependencyInversion(concreteWeapon, new InterfaceNode(concreteWeapon, "Weapon")); + design.addDependencyInversion(di1); + + DependencyInversion di2 = new DependencyInversion(concreteEnchant, new InterfaceNode(concreteEnchant, "Enchantment")); + design.addDependencyInversion(di2); + + return design; + } +} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Builder.java b/src/main/java/designPatternExtensions/designPattern/Builder.java new file mode 100644 index 0000000..fd9b223 --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Builder.java @@ -0,0 +1,26 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.MediatorInsertion; +import models.objectOrientedTransfer.*; +import parser.ModelLoader; + +import java.util.ArrayList; + +//メモ +//https://github.com/iluwatar/java-design-patterns/tree/master/builder +//staticがないとnew Hero().new Builder(...)のような形になり、Builderとして成立しない +//なんならメソッドチェーンもない + +public class Builder implements DesignPattern { + + public DataTransferDesign create() throws IllegalRelationException { + DataTransferDesign design = ModelLoader.load("models/designPattern/Builder.Json"); + ObjectNode builder = design.getTransferContext().getSrcFirstResource(); + ObjectNode main = design.getTransferContext().getDstFirstResource(); + + MediatorInsertion mi = new MediatorInsertion(main, builder, new ObjectNode("Hero")); + design.addMediatorInsertion(mi); + + return design; + } +} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Command.java b/src/main/java/designPatternExtensions/designPattern/Command.java new file mode 100644 index 0000000..6d77ccd --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Command.java @@ -0,0 +1,23 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; +import designPatternExtensions.MediatorInsertion; +import models.objectOrientedTransfer.*; +import parser.ModelLoader; + +//メモ +//https://github.com/iluwatar/java-design-patterns/tree/master/command +//Stackで状態を元に戻したり、やり直したりする +//Mainで制御の移譲を行う必要あり? + + public class Command implements DesignPattern { + + public DataTransferDesign create() throws IllegalRelationException { + DataTransferDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); + ObjectNode wizard = design.getTransferContext().getSrcFirstResource(); + ObjectNode goblin = design.getTransferContext().getDstFirstResource(); + + return design; + } + } \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Decorator.java b/src/main/java/designPatternExtensions/designPattern/Decorator.java new file mode 100644 index 0000000..9d5c549 --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Decorator.java @@ -0,0 +1,31 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; +import designPatternExtensions.MediatorInsertion; +import models.objectOrientedTransfer.*; +import parser.ModelLoader; + +//https://github.com/iluwatar/java-design-patterns/tree/master/decorator +//SimpleTrollを用いてClubbedTrollを作成しないとDecoratorとは言えない? + +public class Decorator implements DesignPattern { + public DataTransferDesign create() throws IllegalRelationException { + DataTransferDesign design = ModelLoader.load("models/designPattern/Decorator.Json"); + ObjectNode simpleTroll = design.getTransferContext().getSrcFirstResource(); + ObjectNode client = design.getTransferContext().getDstFirstResource(); + + ObjectNode clubbedTroll = new ObjectNode("ClubbedTroll"); + MediatorInsertion mi = new MediatorInsertion(client, simpleTroll, clubbedTroll); + design.addMediatorInsertion(mi); + + InterfaceNode troll = new InterfaceNode(clubbedTroll, "Troll"); + DependencyInversion di1 = new DependencyInversion(clubbedTroll, troll); + design.addDependencyInversion(di1); + + DependencyInversion di2 = new DependencyInversion(simpleTroll, troll); + design.addDependencyInversion(di2); + + return design; + } +} diff --git a/src/main/java/designPatternExtensions/designPattern/DesignPattern.java b/src/main/java/designPatternExtensions/designPattern/DesignPattern.java new file mode 100644 index 0000000..99bca0e --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/DesignPattern.java @@ -0,0 +1,8 @@ +package designPatternExtensions.designPattern; + +import models.objectOrientedTransfer.DataTransferDesign; +import models.objectOrientedTransfer.IllegalRelationException; + +public interface DesignPattern { + DataTransferDesign create() throws IllegalRelationException; +} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Iterator.java b/src/main/java/designPatternExtensions/designPattern/Iterator.java new file mode 100644 index 0000000..bd5eb17 --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Iterator.java @@ -0,0 +1,32 @@ +package designPatternExtensions.designPattern; +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; +import designPatternExtensions.MediatorInsertion; +import models.objectOrientedTransfer.*; +import parser.ModelLoader; + +import java.util.ArrayList; +//メモ +//中身の構造を隠したまま、アイテムのタイプをifで回さなくても順番にデータを取り出す +// +//https://github.com/iluwatar/java-design-patterns/tree/master/iterator + + +public class Iterator implements DesignPattern { + + public DataTransferDesign create() throws IllegalRelationException { + DataTransferDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); + ObjectNode treasureChest = design.getTransferContext().getSrcFirstResource(); + ObjectNode client = design.getTransferContext().getDstFirstResource(); + + ObjectNode iterator = new ObjectNode("TreasureChestItemIterator"); + MediatorInsertion mi = new MediatorInsertion(client, treasureChest, iterator); + design.addMediatorInsertion(mi); + + DependencyInversion di = new DependencyInversion( + iterator, new InterfaceNode(iterator, "Iterator")); + design.addDependencyInversion(di); + + return design; + } +} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Memento.java b/src/main/java/designPatternExtensions/designPattern/Memento.java new file mode 100644 index 0000000..19b03f2 --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Memento.java @@ -0,0 +1,36 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; +import designPatternExtensions.MediatorInsertion; +import models.objectOrientedTransfer.*; + +import java.util.ArrayList; + +//https://github.com/iluwatar/java-design-patterns/tree/master/memento +//複数のデータ転送をまとめて扱えるようにしないとできない → 一方向でもできればいったんOK + +public class Memento implements DesignPattern{ + public DataTransferDesign create() throws IllegalRelationException { + ObjectNode star = new ObjectNode("Star"); + ObjectNode states = new ObjectNode("States"); + ObjectNode starMementoInternal = new ObjectNode("StarMementoInternal"); + + Relation transferRelation = new Relation(star, states, MultiplicityValue.OneToOne); + DataTransferContext context = new DataTransferContext( + new ArrayList<>(), transferRelation, starMementoInternal, "memento", PushPullValue.PULL + ); + + DataTransferDesign design = new DataTransferDesign(context); + + MediatorInsertion client = new MediatorInsertion(star, states, new ObjectNode("Client")); + design.addMediatorInsertion(client); + + DependencyInversion di = new DependencyInversion( + starMementoInternal, new InterfaceNode(starMementoInternal, "StarMemento"), states + ); + design.addDependencyInversion(di); + + return design; + } +} diff --git a/src/main/java/designPatternExtensions/designPattern/Observer.java b/src/main/java/designPatternExtensions/designPattern/Observer.java new file mode 100644 index 0000000..996d54e --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Observer.java @@ -0,0 +1,58 @@ +package designPatternExtensions.designPattern; +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; +import models.objectOrientedTransfer.*; +import java.util.ArrayList; +import java.util.List; + +//https://github.com/iluwatar/java-design-patterns/tree/master/observer +//依存性の逆転構造は再現できているが、OneToManyが使えないから再現できない? +// SubjectがObserverを記憶し(ManyToOne?PULL?)→DesignCraftが最初に登録してるものとする +// Clientから更新されたときに、Observerに通知する(OneToMany?PUSH?)→これが正解 +// + +public class Observer implements DesignPattern{ + public DataTransferDesign create() throws IllegalRelationException { + ObjectNode weather = new ObjectNode("Weather"); + ObjectNode orcs = new ObjectNode("Orcs"); + ObjectNode hobbits = new ObjectNode("Hobbits"); + ObjectNode data = new ObjectNode("WeatherType"); + + Relation transferRelation = new Relation(weather, orcs, MultiplicityValue.OneToOne); + DataTransferContext context = new DataTransferContext( + new ArrayList<>(), transferRelation, data, "currentWeather", PushPullValue.PUSH + ); + + DataTransferDesign design = new DataTransferDesign(context); + + DependencyInversion di1 = new DependencyInversion(orcs, new InterfaceNode(orcs, "WeatherObserver"), weather); + DependencyInversion di2 = new DependencyInversion(hobbits, new InterfaceNode(hobbits, "WeatherObserver"), weather); + design.addDependencyInversion(di1); + design.addDependencyInversion(di2); + + return design; + } +} + +//public class Observer { +// public static DataTransferDesign create() throws IllegalRelationException { +// ObjectNode weather = new ObjectNode("Weather"); +// ObjectNode orcs = new ObjectNode("Orcs"); +// ObjectNode hobbits = new ObjectNode("Hobbits"); +// ObjectNode data = new ObjectNode("WeatherType"); +// +// Relation transferRelation = new Relation(weather, orcs, MultiplicityValue.OneToOne); +// DataTransferContext context = new DataTransferContext( +// new ArrayList<>(), transferRelation, data, "currentWeather", PushPullValue.PUSH +// ); +// +// DataTransferDesign design = new DataTransferDesign(context); +// +// DependencyInversion di1 = new DependencyInversion(orcs, new InterfaceNode(orcs, "WeatherObserver"), weather); +// DependencyInversion di2 = new DependencyInversion(hobbits, new InterfaceNode(hobbits, "WeatherObserver"), weather); +// design.addDependencyInversion(di1); +// design.addDependencyInversion(di2); +// +// return design; +// } +//} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Prototype.java b/src/main/java/designPatternExtensions/designPattern/Prototype.java new file mode 100644 index 0000000..f6066ee --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Prototype.java @@ -0,0 +1,32 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; +import models.objectOrientedTransfer.*; + +import java.util.ArrayList; + +//メモ +//https://github.com/iluwatar/java-design-patterns/tree/master/prototype + +public class Prototype implements DesignPattern{ + public DataTransferDesign create() throws IllegalRelationException { + ObjectNode heroFactoryImpl = new ObjectNode("HeroFactoryImpl"); + ObjectNode client = new ObjectNode("Client"); + ObjectNode beast = new ObjectNode("Beast"); + + Relation transferRelation = new Relation(heroFactoryImpl, client, MultiplicityValue.OneToOne); + DataTransferContext context = new DataTransferContext( + new ArrayList<>(), transferRelation, beast, "beast", PushPullValue.PULL + ); + + DataTransferDesign design = new DataTransferDesign(context); + + DependencyInversion di = new DependencyInversion( + heroFactoryImpl, new InterfaceNode(heroFactoryImpl, "HeroFactory"), client + ); + design.addDependencyInversion(di); + + return design; + } +} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Proxy.java b/src/main/java/designPatternExtensions/designPattern/Proxy.java new file mode 100644 index 0000000..c70a13d --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Proxy.java @@ -0,0 +1,30 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; +import designPatternExtensions.MediatorInsertion; +import models.objectOrientedTransfer.*; +import parser.ModelLoader; + +//https://github.com/iluwatar/java-design-patterns/tree/master/proxy + +public class Proxy implements DesignPattern{ + + public DataTransferDesign create() throws IllegalRelationException { + DataTransferDesign design = ModelLoader.load("models/designPattern/Proxy.Json"); + ObjectNode client = design.getTransferContext().getSrcFirstResource(); + ObjectNode ivoryTower = design.getTransferContext().getDstFirstResource(); + + ObjectNode proxy = new ObjectNode("WizardTowerProxy"); + MediatorInsertion mi = new MediatorInsertion(client, ivoryTower, proxy); + design.addMediatorInsertion(mi); + + InterfaceNode wizardTower = new InterfaceNode(proxy, "WizardTower"); + DependencyInversion di = new DependencyInversion(proxy, wizardTower); + design.addDependencyInversion(di); + DependencyInversion di2 = new DependencyInversion(ivoryTower, wizardTower); + design.addDependencyInversion(di2); + + return design; + } +} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Singleton.java b/src/main/java/designPatternExtensions/designPattern/Singleton.java new file mode 100644 index 0000000..1138454 --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Singleton.java @@ -0,0 +1,23 @@ +package designPatternExtensions.designPattern; + +import models.objectOrientedTransfer.*; + +import java.util.ArrayList; + +//メモ +//https://github.com/iluwatar/java-design-patterns/tree/master/singleton + +public class Singleton implements DesignPattern{ + public DataTransferDesign create() throws IllegalRelationException { + ObjectNode client = new ObjectNode("Client"); + ObjectNode enumIvoryTower = new ObjectNode("EnumIvoryTower"); + ObjectNode data = new ObjectNode("data"); + + Relation transferRelation = new Relation(enumIvoryTower, client, MultiplicityValue.OneToOne); + DataTransferContext context = new DataTransferContext( + new ArrayList<>(), transferRelation, data, "data", PushPullValue.PULL + ); + + return new DataTransferDesign(context); + } +} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/State.java b/src/main/java/designPatternExtensions/designPattern/State.java new file mode 100644 index 0000000..eb618ac --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/State.java @@ -0,0 +1,27 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.*; +import models.objectOrientedTransfer.*; +import parser.ModelLoader; + +//https://github.com/iluwatar/java-design-patterns/tree/master/state +// Mammoth内でConcreteStateのMapを持てたら再現できたといえる? + +public class State implements DesignPattern { + + public DataTransferDesign create() throws IllegalRelationException { + DataTransferDesign design = ModelLoader.load("models/designPattern/State.Json"); + ObjectNode main = design.getTransferContext().getSrcFirstResource(); + ObjectNode concreteState = design.getTransferContext().getDstFirstResource(); + + MediatorInsertion mi = new MediatorInsertion( + main, concreteState, new ObjectNode("Mammoth")); + design.addMediatorInsertion(mi); + + DependencyInversion di = new DependencyInversion( + concreteState, new InterfaceNode(concreteState, "State")); + design.addDependencyInversion(di); + + return design; + } +} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Strategy.java b/src/main/java/designPatternExtensions/designPattern/Strategy.java new file mode 100644 index 0000000..478a0f3 --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Strategy.java @@ -0,0 +1,54 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; +import models.objectOrientedTransfer.*; +import parser.ModelLoader; + +import java.util.ArrayList; +import java.util.List; + +//https://github.com/iluwatar/java-design-patterns/tree/master/strategy +//同じ役割の実装クラスを複数用意できない-> ConcreteStrategy + +public class Strategy implements DesignPattern{ + + public DataTransferDesign create() throws IllegalRelationException { + DataTransferDesign design = ModelLoader.load("models/designPattern/Strategy.Json"); + ObjectNode dragonSlayer = design.getTransferContext().getSrcFirstResource(); + ObjectNode concreteStrategy = (ObjectNode) design.getTransferContext().getDstResource().get(0).getDestination(); + + DependencyInversion di = new DependencyInversion( + concreteStrategy, new InterfaceNode(concreteStrategy, "DragonSlayingStrategy")); + design.addDependencyInversion(di); + + return design; + } +} + +//public class Strategy implements DesignPattern{ +// +// public DataTransferDesign create() throws IllegalRelationException { +// List srcEdges = new ArrayList<>(); +// List dstEdges = new ArrayList<>(); +// ObjectNode main = new ObjectNode("Main"); +// ObjectNode dragonSlayer = new ObjectNode("DragonSlayer"); +// ObjectNode meleeStrategy = new ObjectNode("MeleeStrategy"); +// ObjectNode data = new ObjectNode("BattleExecute"); +// srcEdges.add(new ReferenceEdge(main, dragonSlayer, "dragonSlayer")); +// dstEdges.add(new ReferenceEdge(main, meleeStrategy, "meleeStrategy", "Integer")); +// List relations = new ArrayList<>(); +// relations.add(new Relation(main, dstEdges, MultiplicityValue.OneToOne)); +// Relation transferRelation = new Relation(srcEdges, dstEdges, MultiplicityValue.OneToOne); +// DataTransferContext context = new DataTransferContext(relations, transferRelation, data, "battleExecute", PushPullValue.PUSH); +// DataTransferDesign design = new DataTransferDesign(context); +// +// DependencyInversion di = new DependencyInversion( +// meleeStrategy, new InterfaceNode(meleeStrategy, "DragonSlayingStrategy"), dragonSlayer +// ); +// design.addDependencyInversion(di); +// +// return design; +// } +// +//} diff --git a/src/main/java/designPatternExtensions/designPattern/TemplateMethod.java b/src/main/java/designPatternExtensions/designPattern/TemplateMethod.java new file mode 100644 index 0000000..c3cc290 --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/TemplateMethod.java @@ -0,0 +1,43 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; +import models.objectOrientedTransfer.*; + +import java.util.ArrayList; +import java.util.List; + +//メモ +//https://github.com/iluwatar/java-design-patterns/tree/master/template-method + +public class TemplateMethod implements DesignPattern { + + public DataTransferDesign create() throws IllegalRelationException { + List srcEdges = new ArrayList<>(); + List dstEdges = new ArrayList<>(); + ObjectNode main = new ObjectNode("Main"); + ObjectNode halflingThief = new ObjectNode("HalflingThief"); + ObjectNode subtleMethod = new ObjectNode("SubtleMethod"); + ObjectNode data = new ObjectNode("data"); + + srcEdges.add(new ReferenceEdge(main, halflingThief, "halflingThief")); + dstEdges.add(new ReferenceEdge(main, subtleMethod, "method", "Integer")); + + List relations = new ArrayList<>(); + relations.add(new Relation(main, dstEdges, MultiplicityValue.OneToOne)); + Relation transferRelation = new Relation(srcEdges, dstEdges, MultiplicityValue.OneToOne); + + DataTransferContext context = new DataTransferContext( + relations, transferRelation, data, "data", PushPullValue.PUSH + ); + + DataTransferDesign design = new DataTransferDesign(context); + + DependencyInversion di = new DependencyInversion( + subtleMethod, new InterfaceNode(subtleMethod, "StealingMethod"), halflingThief + ); + design.addDependencyInversion(di); + + return design; + } +} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Visitor.java b/src/main/java/designPatternExtensions/designPattern/Visitor.java new file mode 100644 index 0000000..4007d72 --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Visitor.java @@ -0,0 +1,48 @@ +package designPatternExtensions.designPattern; + +//メモ +//https://github.com/iluwatar/java-design-patterns/tree/master/visitor +//Commander->Sergent(Children) 1:多の転送ができないため不可能 +//制御の委譲をできるようにする必要がある(自分の作業) + +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; +import models.objectOrientedTransfer.*; + +import java.util.ArrayList; +import java.util.List; + +public class Visitor implements DesignPattern{ + + public DataTransferDesign create() throws IllegalRelationException { + List srcEdges = new ArrayList<>(); + List dstEdges = new ArrayList<>(); + ObjectNode commander = new ObjectNode("Commander"); + ObjectNode sergent = new ObjectNode("Sergent"); + ObjectNode soldier = new ObjectNode("Soldier"); + ObjectNode client = new ObjectNode("Client"); + ObjectNode main = new ObjectNode("Main"); + ObjectNode visitor = new ObjectNode("SoldierVisitor"); + + ReferenceEdge srcEdge = new ReferenceEdge(commander, sergent, "children", "Integer"); + srcEdges.add(srcEdge); + srcEdge = new ReferenceEdge(sergent, soldier, "children", "Integer"); + srcEdges.add(srcEdge); + ReferenceEdge dstEdge = new ReferenceEdge(main, client, "client"); + dstEdges.add(dstEdge); + + Relation transferRelation = new Relation(srcEdges, dstEdges, MultiplicityValue.OneToOne); + DataTransferContext context = new DataTransferContext( + new ArrayList<>(), transferRelation, visitor, "visitor", PushPullValue.PULL + ); + + DataTransferDesign design = new DataTransferDesign(context); + + DependencyInversion di = new DependencyInversion( + visitor, new InterfaceNode(visitor, "UnitVisitor"), commander + ); + design.addDependencyInversion(di); + + return design; + } +} \ No newline at end of file diff --git a/src/test/java/parser/PatternTest.java b/src/test/java/parser/PatternTest.java new file mode 100644 index 0000000..31e54ab --- /dev/null +++ b/src/test/java/parser/PatternTest.java @@ -0,0 +1,35 @@ +package parser; + +import designPatternExtensions.designPattern.*; +import generators.ASTGenerator; +import org.junit.jupiter.api.Test; + +public class PatternTest { + + @Test void abstractFactory() throws Exception { run(new AbstractFactory()); } + @Test void adapter() throws Exception { run(new Adapter()); } + @Test void bridge() throws Exception { run(new Bridge()); } + @Test void builder() throws Exception { run(new Builder()); } +// @Test void chainOfResponsibility() throws Exception { run(new ChainOfResponsibility()); } + @Test void command() throws Exception { run(new Command()); } + @Test void decorator() throws Exception { run(new Decorator()); } +// @Test void facade() throws Exception { run(new Facade()); } +// @Test void factoryMethod() throws Exception { run(new FactoryMethod()); } +// @Test void interpreter() throws Exception { run(new Interpreter()); } + @Test void iterator() throws Exception { run(new Iterator()); } +// @Test void mediator() throws Exception { run(new Mediator()); } + @Test void memento() throws Exception { run(new Memento()); } + @Test void observer() throws Exception { run(new Observer()); } + @Test void prototype() throws Exception { run(new Prototype()); } + @Test void proxy() throws Exception { run(new Proxy()); } + @Test void singleton() throws Exception { run(new Singleton()); } + @Test void state() throws Exception { run(new State()); } + @Test void strategy() throws Exception { run(new Strategy()); } + @Test void templateMethod() throws Exception { run(new TemplateMethod()); } + @Test void visitor() throws Exception { run(new Visitor()); } + + private void run(DesignPattern pattern) throws Exception { + System.out.println(pattern.getClass().getSimpleName()); + System.out.println(ASTGenerator.generate(pattern.create())); + } +} \ No newline at end of file diff --git a/src/test/java/parser/TestParser.java b/src/test/java/parser/TestParser.java index c950e0c..517daea 100644 --- a/src/test/java/parser/TestParser.java +++ b/src/test/java/parser/TestParser.java @@ -18,7 +18,9 @@ @Test void testCustomerManagement(){ - File file = new File("models/CustomerManagement.Json"); + //File file = new File("models/CustomerManagement.Json"); + File file = new File("models/designPattern/Adapter.Json"); + try { Parser parser = new Parser(new BufferedReader(new FileReader(file))); Value jsonValue = parser.getValue();