diff --git a/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/classadapter/Adaptee.java b/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/classadapter/Adaptee.java new file mode 100644 index 0000000..5283ed1 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/classadapter/Adaptee.java @@ -0,0 +1,19 @@ +package top.fjy8018.designpattern.pattern.structural.adapter.classadapter; + +import lombok.extern.slf4j.Slf4j; + +/** + * 适配器模式: + * 类适配器模式 + * 被适配对象 + * + * @author F嘉阳 + * @date 2018-10-09 16:04 + */ +@Slf4j +public class Adaptee { + + public void adapteeRequest() { + log.info("adapteeRequest..."); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/classadapter/Adapter.java b/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/classadapter/Adapter.java new file mode 100644 index 0000000..9ce8c99 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/classadapter/Adapter.java @@ -0,0 +1,15 @@ +package top.fjy8018.designpattern.pattern.structural.adapter.classadapter; + +/** + * 适配器模式:将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作 + * + * @author F嘉阳 + * @date 2018-10-09 16:07 + */ +public class Adapter extends Adaptee implements Target { + @Override + public void request() { + // ... 新增业务逻辑 + super.adapteeRequest(); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/classadapter/ConcreteTarget.java b/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/classadapter/ConcreteTarget.java new file mode 100644 index 0000000..2ef1f11 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/classadapter/ConcreteTarget.java @@ -0,0 +1,18 @@ +package top.fjy8018.designpattern.pattern.structural.adapter.classadapter; + +import lombok.extern.slf4j.Slf4j; + +/** + * 目标类具体实现 + * + * @author F嘉阳 + * @date 2018-10-09 16:06 + */ +@Slf4j +public class ConcreteTarget implements Target { + + @Override + public void request() { + log.info("ConcreteTarget..."); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/classadapter/Target.java b/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/classadapter/Target.java new file mode 100644 index 0000000..62ac084 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/classadapter/Target.java @@ -0,0 +1,11 @@ +package top.fjy8018.designpattern.pattern.structural.adapter.classadapter; + +/** + * 目标类实现接口 + * + * @author F嘉阳 + * @date 2018-10-09 16:05 + */ +public interface Target { + void request(); +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/objectadapter/Adaptee.java b/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/objectadapter/Adaptee.java new file mode 100644 index 0000000..a37550e --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/objectadapter/Adaptee.java @@ -0,0 +1,19 @@ +package top.fjy8018.designpattern.pattern.structural.adapter.objectadapter; + +import lombok.extern.slf4j.Slf4j; + +/** + * 适配器模式: + * 类适配器模式 + * 被适配对象 + * + * @author F嘉阳 + * @date 2018-10-09 16:04 + */ +@Slf4j +public class Adaptee { + + public void adapteeRequest() { + log.info("adapteeRequest..."); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/objectadapter/Adapter.java b/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/objectadapter/Adapter.java new file mode 100644 index 0000000..2c0b02c --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/objectadapter/Adapter.java @@ -0,0 +1,21 @@ +package top.fjy8018.designpattern.pattern.structural.adapter.objectadapter; + +/** + * 适配器模式:将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作 + * + * @author F嘉阳 + * @date 2018-10-09 16:07 + */ +public class Adapter implements Target { + + /** + * 将继承改成组合方式,降低耦合度 + */ + private Adaptee adaptee = new Adaptee(); + + @Override + public void request() { + // ... 新增业务逻辑 + adaptee.adapteeRequest(); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/objectadapter/ConcreteTarget.java b/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/objectadapter/ConcreteTarget.java new file mode 100644 index 0000000..92f32e3 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/objectadapter/ConcreteTarget.java @@ -0,0 +1,18 @@ +package top.fjy8018.designpattern.pattern.structural.adapter.objectadapter; + +import lombok.extern.slf4j.Slf4j; + +/** + * 目标类具体实现 + * + * @author F嘉阳 + * @date 2018-10-09 16:06 + */ +@Slf4j +public class ConcreteTarget implements Target { + + @Override + public void request() { + log.info("ConcreteTarget..."); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/objectadapter/Target.java b/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/objectadapter/Target.java new file mode 100644 index 0000000..a2c5d9e --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/objectadapter/Target.java @@ -0,0 +1,11 @@ +package top.fjy8018.designpattern.pattern.structural.adapter.objectadapter; + +/** + * 目标类实现接口 + * + * @author F嘉阳 + * @date 2018-10-09 16:05 + */ +public interface Target { + void request(); +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/poweradapter/AC220.java b/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/poweradapter/AC220.java new file mode 100644 index 0000000..cd4e352 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/poweradapter/AC220.java @@ -0,0 +1,16 @@ +package top.fjy8018.designpattern.pattern.structural.adapter.poweradapter; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author F嘉阳 + * @date 2018-10-09 16:24 + */ +@Slf4j +public class AC220 { + public int output() { + int output = 220; + log.info(this.getClass().getSimpleName() + "output:" + output + "V"); + return output; + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/poweradapter/Adapter.java b/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/poweradapter/Adapter.java new file mode 100644 index 0000000..2de4d67 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/poweradapter/Adapter.java @@ -0,0 +1,22 @@ +package top.fjy8018.designpattern.pattern.structural.adapter.poweradapter; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author F嘉阳 + * @date 2018-10-09 16:25 + */ +@Slf4j +public class Adapter implements DC5 { + + private AC220 ac220 = new AC220(); + + @Override + public int output() { + int output220 = ac220.output(); + // 变压器模拟 + int output5 = output220 / 44; + log.info("{} 输入{}V,输出{}V", this.getClass().getSimpleName(), output220, output5); + return output5; + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/poweradapter/DC5.java b/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/poweradapter/DC5.java new file mode 100644 index 0000000..3e4ad51 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/structural/adapter/poweradapter/DC5.java @@ -0,0 +1,9 @@ +package top.fjy8018.designpattern.pattern.structural.adapter.poweradapter; + +/** + * @author F嘉阳 + * @date 2018-10-09 16:25 + */ +public interface DC5 { + int output(); +} diff --git a/src/test/java/top/fjy8018/designpattern/pattern/structural/adapter/classadapter/AdapterTest.java b/src/test/java/top/fjy8018/designpattern/pattern/structural/adapter/classadapter/AdapterTest.java new file mode 100644 index 0000000..500e071 --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/pattern/structural/adapter/classadapter/AdapterTest.java @@ -0,0 +1,22 @@ +package top.fjy8018.designpattern.pattern.structural.adapter.classadapter; + +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +@Slf4j +class AdapterTest { + + /** + * 通过适配器实现调用新接口将具体实现转发到旧类中实现 + */ + @Test + void request() { + Target newTarget = new ConcreteTarget(); + newTarget.request(); + + Target adapter = new Adapter(); + adapter.request(); + } +} \ No newline at end of file diff --git a/src/test/java/top/fjy8018/designpattern/pattern/structural/adapter/objectadapter/AdapterTest.java b/src/test/java/top/fjy8018/designpattern/pattern/structural/adapter/objectadapter/AdapterTest.java new file mode 100644 index 0000000..52bdf9b --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/pattern/structural/adapter/objectadapter/AdapterTest.java @@ -0,0 +1,15 @@ +package top.fjy8018.designpattern.pattern.structural.adapter.objectadapter; + +import org.junit.jupiter.api.Test; + +class AdapterTest { + + @Test + void request() { + Target newTarget = new ConcreteTarget(); + newTarget.request(); + + Target adapter = new Adapter(); + adapter.request(); + } +} \ No newline at end of file diff --git a/src/test/java/top/fjy8018/designpattern/pattern/structural/adapter/poweradapter/AdapterTest.java b/src/test/java/top/fjy8018/designpattern/pattern/structural/adapter/poweradapter/AdapterTest.java new file mode 100644 index 0000000..4dab790 --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/pattern/structural/adapter/poweradapter/AdapterTest.java @@ -0,0 +1,17 @@ +package top.fjy8018.designpattern.pattern.structural.adapter.poweradapter; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class AdapterTest { + + @Test + void output() { + AC220 ac220 = new AC220(); + ac220.output(); + + DC5 dc5 = new Adapter(); + dc5.output(); + } +} \ No newline at end of file