您的位置:首页 > 编程语言 > Java开发

Java 23种设计模式之访问者模式

2018-01-02 23:05 495 查看

1. 概念

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。


2. 创建访问者的抽象类

**
* @author zlc
* @created 2017/12/24
* 状态的抽象类
*/
public abstract class Action {

public abstract void getManConclusion(Man man);

public abstract void getWomanConclusion(Woman man);
}


3. 创建Element的抽象类

/**
* @author zlc
* @created 2017/12/24
* 人的抽象类
*/
public abstract class Person {

public abstract void accept(Action action);

}


4.创建具体访问者类

1.
/**
* @author zlc
* @created 2017/12/24
*/
public class Success extends Action{

@Override
public void getManConclusion(Man man) {
System.out.println("男人成功时,背后都有一个伟大的女人");
}

@Override
public void getWomanConclusion(Woman man) {
System.out.println("女人成功时,背后大多有一个不成功的男人");
}

}

2.
/**
* @author zlc
* @created 2017/12/24
*/
public class Failing extends Action{

@Override
public void getManConclusion(Man man) {
System.out.println("男人失败时,闷头喝酒,谁也不用劝");
}

@Override
public void getWomanConclusion(Woman man) {
System.out.println("女人失败时,眼泪汪汪,谁也劝不了");
}

}

3.
/**
* @author zlc
* @created 2017/12/24
*/
public class Loving extends Action{

@Override
public void getManConclusion(Man man) {
System.out.println("男人恋爱时,凡事不懂也要装懂");
}

@Override
public void getWomanConclusion(Woman man) {
System.out.println("女人恋爱时,遇事懂也装作不懂");
}

}


5.创建Element的具体实现类

/**
* @author zlc
* @created 2017/12/24
*/
public class Man extends Person{

@Override
public void accept(Action action) {
action.getManConclusion(this);
}
}

/**
* @author zlc
* @created 2017/12/24
*/
public class Woman extends Person{

@Override
public void accept(Action action) {
action.getWomanConclusion(this);
}
}


6. 创建ObjectStructure类 枚举它的元素

/**
* @author zlc
* @created 2017/12/24
*/
public class ObjectStructure {

private List<Person> peoples = new ArrayList<>();

//增加
public void attach(Person p){
peoples.add(p);
}

//移除
public void detach(Person p){
peoples.remove(p);
}

//查看显示
public void display(Action action){
for (Person p: peoples) {
p.accept(action);
}
System.out.println("----------------");
}
}


7. 测试类

@org.junit.Test
public void test(){

ObjectStructure o = new ObjectStructure();
o.attach(new Man());
o.attach(new Woman());

//成功
Success success = new Success();
o.display(success);

//失败
Failing failing = new Failing();
o.display(failing);

//恋爱
Loving loving = new Loving();
o.display(loving);

//结婚
Marriage marriage = new Marriage();
o.display(marriage);
}


8.小结

访问者模式目的是要把处理从数据结构分离出来,增加新的操作很容易,因为增加新的操作意味着增加一个新的访问者。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: