diff --git a/models/designPattern/Composite.Json b/models/designPattern/Composite.Json new file mode 100644 index 0000000..bd4ba93 --- /dev/null +++ b/models/designPattern/Composite.Json @@ -0,0 +1,70 @@ +{ + "name": "Composite", + "contexts": [ + { + "relations": [], + "transfer": { + "src": "Messenger.Sentence", + "dst": "Main", + "data": { + "type": "Data", + "name": "data" + }, + "style": "PULL", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "Sentence.{Word}", + "dst": "Messenger", + "data": { + "type": "Data", + "name": "data" + }, + "style": "PULL", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "Word", + "dst": "Sentence", + "data": { + "type": "Data", + "name": "data" + }, + "style": "PULL", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "Letter", + "dst": "Word", + "data": { + "type": "char", + "name": "char" + }, + "style": "PULL", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "Letter", + "dst": "LetterComposite.{LetterComposite}", + "data": { + "type": "Data", + "name": "data" + }, + "style": "PULL", + "multiplicity": "1:1" + } + } + ] +} \ No newline at end of file diff --git a/models/designPattern/Factory-method.Json b/models/designPattern/Factory-method.Json new file mode 100644 index 0000000..fc3a44e --- /dev/null +++ b/models/designPattern/Factory-method.Json @@ -0,0 +1,18 @@ +{ + "name": "Factory-method", + "contexts": [ + { + "relations": [], + "transfer": { + "src": "ConcreteBlacksmith", + "dst": "Main", + "data": { + "type": "Weapon", + "name": "weapon" + }, + "style": "PULL", + "multiplicity": "1:1" + } + } + ] +} \ No newline at end of file diff --git a/models/designPattern/Interpreter.Json b/models/designPattern/Interpreter.Json new file mode 100644 index 0000000..fa365af --- /dev/null +++ b/models/designPattern/Interpreter.Json @@ -0,0 +1,32 @@ +{ + "name": "Interpreter", + "contexts": [ + { + "relations": [], + "transfer": { + "src": "Main", + "dst": "ConcreteExpression", + "data": { + "type": "Data", + "name": "data" + }, + "style": "PUSH", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "ConcreteExpression", + "dst": "ConcreteExpression", + "data": { + "type": "Data", + "name": "data" + }, + "style": "PULL", + "multiplicity": "1:1" + } + } + + ] +} \ No newline at end of file diff --git a/models/designPattern/Observer.Json b/models/designPattern/Observer.Json new file mode 100644 index 0000000..bd194d0 --- /dev/null +++ b/models/designPattern/Observer.Json @@ -0,0 +1,31 @@ +{ + "name": "Observer", + "contexts": [ + { + "relations": [], + "transfer": { + "src": "Main.Weather", + "dst": "ConcreteObserver", + "data": { + "type": "Data", + "name": "data" + }, + "style": "PUSH", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "Main", + "dst": "Weather", + "data": { + "type": "ConcreteObserver", + "name": "concreteObserver" + }, + "style": "PUSH", + "multiplicity": "1:1" + } + } + ] +} \ No newline at end of file diff --git a/models/designPattern/Prototype.Json b/models/designPattern/Prototype.Json new file mode 100644 index 0000000..4110e45 --- /dev/null +++ b/models/designPattern/Prototype.Json @@ -0,0 +1,31 @@ +{ + "name": "Prototype", + "contexts": [ + { + "relations": [], + "transfer": { + "src": "FactoryImpl", + "dst": "Main", + "data": { + "type": "OrcConcreteHero", + "name": "orcConcreteHero" + }, + "style": "PULL", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "FactoryImpl.OrcConcreteHero", + "dst": "Main", + "data": { + "type": "Weapon", + "name": "weapon" + }, + "style": "PULL", + "multiplicity": "1:1" + } + } + ] +} \ No newline at end of file diff --git a/models/designPattern/Visitor.Json b/models/designPattern/Visitor.Json new file mode 100644 index 0000000..e2c297d --- /dev/null +++ b/models/designPattern/Visitor.Json @@ -0,0 +1,18 @@ +{ + "name": "Visitor", + "contexts": [ + { + "relations": [], + "transfer": { + "src": "Commander.{Sergent}.{Soldier}", + "dst": "Main.Client", + "data": { + "type": "SoldierVisitor", + "name": "visitor" + }, + "style": "PULL", + "multiplicity": "1:1" + } + } + ] +} \ No newline at end of file diff --git a/models/designPattern/Visitor@Editing.Json b/models/designPattern/Visitor@Editing.Json deleted file mode 100644 index 88ccd09..0000000 --- a/models/designPattern/Visitor@Editing.Json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "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/designPatternExtensions/designPattern/Composite.java b/src/main/java/designPatternExtensions/designPattern/Composite.java new file mode 100644 index 0000000..7975f82 --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Composite.java @@ -0,0 +1,36 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; +import designPatternExtensions.ModelLoader; +import models.deltaAlgebra.ObjectNode; +import models.objectOrientedTransfer.DataTransferContext; +import models.objectOrientedTransfer.DataTransferDesign; +import models.objectOrientedTransfer.IllegalRelationException; + +//メモ +//https://github.com/iluwatar/java-design-patterns/tree/master/composite + +public class Composite implements DesignPattern{ + public DataTransferDesign create() throws IllegalRelationException { + DataTransferDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); + DataTransferContext dtc = design.getTransferContexts().getFirst(); + ObjectNode sentence = (ObjectNode) dtc.getSrcResource().getEdges().get(0).getDestination(); + ObjectNode main = dtc.getDstFirstResource(); + DataTransferContext dtc3 = design.getTransferContexts().get(3); + ObjectNode letter = dtc3.getSrcFirstResource(); + ObjectNode word = dtc3.getDstFirstResource(); + + InterfaceNode LetterComposite = new InterfaceNode(sentence, "LetterComposite"); + DependencyInversion di = new DependencyInversion(sentence, LetterComposite, main); + design.addDependencyInversion(di); + + DependencyInversion di2 = new DependencyInversion(letter, LetterComposite, letter); + design.addDependencyInversion(di2); + + DependencyInversion di3 = new DependencyInversion(word, LetterComposite, word); + design.addDependencyInversion(di3); + + return design; + } +} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Factory_method.java b/src/main/java/designPatternExtensions/designPattern/Factory_method.java new file mode 100644 index 0000000..77e9773 --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Factory_method.java @@ -0,0 +1,27 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; +import designPatternExtensions.ModelLoader; +import models.deltaAlgebra.ObjectNode; +import models.objectOrientedTransfer.DataTransferContext; +import models.objectOrientedTransfer.DataTransferDesign; +import models.objectOrientedTransfer.IllegalRelationException; + +//メモ +//https://github.com/iluwatar/java-design-patterns/tree/master/prototype + +public class Factory_method implements DesignPattern{ + public DataTransferDesign create() throws IllegalRelationException { + DataTransferDesign design = ModelLoader.load("models/designPattern/Factory-method.Json"); + DataTransferContext dtc = design.getTransferContexts().getFirst(); + ObjectNode concreteBlacksmith = dtc.getSrcFirstResource(); + ObjectNode main = dtc.getDstFirstResource(); + + InterfaceNode blackSmith = new InterfaceNode(concreteBlacksmith, "Blacksmith"); + DependencyInversion di = new DependencyInversion(concreteBlacksmith, blackSmith); + design.addDependencyInversion(di); + + return design; + } +} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Interpreter.java b/src/main/java/designPatternExtensions/designPattern/Interpreter.java new file mode 100644 index 0000000..2b317a3 --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Interpreter.java @@ -0,0 +1,27 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; +import designPatternExtensions.ModelLoader; +import models.deltaAlgebra.ObjectNode; +import models.objectOrientedTransfer.DataTransferContext; +import models.objectOrientedTransfer.DataTransferDesign; +import models.objectOrientedTransfer.IllegalRelationException; + +//メモ +//https://github.com/iluwatar/java-design-patterns/tree/master/prototype + +public class Interpreter implements DesignPattern{ + public DataTransferDesign create() throws IllegalRelationException { + DataTransferDesign design = ModelLoader.load("models/designPattern/Interpreter.Json"); + DataTransferContext dtc = design.getTransferContexts().getFirst(); + ObjectNode main = dtc.getSrcFirstResource(); + ObjectNode concreteExpression = dtc.getDstFirstResource(); + + InterfaceNode expression = new InterfaceNode(concreteExpression, "Expression"); + DependencyInversion di = new DependencyInversion(concreteExpression, expression); + design.addDependencyInversion(di); + + return design; + } +} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Observer.java b/src/main/java/designPatternExtensions/designPattern/Observer.java index 327fe7f..4d2ab90 100644 --- a/src/main/java/designPatternExtensions/designPattern/Observer.java +++ b/src/main/java/designPatternExtensions/designPattern/Observer.java @@ -1,6 +1,7 @@ package designPatternExtensions.designPattern; import designPatternExtensions.DependencyInversion; import designPatternExtensions.InterfaceNode; +import designPatternExtensions.ModelLoader; import models.deltaAlgebra.MultiplicityValue; import models.deltaAlgebra.ObjectNode; import models.objectOrientedTransfer.*; @@ -14,46 +15,14 @@ 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"); + DataTransferDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); + DataTransferContext dtc = design.getTransferContexts().getFirst(); + ObjectNode weather = (ObjectNode) dtc.getSrcResource().getEdge(0).getDestination(); + ObjectNode concreteObserver = dtc.getDstFirstResource(); - 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); + DependencyInversion di1 = new DependencyInversion(concreteObserver, new InterfaceNode(concreteObserver, "WeatherObserver")); 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 +} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Prototype.java b/src/main/java/designPatternExtensions/designPattern/Prototype.java index cf18de0..540cca5 100644 --- a/src/main/java/designPatternExtensions/designPattern/Prototype.java +++ b/src/main/java/designPatternExtensions/designPattern/Prototype.java @@ -2,6 +2,7 @@ import designPatternExtensions.DependencyInversion; import designPatternExtensions.InterfaceNode; +import designPatternExtensions.ModelLoader; import models.deltaAlgebra.MultiplicityValue; import models.deltaAlgebra.ObjectNode; import models.objectOrientedTransfer.*; @@ -13,22 +14,62 @@ 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"); + DataTransferDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); + DataTransferContext dtc = design.getTransferContexts().getFirst(); + ObjectNode factoryImpl = dtc.getSrcFirstResource(); + ObjectNode orcConcreteHero = dtc.getDataType(); - 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 - ); + //factoryImplとorcConcreteHeroの依存関係のみ逆転 + InterfaceNode concreteHero = new InterfaceNode(orcConcreteHero, "ConcreteHero"); + DependencyInversion di = new DependencyInversion(orcConcreteHero, concreteHero, factoryImpl); design.addDependencyInversion(di); + InterfaceNode heroFactory = new InterfaceNode(factoryImpl, "HeroFactory"); + DependencyInversion di2 = new DependencyInversion(factoryImpl, heroFactory); + design.addDependencyInversion(di2); + + InterfaceNode prototype = new InterfaceNode(concreteHero, "Prototype"); + DependencyInversion di3 = new DependencyInversion(concreteHero, prototype); + design.addDependencyInversion(di3); + return design; } -} \ No newline at end of file +} +/*{ + "name": "Prototype", + "contexts": [ + { + "relations": [ + { + "src": "Main", + "dst": "FactoryImpl", + "multiplicity": "1:1" + } + ], + "transfer": { + "src": "Main.{OrcConcreteHero}", + "dst": "FactoryImpl", + "data": { + "type": "OrcConcreteHero", + "name": "orcConcreteHero" + }, + "style": "PUSH", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "FactoryImpl.OrcConcreteHero", + "dst": "Main", + "data": { + "type": "Weapon", + "name": "weapon" + }, + "style": "PULL", + "multiplicity": "1:1" + } + } + ] +} +*/ \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Visitor.java b/src/main/java/designPatternExtensions/designPattern/Visitor.java index d23a19d..0288a30 100644 --- a/src/main/java/designPatternExtensions/designPattern/Visitor.java +++ b/src/main/java/designPatternExtensions/designPattern/Visitor.java @@ -7,6 +7,7 @@ import designPatternExtensions.DependencyInversion; import designPatternExtensions.InterfaceNode; +import designPatternExtensions.ModelLoader; import models.deltaAlgebra.MultiplicityValue; import models.deltaAlgebra.ObjectNode; import models.deltaAlgebra.ReferenceEdge; @@ -18,28 +19,10 @@ 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); + DataTransferDesign design = ModelLoader.load("models/designPattern/Visitor.Json"); + DataTransferContext dtc = design.getTransferContexts().getFirst(); + ObjectNode visitor = dtc.getDataType(); + ObjectNode commander = dtc.getSrcFirstResource(); DependencyInversion di = new DependencyInversion( visitor, new InterfaceNode(visitor, "UnitVisitor"), commander diff --git a/src/test/java/parser/PatternTest.java b/src/test/java/parser/PatternTest.java index dd89978..27b46e4 100644 --- a/src/test/java/parser/PatternTest.java +++ b/src/test/java/parser/PatternTest.java @@ -12,11 +12,12 @@ @Test void builder() throws Exception { run(new Builder()); } @Test void chainOfResponsibility() throws Exception { run(new Chain_of_Responsibility()); } @Test void command() throws Exception { run(new Command()); } + @Test void composite() throws Exception { run(new Composite()); } @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 factoryMethod() throws Exception { run(new Factory_method()); } @Test void flyweight() throws Exception { run(new Flyweight()); } -// @Test void interpreter() throws Exception { run(new Interpreter()); } + @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()); }