课本实例:男人和女人
关键在于人只分为了男人和女人,性别的分类是稳定的,所以可以在状态类中增加‘男人反应’和‘女人反应两个方法’,方法个数稳定,不容易发生变化。 而‘人’类中只有一个方法‘接受’,获得相应的状态。对象结构类针对不同的‘状态’遍历‘男人’和‘女人’,得到不同的反应。
public abstract class Person { //人的抽象类
//接受
public abstract void Accept(Action visitor); //获得状态对象
}
public class Man extends Person { //男人类
@Override
public void Accept(Action visitor) {
visitor.getManConclusion(this);
}
}
public class Women extends Person { //女人类
@Override
public void Accept(Action visitor) {
visitor.getWomenConclusion(this);
}
}
public abstract class Action { //状态的抽象类
//得到男人的结论或反应
public abstract void getManConclusion(Man concreteElementA);
//得到女人的结论或反应
public abstract void getWomenConclusion(Women concreteElementA);
}
public class Success extends Action{//具体状态类:成功
@Override
public void getManConclusion(Man concreteElementA) {
System.out.println("男人成功时,背后多半有一个伟大的女人");
}
@Override
public void getWomenConclusion(Women concreteElementA) {
System.out.println("女人成功时,背后多半有一个不成功的男人");
}
}
public class Failing extends Action{ //具体状态类:失败
@Override
public void getManConclusion(Man concreteElementA) {
System.out.println("男人失败时,闷头喝酒,谁也不用劝。");
}
@Override
public void getWomenConclusion(Women concreteElementA) {
System.out.println("女人失败时,眼泪汪汪,谁也劝不了。");
}
}
import java.util.ArrayList;
import java.util.List;
public class ObjectStructure { //对象结构
private List<Person> elements = new ArrayList<Person>();
public void Attach(Person pp) { //增加
elements.add(pp);
}
public void Detach(Person pp) { //移除
elements.remove(pp);
}
public void Display(Action vistor) { //查看显示
for (Person e : elements) { //针对不同状态遍历男人与女人,得到不同的反应
e.Accept(vistor);
}
}
}
public class Client {
public static void main(String[] args) {
//在对象结构中加入要对比的男人与女人
ObjectStructure o = new ObjectStructure();
o.Attach(new Man());
o.Attach(new Women());
//成功时的反应
Success v1 = new Success();
o.Display(v1);
//失败时的反应
Failing v2 = new Failing();
o.Display(v2);
}
}
UML:
拓展实例:
扩展客户管理的功能(CRM)。
(1)个人客户、企业客户。
(2)提出服务申请、客户价值分析、客户对产品偏好分析等。