简单的手机(SimplePhone)再接收到来电的时候,会发出声音提醒主人;而现在我们需要为该手机添加一项功能,在接收来电的时候,除了声音还能产生振动(JarPhone);还可以得到更高级的手机(ComplexPhone),来电的时候,它不仅能够发声,产生振动,而且还有灯光在闪烁提示。现在用装饰模式来模拟一下手机的升级过程,要求绘制类图并编程实现。
(1)Role类
public class Role {
private String sex;
private String face;
private String clothing;
private String hairStyle;
public void setSex(final String sex) {
this.sex = sex;
}
public void setFace(final String face) {
this.face = face;
}
public void setClothing(final String clothing) {
this.clothing = clothing;
}
public void setHairStyle(final String hairStyle) {
this.hairStyle = hairStyle;
}
public String getSex() {
return this.sex;
}
public String getFace() {
return this.face;
}
public String getClothing() {
return this.clothing;
}
public String getHairStyle() {
return this.hairStyle;
}
}
(2)RoleBuilder类
public abstract class RoleBuilder {
protected Role role = new Role();
public abstract void buildeSex();
public abstract void buildeFace();
public abstract void buildeClothing();
public abstract void buildeHairStyle();
public Role getRole() {
return role;
}
}
(3)BuilderMan类
public class BuilderMan extends RoleBuilder {
public void buildeSex() {
role.setSex("male");
}
public void buildeFace() {
role.setFace("圆脸");
}
public void buildeClothing() {
role.setClothing("西装");
}
public void buildeHairStyle() {
role.setHairStyle("短发");
}
}
(4)BuilderWoman类
public class BuilderWoman extends RoleBuilder {
public void buildeSex() {
role.setSex("female");
}
public void buildeFace() {
role.setFace("圆脸");
}
public void buildeClothing() {
role.setClothing("短裙");
}
public void buildeHairStyle() {
role.setHairStyle("卷发");
}
}
(5) RoleController类
public class RoleController {
private RoleBuilder roleBuilder;
public void setRoleBuilder(final RoleBuilder roleBuilder) {
this.roleBuilder = roleBuilder;
}
public Role construct() {
roleBuilder.buildeSex();
roleBuilder.buildeFace();
roleBuilder.buildeClothing();
roleBuilder.buildeHairStyle();
return roleBuilder.getRole();
}
}
(6)XMLUtil类
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
public class XMLUtil {
public static Object getBean() {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("config.xml"));
NodeList nodeList = doc.getElementsByTagName("className");
Node node = nodeList.item(0).getFirstChild();
String cname = node.getNodeValue();
System.out.println(cname);
Class c = Class.forName(cname);
Object object = c.newInstance();
System.out.println(c.getName());
return object;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
(7)Client类
public class Client {
public static void main(final String[] a) {
RoleBuilder roleBuilder = (RoleBuilder) XMLUtil.getBean();
RoleController roleController = new RoleController();
roleController.setRoleBuilder(roleBuilder);
Role role = roleController.construct();
System.out.println("创建人物角色:");
System.out.println(role.getSex());
System.out.println(role.getFace());
System.out.println(role.getClothing());
System.out.println(role.getHairStyle());
}
}
(8)config.xml
<?xml version="1.0" encoding="UTF-8"?>
<config>
<className>BuilderWoman</className>
</config>