diff --git a/src/main/java/com/pancm/design/mediator/MediatorTest.java b/src/main/java/com/pancm/design/mediator/MediatorTest.java new file mode 100644 index 0000000..02c80c4 --- /dev/null +++ b/src/main/java/com/pancm/design/mediator/MediatorTest.java @@ -0,0 +1,126 @@ +package com.pancm.design.mediator; + +/** + * @Title: MediatorTest + * @Description: 中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。 + * 这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。 + * 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 + * @Version:1.0.0 + * @author pancm + * @date 2018年8月8日 + */ +public class MediatorTest { + + public static void main(String[] args) { + + + /* + * 基本角色 + 抽象中介者(Mediator): 。定义了同事对象到中介者对象之间的接口。 + 具体中介者(ConcreteMediator): 实现抽象中介者的方法,它需要知道所有的具体同事类,同时需要从具体的同事类那里接收信息,并且向具体的同事类发送信息。 + 抽象同事类(Colleague): 定义了中介者对象的接口,它只知道中介者而不知道其他的同事对象。 + 具体同事类(ConcreteColleague) : 每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。 + * + */ + + JavaQQqun jq = new JavaQQqun(); + + ZhangSan zs = new ZhangSan("张三", jq); + XuWuJing xwj = new XuWuJing("xuwujing", jq); + jq.setZs(zs); + jq.setXwj(xwj); + + zs.talk("大家好!我是张三!");; + xwj.talk("欢迎你!张三!"); + + + /* + * 优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。 + 缺点:中介者会庞大,变得复杂难以维护。 + */ + + } + +} + + + +//定义一个中介者 QQ群 +interface QQqun { + //提供一个交流的方法 + void exchange(Person person,String message); +} + +//定义一个抽象同事类 +abstract class Person{ + protected String name; + protected QQqun qun; + + Person(String name,QQqun qun){ + this.name = name; + this.qun = qun; + } +} + +class ZhangSan extends Person{ + + ZhangSan(String name, QQqun qun) { + super(name, qun); + } + + void exchange(String message){ + qun.exchange(this,message); + } + + void talk(String message){ + System.out.println(name +"说:" + message); + } +} + +class XuWuJing extends Person{ + + XuWuJing(String name, QQqun qun) { + super(name, qun); + } + + void exchange(String message){ + qun.exchange(this,message); + } + + void talk(String message){ + System.out.println(name +"回应:" + message); + } +} + +//定义一个JavaQQ群 +class JavaQQqun implements QQqun{ + private ZhangSan zs; + private XuWuJing xwj; + + public ZhangSan getZs() { + return zs; + } + + public void setZs(ZhangSan zs) { + this.zs = zs; + } + + public XuWuJing getXwj() { + return xwj; + } + + + public void setXwj(XuWuJing xwj) { + this.xwj = xwj; + } + + + @Override + public void exchange(Person person, String message) { + if(zs.equals(person)){ + zs.talk(message); + }else if(xwj.equals(person)){ + xwj.talk(message); + } + } +} diff --git a/src/main/java/com/pancm/design/mediator/package-info.java b/src/main/java/com/pancm/design/mediator/package-info.java new file mode 100644 index 0000000..599934d --- /dev/null +++ b/src/main/java/com/pancm/design/mediator/package-info.java @@ -0,0 +1,8 @@ +/** +* @Title: package-info +* @Description: 中介者模式 +* @Version:1.0.0 +* @author pancm +* @date 2018年8月8日 +*/ +package com.pancm.design.mediator; \ No newline at end of file diff --git a/src/main/java/com/pancm/design/visitor/VisitorTest.java b/src/main/java/com/pancm/design/visitor/VisitorTest.java new file mode 100644 index 0000000..eec43d3 --- /dev/null +++ b/src/main/java/com/pancm/design/visitor/VisitorTest.java @@ -0,0 +1,150 @@ +package com.pancm.design.visitor; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Title: VisitorTest + * @Description: 访问者模式 + * 访问者模式(VisitorPattern)是对象的行为模式。访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。 + * 核心:主要将数据结构与数据操作分离。 + * @Version:1.0.0 + * @author pancm + * @date 2018年8月8日 + */ +public class VisitorTest { + + public static void main(String[] args) { + + /* + * 基本角色: 1 抽象访问者(Visitor)角色:声明了一个或者多个方法操作,形成所有的具体访问者角色必须实现的接口。 + * + * 2 具体访问者(ConcreteVisitor)角色:实现抽象访问者所声明的接口,也就是抽象访问者所声明的各个访问操作。 + * + * 3 抽象节点(Node)角色:声明一个接受操作,接受一个访问者对象作为一个参数。 + * + * 4 具体节点(ConcreteNode)角色:实现了抽象节点所规定的接受操作。 + * + * 5 结构对象(ObjectStructure)角色:有如下的责任,可以遍历结构中的所有元素;如果需要,提供一个高层次的接口让访问者对象可以访问每一个元素; + + * + */ + + // 创建一个结构对象 + ObjectStructure os = new ObjectStructure(); + // 给结构增加一个节点 + os.add(new Games()); + // 给结构增加一个节点 + os.add(new Photos()); + // 创建一个访问者 + Visitor visitor = new ZhangSan(); + os.action(visitor); + + /* + * 优点: 1、扩展性好,可以在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。 + * 2、符合单一职责原则,通过访问者将无关的行为分离,使职责单一。 + * + * 缺点: 1、违反了迪米特原则,因为具体元素对访问者公布细节。 2、违反了依赖倒置原则,依赖了具体类,没有依赖抽象。 + * 3、对象结构变化困难,若对象结构发生了改变,访问者的接口和访问者的实现也都要发生相应的改变。 + * + * + * 使用场景: 1、对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。 + * 2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,也不希望在增加新操作时修改这些类。 + * 注意事项:访问者可以对功能进行统一,可以做报表、UI、拦截器与过滤器。 + * + */ + } + +} + +/* + * 定义一个抽象的角色(游客) + */ +interface Visitor { + // 可以玩游戏 + void visit(Games games); + + // 可以查看图片 + void visit(Photos photos); +} + +class ZhangSan implements Visitor { + @Override + public void visit(Games games) { + games.play(); + } + + @Override + public void visit(Photos photos) { + photos.watch(); + } +} + +/* + * + */ +class LiSi implements Visitor { + @Override + public void visit(Games games) { + games.play(); + } + + @Override + public void visit(Photos photos) { + photos.watch(); + } +} + +/* + * 定义个接受者 + */ +interface Computer { + void accept(Visitor visitor); +} + +class Games implements Computer { + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } + + public void play() { + System.out.println("play lol"); + } +} + +class Photos implements Computer { + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } + + public void watch() { + System.out.println("watch scenery photo"); + } +} + +/* + * 结构对象角色 + */ +class ObjectStructure { + + private List computers = new ArrayList(); + + /** + * 执行方法操作 + */ + public void action(Visitor visitor) { + computers.forEach(c -> { + c.accept(visitor); + }); + + } + + /** + * 添加一个新元素 + */ + public void add(Computer computer) { + computers.add(computer); + } +} diff --git a/src/main/java/com/pancm/design/visitor/package-info.java b/src/main/java/com/pancm/design/visitor/package-info.java new file mode 100644 index 0000000..3a76577 --- /dev/null +++ b/src/main/java/com/pancm/design/visitor/package-info.java @@ -0,0 +1,8 @@ +/** +* @Title: package-info +* @Description: 访问者模式 +* @Version:1.0.0 +* @author pancm +* @date 2018年8月8日 +*/ +package com.pancm.design.visitor; \ No newline at end of file