”访问者模式和中介者模式测试代码“

This commit is contained in:
xuwujing
2018-11-05 22:33:18 +08:00
parent a7eb96b0d0
commit 1c42c1b23d
4 changed files with 292 additions and 0 deletions

View File

@@ -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);
}
}
}

View File

@@ -0,0 +1,8 @@
/**
* @Title: package-info
* @Description: 中介者模式
* @Version:1.0.0
* @author pancm
* @date 2018年8月8日
*/
package com.pancm.design.mediator;

View File

@@ -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<Computer> computers = new ArrayList<Computer>();
/**
* 执行方法操作
*/
public void action(Visitor visitor) {
computers.forEach(c -> {
c.accept(visitor);
});
}
/**
* 添加一个新元素
*/
public void add(Computer computer) {
computers.add(computer);
}
}

View File

@@ -0,0 +1,8 @@
/**
* @Title: package-info
* @Description: 访问者模式
* @Version:1.0.0
* @author pancm
* @date 2018年8月8日
*/
package com.pancm.design.visitor;