老鸟飞过哈
最近和女友很不和,特此用段模式写下自己的状况
我和女友总是为遇到同样的状况而意见不合
比如最近我总于有空余的时间,我想利用这点时间学习下ps,她非要我和她去苏州玩╮(╯▽╰)╭,其实我是很懒的一个人,不喜欢到处乱窜,她却说偶没情调╮(╯▽╰)╭
言归正传
先来看段比较糟糕的代码
伪代码自己随便写了
public Boy :Person{
public override getResult(){
if(action=="用时间"){
println("学习ps");
}else if (action=="有钱"){
println("给老婆买衣服");
}else if....
}
}
这段代码充斥着if else
下面来改写这段代码 将“有时间” “有钱” 等这些状态 抽象出来,并通过两次分派处理将算法还是交给这些状态
//定义的算法(访问者)
public abstract class Action {
//这里的方法个数必须是固定的,不能扩展,如果扩展了,就违背了开放封闭原则,这样设计的目的主要是扩展的是增加它的子类
public abstract void getResult(Boy boy);
public abstract void getResult(Girl girl);
}
下面是具体实现
//访问者
public class HaveMoney extends Action{
public void getResult(Boy boy) {
System.out.println("给老婆买件衣服");
}
public void getResult(Girl girl) {
System.out.println("给自己买件衣服");
}
}
//访问者
public class HaveSparetime extends Action {
public void getResult(Boy boy) {
System.out.println("听音乐,学习ps,把老婆P的漂亮点,嘿嘿");
}
public void getResult(Girl girl) {
System.out.println("独自去旅游,那个书呆子没救了,哦也");
}
}
//访问者
public class Weekend extends Action{
public void getResult(Boy boy) {
System.out.println("⊙﹏⊙b汗 周末睡觉呗");
}
public void getResult(Girl girl) {
System.out.println("O(∩_∩)O哈哈~ 周末逛超市呗");
}
}
下面的Boy 和 Girl 这两个结构是不能变的
public class Boy extends Person{
//这里有两次派送,首先客户端将状态(访问者)传给Boy 完成第一次派送,
//然后将Boy自由传给状态(访问者)完成第二次派送,
//就是说处理的具体算法是在访问者中完成的,Boy 和 Girl 的结构是定下来不变的。
public void accept(Action action) {
action.getResult(this);
}
}
public class Girl extends Person {
public void accept(Action action) {
action.getResult(this);
}
}
下面是对象结构的上下文,对boy和girl 对不同状态的反应
public class PersonContext {
private List<Person> Persons = new ArrayList<Person>();
//增加
public void attach(Person person){
Persons.add(person);
}
//移除
public void detach(Person person){
Persons.remove(person);
}
//显示
public void display(Action action){
for(Person p:Persons){
p.accept(action);
}
}
//客户端
public static void main(String[]args){
PersonContext personContext = new PersonContext();
personContext.attach(new Boy());
personContext.attach(new Girl());
//有钱时候,两人干嘛
Action haveSparetime = new HaveSparetime();
personContext.display(haveSparetime);
}
}
听音乐,学习ps,把老婆P的漂亮点
独自去旅游,那个书呆子没救了,嘿嘿