Java设计模式三

本文内容来自慕课网系列课程,记录下学习的内容。

Java设计模式三

工厂模式

什么情况下适合工厂模式?

  • 有一组类似的对象需要创建
  • 在编码时不能预见需要创建哪种类的实例
  • 系统需要考虑扩展性,不应依赖于产品类实例如何被创建、组合和表达的细节

工厂模式应用

本例子的内容是,创建发型
首先定义一个发型接口HairInterface

/*
 * 发型接口
 */
public interface HairInterface {

    public void draw();

}

然后定义两个实现HairInterface接口的类,LeftHairRightHair

public class LeftHair implements HairInterface {

    @Override
    public void draw() {
        System.out.println("左偏分发型");
    }

}

然后创建一个工厂类HairFactory

/*
 * 发型工厂
 */
public class HairFactory {

    /**
     * 根据类型来创建对象
     * @param key
     * @return
     */
    public HairInterface getHair(String key) {
        if ("left".equals(key)) {
            return new LeftHair();
        }else if("right".equals(key)){
            return new RightHair();
        }
        return null;
    }

}

这样就可以通过HairFactorygetHair方法来创建发型了

这样做还有确定,假设还有别的发型,则在getHair方法中还要进行多个判断。

根据类的名称来创建对象

/**
 * 根据类的名称来创建对象
 * @return
 */
public HairInterface getHairByClass(String className) {
    try {
        HairInterface hair = (HairInterface) Class.forName(className).newInstance();
        return hair;
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    return null;
}

抽象工厂模式

常见应用:

1.JDBC
JDBC
2.spring beanfactory

责任链模式

责任链模式

这里写图片描述

在责任链模式中,作为请求接受者的多个对象通过对其后继的引用而连接起来形成一条链,请求在这条链上传递,直到链上某一个接收者处理这个请求。每个接受者都可以选择自行处理请求或是向后继传递请求。

这里以销售为例
首先创建一个抽象类PriceHandler,价格处理人,负责处理客户折扣请求

/*
 * 价格处理人,负责处理客户折扣请求
 */
public abstract class PriceHandler {

    /**
     * 直接后继,用于传递请求
     */
    protected PriceHandler successor;

    public void setSuccessor(PriceHandler successor) {
        this.successor = successor;
    }

    /*
     * 处理折扣申请
     */
    public abstract void processDiscount(float discount);

}

创建如下类:

  • Sales销售人员,可以批准5%以内的折扣
  • Manager销售经理,可以批准30%以内的折扣
  • Director销售总监,可以批准40%以内的折扣
  • CEO,可以批准55%以内的折扣

Sales类如下,其它基本类似:

/*
 * 销售人员,可以批准5%以内的折扣
 */
public class Sales extends PriceHandler{

    @Override
    public void processDiscount(float discount) {
        if (discount <= 0.05) {
            System.out.format("%s批准了折扣:%.2f", this.getClass().getName(), discount);
        }else{
            successor.processDiscount(discount);
        }
    }

}

CEO类如下:

/*
 * CEO,可以批准55%以内的折扣
 */
public class CEO extends PriceHandler {

    @Override
    public void processDiscount(float discount) {
        if (discount <= 0.55) {
            System.out.format("%s批准了折扣:%.2f", this.getClass().getName(), discount);
        }else{
            System.out.format("%s拒绝了折扣:%.2f", this.getClass().getName(), discount);
        }
    }

}

创建一个Customer类,请求折扣

/*
 * 客户类,请求折扣
 */
public class Customer {

    private PriceHandler priceHandler;
    public void setPriceHandler(PriceHandler priceHandler) {
        this.priceHandler = priceHandler;
    }

    public void requestDiscount(float discount) {
        priceHandler.processDiscount(discount);
    }

    public static void main(String[] args) {
        Customer customer = new Customer();
        customer.setPriceHandler(PriceHandler.createPriceHandler());
        customer.requestDiscount(0.96f);
    }

}

PriceHandler中添加一个工程方法

public static PriceHandler createPriceHandler() {
    PriceHandler sales = new Sales();
    PriceHandler manager = new Manager();
    PriceHandler director = new Director();
    PriceHandler ceo = new CEO();

    sales.setSuccessor(manager);
    manager.setSuccessor(director);
    director.setSuccessor(ceo);

    return sales;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值