您的位置:首页 > 编程语言 > Java开发

Java设计模式三

2017-01-05 14:31 106 查看
本文内容来自慕课网系列课程,记录下学习的内容。

Java设计模式三

工厂模式

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

有一组类似的对象需要创建

在编码时不能预见需要创建哪种类的实例

系统需要考虑扩展性,不应依赖于产品类实例如何被创建、组合和表达的细节

工厂模式应用

本例子的内容是,创建发型

首先定义一个发型接口
HairInterface


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

public void draw();

}


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


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;
}

}


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

这样做还有确定,假设还有别的发型,则在
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



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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java设计模式 java