装饰模式

简单的手机(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>

运行结果:

这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值