装饰模式

来源:互联网 发布:宠物用品软件 编辑:程序博客网 时间:2024/06/05 20:28

简单的手机(SimplePhone)再接收到来电的时候,会发出声音提醒主人;而现在我们需要为该手机添加一项功能,在接收来电的时候,除了声音还能产生振动(JarPhone);还可以得到更高级的手机(ComplexPhone),来电的时候,它不仅能够发声,产生振动,而且还有灯光在闪烁提示。现在用装饰模式来模拟一下手机的升级过程,要求绘制类图并编程实现。

UML图:

这里写图片描述

(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>

运行结果:
这里写图片描述

原创粉丝点击